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 Stateful, StateVariable, Parametrized, \
19 ParameterCollection, _def_sep
20 from mvpa.misc.param import *
21 from mvpa.misc.exceptions import UnknownStateError
22
25
31
34
39
40
44
45
55
56
58
60 empty = TestClassEmpty()
61 blank = TestClassBlank()
62 blank2 = TestClassBlank()
63
64 self.failUnlessRaises(AttributeError, empty.__getattribute__, 'states')
65
66 self.failUnlessEqual(blank.states.items, {})
67 self.failUnless(blank.states.enabled == [])
68 self.failUnlessRaises(AttributeError, blank.__getattribute__, 'dummy')
69 self.failUnlessRaises(AttributeError, blank.__getattribute__, '_')
70
71
72
73 return
74
75
76 blank._registerState('state1', False)
77 self.failUnless(blank.states == ['state1'])
78
79 self.failUnless(blank.states.isEnabled('state1') == False)
80 self.failUnless(blank.states.enabled == [])
81 self.failUnlessRaises(UnknownStateError, blank.__getattribute__, 'state1')
82
83
84 blank.state1 = 123
85
86 self.failUnlessRaises(UnknownStateError, blank.__getattribute__, 'state1')
87
88
89 blank.states.enable('state1')
90 blank.state1 = 123
91 self.failUnless(blank.state1 == 123)
92
93
94
95 self.failUnless(blank2.states == [])
96 self.failUnlessRaises(AttributeError, blank2.__getattribute__, 'state1')
97
98
100 proper = TestClassProper()
101 proper2 = TestClassProper(enable_states=['state1'], disable_states=['state2'])
102
103
104 proper3 = TestClassProper(enable_states=['all'], disable_states='all')
105
106 self.failUnlessEqual(len(proper3.states.enabled), 0,
107 msg="disable_states should override anything in enable_states")
108
109 proper.state2 = 1000
110 value = proper.state2
111 self.failUnlessEqual(proper.state2, 1000, msg="Simple assignment/retrieval")
112
113 proper.states.disable('state2')
114 proper.state2 = 10000
115 self.failUnlessEqual(proper.state2, 1000, msg="Simple assignment after being disabled")
116
117 proper4 = copy.deepcopy(proper)
118
119 proper.states.reset('state2')
120 self.failUnlessRaises(UnknownStateError, proper.__getattribute__, 'state2')
121 """Must be blank after being reset"""
122
123 self.failUnlessEqual(proper4.state2, 1000,
124 msg="Simple assignment after being reset in original instance")
125
126
127 proper.states.enable(['state2'])
128 self.failUnlessEqual(Set(proper.states.names), Set(['state1', 'state2']))
129 self.failUnless(proper.states.enabled == ['state2'])
130
131 self.failUnless(Set(proper2.states.enabled) == Set(['state1']))
132
133 self.failUnlessRaises(AttributeError, proper.__getattribute__, 'state12')
134
135
136 self.failUnlessEqual(proper2.states.listing,
137 ['%sstate1+%s: state1 doc' % (_def_sep, _def_sep),
138 '%sstate2%s: state2 doc' % (_def_sep, _def_sep)])
139
140
141 str_ = str(proper2)
142 self.failUnless(str_.find('2 states:') != -1)
143
144
145 self.failUnless(Set(proper2.states.enabled), Set(['state1']))
146
147 proper2.states.disable("all")
148 self.failUnlessEqual(Set(proper2.states.enabled), Set())
149
150 proper2.states.enable("all")
151 self.failUnlessEqual(len(proper2.states.enabled), 2)
152
153 proper2.state1, proper2.state2 = 1,2
154 self.failUnlessEqual(proper2.state1, 1)
155 self.failUnlessEqual(proper2.state2, 2)
156
157
158 proper2.states.reset('all')
159 self.failUnlessRaises(UnknownStateError, proper2.__getattribute__, 'state1')
160 self.failUnlessRaises(UnknownStateError, proper2.__getattribute__, 'state2')
161
162
164 """Check if we can store/restore set of enabled states"""
165
166 proper = TestClassProper()
167 enabled_states = proper.states.enabled
168 proper.states.enable('state1')
169
170 self.failUnless(enabled_states != proper.states.enabled,
171 msg="New enabled states should differ from previous")
172
173 self.failUnless(Set(proper.states.enabled) == Set(['state1', 'state2']),
174 msg="Making sure that we enabled all states of interest")
175
176 proper.states.enabled = enabled_states
177 self.failUnless(enabled_states == proper.states.enabled,
178 msg="List of enabled states should return to original one")
179
180
181
182
202
203
205 """
206 Simple test if child gets state variables from the parent as well
207 """
208 proper = TestClassProperChild()
209 self.failUnlessEqual(Set(proper.states.names),
210 Set(['state1', 'state2', 'state4']))
211
212
221
222
223 class S2(Stateful):
224 v2 = StateVariable(enabled=True, doc="values12 is ...")
225
226 class S1_(S1):
227 pass
228
229 class S1__(S1_):
230 v1__ = StateVariable(enabled=False)
231
232 class S12(S1__, S2):
233 v12 = StateVariable()
234
235 s1, s2, s1_, s1__, s12 = S1(), S2(), S1_(), S1__(), S12()
236
237 self.failUnlessEqual(s1.states.isEnabled("v1"), True)
238 s1.v1 = 12
239 s12.v1 = 120
240 s2.v2 = 100
241
242 self.failUnlessEqual(len(s2.states.listing), 1)
243
244 self.failUnlessEqual(s1.v1, 12)
245 try:
246 tempvalue = s1__.v1__
247 self.fail("Should have puked since values were not enabled yet")
248 except:
249 pass
250
251
253
254 self.failUnlessRaises(TypeError, TestClassParametrized,
255 p2=34, enable_states=['state1'],
256 msg="Should raise an exception if argument doesn't correspond to"
257 "any parameter")
258 a = TestClassParametrized(p1=123, enable_states=['state1'])
259 self.failUnlessEqual(a.p1, 123, msg="We must have assigned value to instance")
260 self.failUnless('state1' in a.states.enabled,
261 msg="state1 must have been enabled")
262
263 if (__debug__ and 'ID_IN_REPR' in debug.active):
264
265 return
266
267
268 a_str = `a`
269 try:
270 import test_state
271 exec "a2=%s" % a_str
272 except Exception, e:
273 self.fail(msg="Failed to generate an instance out of "
274 "representation %s. Got exception: %s" % (a_str, e))
275
276 a2_str = `a2`
277 self.failUnless(a2_str == a_str,
278 msg="Generated object must have the same repr. Got %s and %s" %
279 (a_str, a2_str))
280
281
282 aparams_str = `a.params`
283 try:
284 import test_state
285 exec "aparams2=%s" % aparams_str
286 except Exception, e:
287 self.fail(msg="Failed to generate an instance out of "
288 "representation %s of params. Got exception: %s" % (aparams_str, e))
289
290
293
294
295 if __name__ == '__main__':
296 import runner
297