1
2
3
4
5
6
7
8
9 """Unit tests for PyMVPA State parent class"""
10
11 import unittest, copy
12
13 import numpy as N
14 from sets import Set
15
16 from mvpa.base import externals
17
18 from mvpa.misc.state import StateVariable, ClassWithCollections, \
19 ParameterCollection, _def_sep
20 from mvpa.misc.param import *
21 from mvpa.misc.exceptions import UnknownStateError
22
23 if __debug__:
24 from mvpa.base import debug
25
28
34
37
42
43
47
48
58
59
61
63 empty = TestClassEmpty()
64 blank = TestClassBlank()
65 blank2 = TestClassBlank()
66
67 self.failUnlessRaises(AttributeError, empty.__getattribute__, 'states')
68
69 self.failUnlessEqual(blank.states.items, {})
70 self.failUnless(blank.states.enabled == [])
71 self.failUnlessRaises(AttributeError, blank.__getattribute__, 'dummy')
72 self.failUnlessRaises(AttributeError, blank.__getattribute__, '_')
73
74
75
76 return
77
78
79 blank._registerState('state1', False)
80 self.failUnless(blank.states == ['state1'])
81
82 self.failUnless(blank.states.isEnabled('state1') == False)
83 self.failUnless(blank.states.enabled == [])
84 self.failUnlessRaises(UnknownStateError, blank.__getattribute__, 'state1')
85
86
87 blank.state1 = 123
88
89 self.failUnlessRaises(UnknownStateError, blank.__getattribute__, 'state1')
90
91
92 blank.states.enable('state1')
93 blank.state1 = 123
94 self.failUnless(blank.state1 == 123)
95
96
97
98 self.failUnless(blank2.states == [])
99 self.failUnlessRaises(AttributeError, blank2.__getattribute__, 'state1')
100
101
103 proper = TestClassProper()
104 proper2 = TestClassProper(enable_states=['state1'], disable_states=['state2'])
105
106
107 proper3 = TestClassProper(enable_states=['all'], disable_states='all')
108
109 self.failUnlessEqual(len(proper3.states.enabled), 0,
110 msg="disable_states should override anything in enable_states")
111
112 proper.state2 = 1000
113 value = proper.state2
114 self.failUnlessEqual(proper.state2, 1000, msg="Simple assignment/retrieval")
115
116 proper.states.disable('state2')
117 proper.state2 = 10000
118 self.failUnlessEqual(proper.state2, 1000, msg="Simple assignment after being disabled")
119
120 proper4 = copy.deepcopy(proper)
121
122 proper.states.reset('state2')
123 self.failUnlessRaises(UnknownStateError, proper.__getattribute__, 'state2')
124 """Must be blank after being reset"""
125
126 self.failUnlessEqual(proper4.state2, 1000,
127 msg="Simple assignment after being reset in original instance")
128
129
130 proper.states.enable(['state2'])
131 self.failUnlessEqual(Set(proper.states.names), Set(['state1', 'state2']))
132 if __debug__ and 'ENFORCE_STATES_ENABLED' in debug.active:
133
134 return
135 self.failUnless(proper.states.enabled == ['state2'])
136
137 self.failUnless(Set(proper2.states.enabled) == Set(['state1']))
138
139 self.failUnlessRaises(AttributeError, proper.__getattribute__, 'state12')
140
141
142 self.failUnlessEqual(proper2.states.listing,
143 ['%sstate1+%s: state1 doc' % (_def_sep, _def_sep),
144 '%sstate2%s: state2 doc' % (_def_sep, _def_sep)])
145
146
147 str_ = str(proper2)
148 self.failUnless(str_.find('2 states:') != -1)
149
150
151 self.failUnless(Set(proper2.states.enabled), Set(['state1']))
152
153 proper2.states.disable("all")
154 self.failUnlessEqual(Set(proper2.states.enabled), Set())
155
156 proper2.states.enable("all")
157 self.failUnlessEqual(len(proper2.states.enabled), 2)
158
159 proper2.state1, proper2.state2 = 1,2
160 self.failUnlessEqual(proper2.state1, 1)
161 self.failUnlessEqual(proper2.state2, 2)
162
163
164 proper2.states.reset('all')
165 self.failUnlessRaises(UnknownStateError, proper2.__getattribute__, 'state1')
166 self.failUnlessRaises(UnknownStateError, proper2.__getattribute__, 'state2')
167
168
170 """Check if we can store/restore set of enabled states"""
171
172 if __debug__ and 'ENFORCE_STATES_ENABLED' in debug.active:
173
174 return
175
176 proper = TestClassProper()
177 enabled_states = proper.states.enabled
178 proper.states.enable('state1')
179
180 self.failUnless(enabled_states != proper.states.enabled,
181 msg="New enabled states should differ from previous")
182
183 self.failUnless(Set(proper.states.enabled) == Set(['state1', 'state2']),
184 msg="Making sure that we enabled all states of interest")
185
186 proper.states.enabled = enabled_states
187 self.failUnless(enabled_states == proper.states.enabled,
188 msg="List of enabled states should return to original one")
189
190
191
192
216
217
219 """
220 Simple test if child gets state variables from the parent as well
221 """
222 proper = TestClassProperChild()
223 self.failUnlessEqual(Set(proper.states.names),
224 Set(['state1', 'state2', 'state4']))
225
226
233
234
235 class S2(ClassWithCollections):
236 v2 = StateVariable(enabled=True, doc="values12 is ...")
237
238 class S1_(S1):
239 pass
240
241 class S1__(S1_):
242 v1__ = StateVariable(enabled=False)
243
244 class S12(S1__, S2):
245 v12 = StateVariable()
246
247 s1, s2, s1_, s1__, s12 = S1(), S2(), S1_(), S1__(), S12()
248
249 self.failUnlessEqual(s1.states.isEnabled("v1"), True)
250 s1.v1 = 12
251 s12.v1 = 120
252 s2.v2 = 100
253
254 self.failUnlessEqual(len(s2.states.listing), 1)
255
256 self.failUnlessEqual(s1.v1, 12)
257 try:
258 tempvalue = s1__.v1__
259 self.fail("Should have puked since values were not enabled yet")
260 except:
261 pass
262
263
265
266 self.failUnlessRaises(TypeError, TestClassParametrized,
267 p2=34, enable_states=['state1'],
268 msg="Should raise an exception if argument doesn't correspond to"
269 "any parameter")
270 a = TestClassParametrized(p1=123, enable_states=['state1'])
271 self.failUnlessEqual(a.p1, 123, msg="We must have assigned value to instance")
272 self.failUnless('state1' in a.states.enabled,
273 msg="state1 must have been enabled")
274
275 if (__debug__ and 'ID_IN_REPR' in debug.active):
276
277 return
278
279
280 a_str = `a`
281 try:
282 import test_state
283 exec "a2=%s" % a_str
284 except Exception, e:
285 self.fail(msg="Failed to generate an instance out of "
286 "representation %s. Got exception: %s" % (a_str, e))
287
288 a2_str = `a2`
289 self.failUnless(a2_str == a_str,
290 msg="Generated object must have the same repr. Got %s and %s" %
291 (a_str, a2_str))
292
293
294 aparams_str = `a.params`
295 try:
296 import test_state
297 exec "aparams2=%s" % aparams_str
298 except Exception, e:
299 self.fail(msg="Failed to generate an instance out of "
300 "representation %s of params. Got exception: %s" % (aparams_str, e))
301
302
305
306
307 if __name__ == '__main__':
308 import runner
309