044b61b8b0ccb50d0e2dc0c2b82b846b2ae014ac
[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(s) == owners.user
60     del(config.string)
61     assert config.string == 'string'
62     assert config.getowner(s) == 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(s) == 'default'
73     config.string = ["eggs", "spam", "foo"]
74     assert config.getowner(s) == 'user'
75     config.string = []
76     del(config.string)
77 #    assert config.string == ["string"]
78     assert config.getowner(s) == '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(s) == 'default'
125     config.string = ["foo", "bar"]
126     assert config.string == ["foo", "bar"]
127     assert config.getowner(s) == '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     stroption = StrOption('str', 'Test string option', default=["abc"],
162                           requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)
163     descr = OptionDescription("opt", "", [stroption])
164     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
165     config = Config(descr2)
166     setting = config.cfgimpl_get_settings()
167     config.read_write()
168     assert not 'hidden' in setting[stroption]
169     config.int = 1
170     raises(PropertiesOptionError,  "config.opt.str = ['a', 'b']")
171     assert 'hidden' in setting[stroption]
172
173
174 def test_apply_requires_from_config():
175     s = StrOption("string", "", default=["string"], multi=True)
176     intoption = IntOption('int', 'Test int option', default=0)
177     stroption = StrOption('str', 'Test string option', default=["abc"],
178                           requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)
179     descr = OptionDescription("opt", "", [stroption])
180     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
181     config = Config(descr2)
182     setting = config.cfgimpl_get_settings()
183     config.read_write()
184     assert not 'hidden' in setting[stroption]
185     config.int = 1
186     raises(PropertiesOptionError, 'config.opt.str')
187     assert 'hidden' in setting[stroption]
188
189
190 def test_apply_requires_with_disabled():
191     s = StrOption("string", "", default=["string"], multi=True)
192     intoption = IntOption('int', 'Test int option', default=0)
193     stroption = StrOption('str', 'Test string option', default=["abc"],
194                           requires=[{'option': intoption, 'expected': 1, 'action': 'disabled'}], multi=True)
195     descr = OptionDescription("opt", "", [stroption])
196     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
197     config = Config(descr2)
198     setting = config.cfgimpl_get_settings()
199     config.read_write()
200     assert not 'disabled' in setting[stroption]
201     config.int = 1
202     raises(PropertiesOptionError, 'config.opt.str')
203     assert 'disabled' in setting[stroption]
204
205
206 def test_multi_with_requires_with_disabled_in_another_group():
207     s = StrOption("string", "", default=["string"], multi=True)
208     intoption = IntOption('int', 'Test int option', default=0)
209     stroption = StrOption('str', 'Test string option', default=["abc"],
210                           requires=[{'option': intoption, 'expected': 1, 'action': 'disabled'}], multi=True)
211     descr = OptionDescription("opt", "", [stroption])
212     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
213     config = Config(descr2)
214     setting = config.cfgimpl_get_settings()
215     config.read_write()
216     assert not 'disabled' in setting[stroption]
217     config.int = 1
218     raises(PropertiesOptionError,  "config.opt.str = ['a', 'b']")
219     assert 'disabled' in setting[stroption]
220
221
222 def test_multi_with_requires_that_is_multi():
223     s = StrOption("string", "", default=["string"], multi=True)
224     intoption = IntOption('int', 'Test int option', default=[0], multi=True)
225     raises(ValueError, "StrOption('str', 'Test string option', default=['abc'], requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)")
226
227
228 def test_multi_with_bool():
229     s = BoolOption("bool", "", default=[False], multi=True)
230     descr = OptionDescription("options", "", [s])
231     config = Config(descr)
232     assert descr.bool.impl_is_multi() is True
233     config.bool = [True, False]
234     assert config.cfgimpl_get_values()[s] == [True, False]
235     assert config.bool == [True, False]
236
237
238 def test_multi_with_bool_two():
239     s = BoolOption("bool", "", default=[False], multi=True)
240     descr = OptionDescription("options", "", [s])
241     config = Config(descr)
242     assert descr.bool.impl_is_multi() is True
243     raises(ValueError, "config.bool = True")
244
245
246 def test_choice_access_with_multi():
247     ch = ChoiceOption("t1", "", ("a", "b"), default=["a"], multi=True)
248     descr = OptionDescription("options", "", [ch])
249     config = Config(descr)
250     config.t1 = ["a", "b", "a", "b"]
251     assert config.t1 == ["a", "b", "a", "b"]
252
253
254 #____________________________________________________________
255 def test_accepts_multiple_changes_from_option():
256     s = StrOption("string", "", default="string")
257     descr = OptionDescription("options", "", [s])
258     config = Config(descr)
259     config.string = "egg"
260     assert s.impl_getdefault() == "string"
261     assert config.string == "egg"
262     config.string = 'blah'
263     assert s.impl_getdefault() == "string"
264     assert config.string == "blah"
265     config.string = 'bol'
266     assert config.string == 'bol'
267
268
269 def test_allow_multiple_changes_from_config():
270     """
271     a `setoption` from the config object is much like the attribute access,
272     except the fact that value owner can bet set
273     """
274     s = StrOption("string", "", default="string")
275     s2 = StrOption("string2", "", default="string")
276     suboption = OptionDescription("bip", "", [s2])
277     descr = OptionDescription("options", "", [s, suboption])
278     config = Config(descr)
279     config.string = "oh"
280     assert config.string == "oh"
281     config.string = "blah"
282     assert config.string == "blah"
283
284
285 # ____________________________________________________________
286 # accessing a value by the get method
287 def test_access_by_get():
288     descr = make_description()
289     cfg = Config(descr)
290     raises(AttributeError, "cfg.find(byname='idontexist')")
291     assert cfg.find_first(byname='wantref', type_='value') is False
292     assert cfg.gc.dummy is False
293     assert cfg.find_first(byname='dummy', type_='value') is False
294
295
296 def test_access_by_get_whith_hide():
297     b1 = BoolOption("b1", "", properties=(('hidden'),))
298     descr = OptionDescription("opt", "",
299                               [OptionDescription("sub", "",
300                                                  [b1, ChoiceOption("c1", "", ('a', 'b', 'c'), 'a'),
301                                                   BoolOption("d1", "")]),
302                                BoolOption("b2", ""),
303                                BoolOption("d1", "")])
304     c = Config(descr)
305     c.read_write()
306     raises(AttributeError, "c.find(byname='b1')")
307
308
309 def test_append_properties():
310     descr = make_description()
311     cfg = Config(descr)
312     setting = cfg.cfgimpl_get_settings()
313     option = cfg.cfgimpl_get_description().gc.dummy
314     assert tuple(option.impl_getproperties()) == tuple()
315     assert not 'test' in setting[option]
316     setting[option].append('test')
317     assert tuple(option.impl_getproperties()) == tuple()
318     assert 'test' in setting[option]
319
320
321 def test_reset_properties():
322     descr = make_description()
323     cfg = Config(descr)
324     setting = cfg.cfgimpl_get_settings()
325     option = cfg.cfgimpl_get_description().gc.dummy
326     assert setting._p_.get_modified_properties() == {}
327     setting.append('frozen')
328     assert setting._p_.get_modified_properties() == {None: set(('frozen', 'expire', 'cache', 'validator'))}
329     setting.reset()
330     assert setting._p_.get_modified_properties() == {}
331     setting[option].append('test')
332     assert setting._p_.get_modified_properties() == {'gc.dummy': set(('test',))}
333     setting.reset()
334     assert setting._p_.get_modified_properties() == {'gc.dummy': set(('test',))}
335     setting.append('frozen')
336     assert setting._p_.get_modified_properties() == {None: set(('frozen', 'expire', 'validator', 'cache')), 'gc.dummy': set(('test',))}
337     setting.reset(option)
338     assert setting._p_.get_modified_properties() == {None: set(('frozen', 'expire', 'validator', 'cache'))}
339     setting[option].append('test')
340     assert setting._p_.get_modified_properties() == {None: set(('frozen', 'expire', 'validator', 'cache')), 'gc.dummy': set(('test',))}
341     setting.reset(all_properties=True)
342     assert setting._p_.get_modified_properties() == {}
343     raises(ValueError, 'setting.reset(all_properties=True, opt=option)')
344     a = descr.wantref
345     setting[a].append('test')
346     setting[a].reset()
347
348
349 def test_reset_multiple():
350     descr = make_description()
351     cfg = Config(descr)
352     setting = cfg.cfgimpl_get_settings()
353     option = cfg.cfgimpl_get_description().gc.dummy
354     setting.append('frozen')
355     setting[option].append('test')
356     setting.reset()
357     setting.reset()
358     setting.append('frozen')
359     setting[option].append('test')
360     setting.reset(option)
361     setting.reset(option)
362     setting.append('frozen')
363     setting[option].append('test')
364     setting.reset(all_properties=True)
365     setting.reset(all_properties=True)