70332d257ff4f4fc4fc0cbc3e23dbc0b612e6123
[tiramisu.git] / test / test_option_setting.py
1 "config.set() or config.setoption() or option.setoption()"
2 import autopath
3 from py.test import raises
4
5 from tiramisu.setting import owners
6 from tiramisu.config import Config
7 from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption, \
8     StrOption, OptionDescription
9 from tiramisu.error import PropertiesOptionError
10
11
12 def make_description():
13     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
14     gcdummy = BoolOption('dummy', 'dummy', default=False)
15     objspaceoption = ChoiceOption('objspace', 'Object space',
16                                   ('std', 'thunk'), 'std')
17     booloption = BoolOption('bool', 'Test boolean option', default=True)
18     intoption = IntOption('int', 'Test int option', default=0)
19     floatoption = FloatOption('float', 'Test float option', default=2.3)
20     stroption = StrOption('str', 'Test string option', default="abc")
21     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
22     wantref_option = BoolOption('wantref', 'Test requires', default=False)
23     wantframework_option = BoolOption('wantframework', 'Test requires',
24                                       default=False)
25     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
26     descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
27                                                wantref_option, stroption,
28                                                wantframework_option,
29                                                intoption, boolop])
30     return descr
31
32
33 #____________________________________________________________
34 # change with __setattr__
35 def test_attribute_access():
36     "Once set, option values can't be changed again by attribute access"
37     s = StrOption("string", "", default="string")
38     descr = OptionDescription("options", "", [s])
39     config = Config(descr)
40     # let's try to change it again
41     config.string = "foo"
42     assert config.string == "foo"
43
44
45 def test_setitem():
46     s = StrOption("string", "", default=["string", "sdfsdf"], default_multi="prout", multi=True)
47     descr = OptionDescription("options", "", [s])
48     config = Config(descr)
49     config.string[1] = "titi"
50
51
52 def test_reset():
53     "if value is None, resets to default owner"
54     s = StrOption("string", "", default="string")
55     descr = OptionDescription("options", "", [s])
56     config = Config(descr)
57     config.string = "foo"
58     assert config.string == "foo"
59     assert config.getowner('string') == owners.user
60     del(config.string)
61     assert config.string == 'string'
62     assert config.getowner('string') == owners.default
63
64
65 def test_reset_with_multi():
66     s = StrOption("string", "", default=["string"], default_multi="string", multi=True)
67     descr = OptionDescription("options", "", [s])
68     config = Config(descr)
69 #    config.string = []
70     del(config.string)
71     assert config.string == ["string"]
72     assert config.getowner('string') == 'default'
73     config.string = ["eggs", "spam", "foo"]
74     assert config.getowner('string') == 'user'
75     config.string = []
76     del(config.string)
77 #    assert config.string == ["string"]
78     assert config.getowner('string') == 'default'
79     raises(ValueError, "config.string = None")
80
81
82 def test_default_with_multi():
83     "default with multi is a list"
84     s = StrOption("string", "", default=[], default_multi="string", multi=True)
85     descr = OptionDescription("options", "", [s])
86     config = Config(descr)
87     assert config.string == []
88     s = StrOption("string", "", default=None, default_multi="string", multi=True)
89     descr = OptionDescription("options", "", [s])
90     config = Config(descr)
91     assert config.string == []
92
93
94 def test_idontexist():
95     descr = make_description()
96     cfg = Config(descr)
97     raises(AttributeError, "cfg.idontexist")
98
99
100 # ____________________________________________________________
101 def test_attribute_access_with_multi():
102     s = StrOption("string", "", default=["string"], default_multi="string", multi=True)
103     descr = OptionDescription("options", "", [s])
104     config = Config(descr)
105     config.string = ["foo", "bar"]
106     assert config.string == ["foo", "bar"]
107
108
109 def test_item_access_with_multi():
110     s = StrOption("string", "", default=["string"], multi=True)
111     descr = OptionDescription("options", "", [s])
112     config = Config(descr)
113     config.string = ["foo", "bar"]
114     assert config.string == ["foo", "bar"]
115     assert config.string[0] == "foo"
116     config.string[0] = 'changetest'
117     assert config.string[0] == 'changetest'
118
119
120 def test_access_with_multi_default():
121     s = StrOption("string", "", default=["string"], multi=True)
122     descr = OptionDescription("options", "", [s])
123     config = Config(descr)
124     assert config.getowner('string') == 'default'
125     config.string = ["foo", "bar"]
126     assert config.string == ["foo", "bar"]
127     assert config.getowner('string') == 'user'
128
129
130 def test_multi_with_requires():
131     s = StrOption("string", "", default=["string"], default_multi="string", multi=True)
132     intoption = IntOption('int', 'Test int option', default=0)
133     stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc",
134                           requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)
135     descr = OptionDescription("options", "", [s, intoption, stroption])
136     config = Config(descr)
137     setting = config.cfgimpl_get_settings()
138     config.read_write()
139     assert not 'hidden' in setting[stroption]
140     config.int = 1
141     raises(PropertiesOptionError, "config.str = ['a', 'b']")
142     assert 'hidden' in setting[stroption]
143
144
145 def test__requires_with_inverted():
146     s = StrOption("string", "", default=["string"], multi=True)
147     intoption = IntOption('int', 'Test int option', default=0)
148     stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc",
149                           requires=[{'option': intoption, 'expected': 1, 'action': 'hide', 'inverse': True}], multi=True)
150     descr = OptionDescription("options", "", [s, intoption, stroption])
151     config = Config(descr)
152     setting = config.cfgimpl_get_settings()
153     assert not 'hidden' in setting[stroption]
154     config.int = 1
155     assert not 'hidden' in setting[stroption]
156
157
158 def test_multi_with_requires_in_another_group():
159     s = StrOption("string", "", default=["string"], multi=True)
160     intoption = IntOption('int', 'Test int option', default=0)
161     descr = OptionDescription("options", "", [intoption])
162     stroption = StrOption('str', 'Test string option', default=["abc"],
163                           requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)
164     descr = OptionDescription("opt", "", [stroption])
165     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
166     config = Config(descr2)
167     setting = config.cfgimpl_get_settings()
168     config.read_write()
169     assert not 'hidden' in setting[stroption]
170     config.int = 1
171     raises(PropertiesOptionError,  "config.opt.str = ['a', 'b']")
172     assert 'hidden' in setting[stroption]
173
174
175 def test_apply_requires_from_config():
176     s = StrOption("string", "", default=["string"], multi=True)
177     intoption = IntOption('int', 'Test int option', default=0)
178     descr = OptionDescription("options", "", [intoption])
179     stroption = StrOption('str', 'Test string option', default=["abc"],
180                           requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)
181     descr = OptionDescription("opt", "", [stroption])
182     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
183     config = Config(descr2)
184     setting = config.cfgimpl_get_settings()
185     config.read_write()
186     assert not 'hidden' in setting[stroption]
187     config.int = 1
188     raises(PropertiesOptionError, 'config.opt.str')
189     assert 'hidden' in setting[stroption]
190
191
192 def test_apply_requires_with_disabled():
193     s = StrOption("string", "", default=["string"], multi=True)
194     intoption = IntOption('int', 'Test int option', default=0)
195     descr = OptionDescription("options", "", [intoption])
196     stroption = StrOption('str', 'Test string option', default=["abc"],
197                           requires=[{'option': intoption, 'expected': 1, 'action': 'disabled'}], multi=True)
198     descr = OptionDescription("opt", "", [stroption])
199     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
200     config = Config(descr2)
201     setting = config.cfgimpl_get_settings()
202     config.read_write()
203     assert not 'disabled' in setting[stroption]
204     config.int = 1
205     raises(PropertiesOptionError, 'config.opt.str')
206     assert 'disabled' in setting[stroption]
207
208
209 def test_multi_with_requires_with_disabled_in_another_group():
210     s = StrOption("string", "", default=["string"], multi=True)
211     intoption = IntOption('int', 'Test int option', default=0)
212     descr = OptionDescription("options", "", [intoption])
213     stroption = StrOption('str', 'Test string option', default=["abc"],
214                           requires=[{'option': intoption, 'expected': 1, 'action': 'disabled'}], multi=True)
215     descr = OptionDescription("opt", "", [stroption])
216     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
217     config = Config(descr2)
218     setting = config.cfgimpl_get_settings()
219     config.read_write()
220     assert not 'disabled' in setting[stroption]
221     config.int = 1
222     raises(PropertiesOptionError,  "config.opt.str = ['a', 'b']")
223     assert 'disabled' in setting[stroption]
224
225
226 def test_multi_with_requires_that_is_multi():
227     s = StrOption("string", "", default=["string"], multi=True)
228     intoption = IntOption('int', 'Test int option', default=[0], multi=True)
229     raises(ValueError, "StrOption('str', 'Test string option', default=['abc'], requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)")
230
231
232 def test_multi_with_bool():
233     s = BoolOption("bool", "", default=[False], multi=True)
234     descr = OptionDescription("options", "", [s])
235     config = Config(descr)
236     assert descr.bool.impl_is_multi() is True
237     config.bool = [True, False]
238     assert config.cfgimpl_get_values()[s] == [True, False]
239     assert config.bool == [True, False]
240
241
242 def test_multi_with_bool_two():
243     s = BoolOption("bool", "", default=[False], multi=True)
244     descr = OptionDescription("options", "", [s])
245     config = Config(descr)
246     assert descr.bool.impl_is_multi() is True
247     raises(ValueError, "config.bool = True")
248
249
250 def test_choice_access_with_multi():
251     ch = ChoiceOption("t1", "", ("a", "b"), default=["a"], multi=True)
252     descr = OptionDescription("options", "", [ch])
253     config = Config(descr)
254     config.t1 = ["a", "b", "a", "b"]
255     assert config.t1 == ["a", "b", "a", "b"]
256
257
258 #____________________________________________________________
259 def test_accepts_multiple_changes_from_option():
260     s = StrOption("string", "", default="string")
261     descr = OptionDescription("options", "", [s])
262     config = Config(descr)
263     config.string = "egg"
264     assert s.impl_getdefault() == "string"
265     assert config.string == "egg"
266     config.string = 'blah'
267     assert s.impl_getdefault() == "string"
268     assert config.string == "blah"
269     config.string = 'bol'
270     assert config.string == 'bol'
271
272
273 def test_allow_multiple_changes_from_config():
274     """
275     a `setoption` from the config object is much like the attribute access,
276     except the fact that value owner can bet set
277     """
278     s = StrOption("string", "", default="string")
279     s2 = StrOption("string2", "", default="string")
280     suboption = OptionDescription("bip", "", [s2])
281     descr = OptionDescription("options", "", [s, suboption])
282     config = Config(descr)
283     config.string = "oh"
284     assert config.string == "oh"
285     config.string = "blah"
286     assert config.string == "blah"
287
288
289 # ____________________________________________________________
290 # accessing a value by the get method
291 def test_access_by_get():
292     descr = make_description()
293     cfg = Config(descr)
294     raises(AttributeError, "cfg.find(byname='idontexist')")
295     assert cfg.find_first(byname='wantref', type_='value') is False
296     assert cfg.gc.dummy is False
297     assert cfg.find_first(byname='dummy', type_='value') is False
298
299
300 def test_access_by_get_whith_hide():
301     b1 = BoolOption("b1", "", properties=(('hidden'),))
302     descr = OptionDescription("opt", "",
303                               [OptionDescription("sub", "",
304                                                  [b1, ChoiceOption("c1", "", ('a', 'b', 'c'), 'a'),
305                                                   BoolOption("d1", "")]),
306                                BoolOption("b2", ""),
307                                BoolOption("d1", "")])
308     c = Config(descr)
309     c.read_write()
310     raises(AttributeError, "c.find(byname='b1')")
311
312
313 def test_append_properties():
314     descr = make_description()
315     cfg = Config(descr)
316     setting = cfg.cfgimpl_get_settings()
317     option = cfg.cfgimpl_get_description().gc.dummy
318     assert option._properties == tuple()
319     assert not 'test' in setting[option]
320     setting[option].append('test')
321     assert option._properties == tuple()
322     assert 'test' in setting[option]
323
324
325 def test_reset_properties():
326     descr = make_description()
327     cfg = Config(descr)
328     setting = cfg.cfgimpl_get_settings()
329     option = cfg.cfgimpl_get_description().gc.dummy
330     assert setting._p_.get_properties(cfg) == {}
331     setting.append('frozen')
332     assert setting._p_.get_properties(cfg) == {None: set(('frozen', 'expire', 'validator'))}
333     setting.reset()
334     assert setting._p_.get_properties(cfg) == {}
335     setting[option].append('test')
336     assert setting._p_.get_properties(cfg) == {'gc.dummy': set(('test',))}
337     setting.reset()
338     assert setting._p_.get_properties(cfg) == {'gc.dummy': set(('test',))}
339     setting.append('frozen')
340     assert setting._p_.get_properties(cfg) == {None: set(('frozen', 'expire', 'validator')), 'gc.dummy': set(('test',))}
341     setting.reset(option)
342     assert setting._p_.get_properties(cfg) == {None: set(('frozen', 'expire', 'validator'))}
343     setting[option].append('test')
344     assert setting._p_.get_properties(cfg) == {None: set(('frozen', 'expire', 'validator')), 'gc.dummy': set(('test',))}
345     setting.reset(all_properties=True)
346     assert setting._p_.get_properties(cfg) == {}
347     raises(ValueError, 'setting.reset(all_properties=True, opt=option)')
348
349
350 def test_reset_multiple():
351     descr = make_description()
352     cfg = Config(descr)
353     setting = cfg.cfgimpl_get_settings()
354     option = cfg.cfgimpl_get_description().gc.dummy
355     setting.append('frozen')
356     setting[option].append('test')
357     setting.reset()
358     setting.reset()
359     setting.append('frozen')
360     setting[option].append('test')
361     setting.reset(option)
362     setting.reset(option)
363     setting.append('frozen')
364     setting[option].append('test')
365     setting.reset(all_properties=True)
366     setting.reset(all_properties=True)