f3b9863c1c48eb572a4efe2fbbaa93095a9e075e
[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, SymLinkOption
9 from tiramisu.error import ConflictOptionError, 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.cfgimpl_get_values().getowner(s) == owners.user
60     del(config.string)
61     assert config.string == 'string'
62     assert config.cfgimpl_get_values().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.cfgimpl_get_values().getowner(s) == 'default'
73     config.string = ["eggs", "spam", "foo"]
74     assert config.cfgimpl_get_values().getowner(s) == 'user'
75     config.string = []
76     del(config.string)
77 #    assert config.string == ["string"]
78     assert config.cfgimpl_get_values().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     # FIXME
117     config.string[0] = 'changetest'
118 #    assert config.string[0] == 'changetest'
119 #    assert config.string[
120
121
122 def test_access_with_multi_default():
123     s = StrOption("string", "", default=["string"], multi=True)
124     descr = OptionDescription("options", "", [s])
125     config = Config(descr)
126     assert config._cfgimpl_values.getowner(s) == 'default'
127     config.string = ["foo", "bar"]
128     assert config.string == ["foo", "bar"]
129     assert config._cfgimpl_values.getowner(s) == 'user'
130
131 #def test_attribute_access_with_multi2():
132 #    s = StrOption("string", "", default="string", multi=True)
133 #    descr = OptionDescription("options", "", [s])
134 #    config = Config(descr)
135 #    config.string = ["foo", "bar"]
136 #    assert config.string == ["foo", "bar"]
137
138
139 def test_multi_with_requires():
140     s = StrOption("string", "", default=["string"], default_multi="string", multi=True)
141     intoption = IntOption('int', 'Test int option', default=0)
142     stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc",
143                           requires=[('int', 1, 'hidden')], multi=True)
144     descr = OptionDescription("options", "", [s, intoption, stroption])
145     config = Config(descr)
146     setting = config.cfgimpl_get_settings()
147     setting.read_write()
148     assert not 'hidden' in setting[stroption]
149     config.int = 1
150     raises(PropertiesOptionError, "config.str = ['a', 'b']")
151     assert 'hidden' in setting[stroption]
152
153
154 def test__requires_with_inverted():
155     s = StrOption("string", "", default=["string"], multi=True)
156     intoption = IntOption('int', 'Test int option', default=0)
157     stroption = StrOption('str', 'Test string option', default=["abc"], default_multi="abc",
158                           requires=[('int', 1, 'hide', 'inverted')], multi=True)
159     descr = OptionDescription("options", "", [s, intoption, stroption])
160     config = Config(descr)
161     setting = config.cfgimpl_get_settings()
162     assert not 'hidden' in setting[stroption]
163     config.int = 1
164     assert not 'hidden' in setting[stroption]
165
166
167 def test_multi_with_requires_in_another_group():
168     s = StrOption("string", "", default=["string"], multi=True)
169     intoption = IntOption('int', 'Test int option', default=0)
170     descr = OptionDescription("options", "", [intoption])
171     stroption = StrOption('str', 'Test string option', default=["abc"],
172                           requires=[('int', 1, 'hidden')], multi=True)
173     descr = OptionDescription("opt", "", [stroption])
174     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
175     config = Config(descr2)
176     setting = config.cfgimpl_get_settings()
177     setting.read_write()
178     assert not 'hidden' in setting[stroption]
179     config.int = 1
180     raises(PropertiesOptionError,  "config.opt.str = ['a', 'b']")
181     assert 'hidden' in setting[stroption]
182
183
184 def test_apply_requires_from_config():
185     s = StrOption("string", "", default=["string"], multi=True)
186     intoption = IntOption('int', 'Test int option', default=0)
187     descr = OptionDescription("options", "", [intoption])
188     stroption = StrOption('str', 'Test string option', default=["abc"],
189                           requires=[('int', 1, 'hidden')], multi=True)
190     descr = OptionDescription("opt", "", [stroption])
191     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
192     config = Config(descr2)
193     setting = config.cfgimpl_get_settings()
194     setting.read_write()
195     assert not 'hidden' in setting[stroption]
196     config.int = 1
197     raises(PropertiesOptionError, 'config.opt.str')
198     assert 'hidden' in setting[stroption]
199
200
201 def test_apply_requires_with_disabled():
202     s = StrOption("string", "", default=["string"], multi=True)
203     intoption = IntOption('int', 'Test int option', default=0)
204     descr = OptionDescription("options", "", [intoption])
205     stroption = StrOption('str', 'Test string option', default=["abc"],
206                           requires=[('int', 1, 'disabled')], multi=True)
207     descr = OptionDescription("opt", "", [stroption])
208     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
209     config = Config(descr2)
210     setting = config.cfgimpl_get_settings()
211     setting.read_write()
212     assert not 'disabled' in setting[stroption]
213     config.int = 1
214     raises(PropertiesOptionError, 'config.opt.str')
215     assert 'disabled' in setting[stroption]
216
217
218 def test_multi_with_requires_with_disabled_in_another_group():
219     s = StrOption("string", "", default=["string"], multi=True)
220     intoption = IntOption('int', 'Test int option', default=0)
221     descr = OptionDescription("options", "", [intoption])
222     stroption = StrOption('str', 'Test string option', default=["abc"],
223                           requires=[('int', 1, 'disabled')], multi=True)
224     descr = OptionDescription("opt", "", [stroption])
225     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
226     config = Config(descr2)
227     setting = config.cfgimpl_get_settings()
228     setting.read_write()
229     assert not 'disabled' in setting[stroption]
230     config.int = 1
231     raises(PropertiesOptionError,  "config.opt.str = ['a', 'b']")
232     assert 'disabled' in setting[stroption]
233
234
235 def test_multi_with_requires_that_is_multi():
236     s = StrOption("string", "", default=["string"], multi=True)
237     intoption = IntOption('int', 'Test int option', default=[0], multi=True)
238     stroption = StrOption('str', 'Test string option', default=["abc"],
239                           requires=[('int', [1, 1], 'hidden')], multi=True)
240     descr = OptionDescription("options", "", [s, intoption, stroption])
241     config = Config(descr)
242     setting = config.cfgimpl_get_settings()
243     setting.read_write()
244     assert not 'hidden' in setting[stroption]
245     config.int = [1, 1]
246     raises(PropertiesOptionError, "config.str = ['a', 'b']")
247     assert 'hidden' in setting[stroption]
248
249
250 def test_multi_with_bool():
251     s = BoolOption("bool", "", default=[False], multi=True)
252     descr = OptionDescription("options", "", [s])
253     config = Config(descr)
254     assert descr.bool.is_multi() is True
255     config.bool = [True, False]
256     assert config.cfgimpl_get_values()[s] == [True, False]
257     assert config.bool == [True, False]
258
259
260 def test_multi_with_bool_two():
261     s = BoolOption("bool", "", default=[False], multi=True)
262     descr = OptionDescription("options", "", [s])
263     config = Config(descr)
264     assert descr.bool.is_multi() is True
265     raises(ValueError, "config.bool = True")
266
267
268 def test_choice_access_with_multi():
269     ch = ChoiceOption("t1", "", ("a", "b"), default=["a"], multi=True)
270     descr = OptionDescription("options", "", [ch])
271     config = Config(descr)
272     config.t1 = ["a", "b", "a", "b"]
273     assert config.t1 == ["a", "b", "a", "b"]
274 # ____________________________________________________________
275
276 #def test_setoption_from_option():
277 #    "a setoption directly from the option is **not** a good practice"
278 #    booloption = BoolOption('bool', 'Test boolean option', default=True)
279 #    descr = OptionDescription('descr', '', [booloption])
280 #    cfg = Config(descr)
281 #    booloption.setoption(cfg, False)
282 #    assert cfg.bool == False
283
284
285 #____________________________________________________________
286 def test_dwim_set():
287     descr = OptionDescription("opt", "", [
288         OptionDescription("sub", "", [
289             BoolOption("b1", ""),
290             ChoiceOption("c1", "", ('a', 'b', 'c'), 'a'),
291             BoolOption("d1", ""),
292         ]),
293         BoolOption("b2", ""),
294         BoolOption("d1", ""),
295     ])
296     c = Config(descr)
297     c.set(b1=False, c1='b')
298     assert not c.sub.b1
299     assert c.sub.c1 == 'b'
300     # new config, because you cannot change values once they are set
301     c = Config(descr)
302     c.set(b2=False, **{'sub.c1': 'c'})
303     assert not c.b2
304     assert c.sub.c1 == 'c'
305     raises(ConflictOptionError, "c.set(d1=True)")
306     raises(AttributeError, "c.set(unknown='foo')")
307
308
309 def test_more_set():
310     descr = OptionDescription("opt", "", [
311         OptionDescription("s1", "", [
312             BoolOption("a", "", default=False)]),
313         IntOption("int", "", default=42)])
314     d = {'s1.a': True, 'int': 23}
315     config = Config(descr)
316     config.set(**d)
317     assert config.s1.a
318     assert config.int == 23
319
320
321 def test_set_with_hidden_option():
322     boolopt = BoolOption("a", "", default=False, properties=(('hidden'),))
323     descr = OptionDescription("opt", "", [
324         OptionDescription("s1", "", [boolopt]),
325         IntOption("int", "", default=42)])
326     d = {'s1.a': True, 'int': 23}
327     config = Config(descr)
328     setting = config.cfgimpl_get_settings()
329     setting.read_write()
330     raises(PropertiesOptionError, "config.set(**d)")
331
332
333 def test_set_with_unknown_option():
334     boolopt = BoolOption("b", "", default=False)
335     descr = OptionDescription("opt", "", [
336         OptionDescription("s1", "", [boolopt]),
337         IntOption("int", "", default=42)])
338     d = {'s1.a': True, 'int': 23}
339     config = Config(descr)
340     raises(AttributeError, "config.set(**d)")
341
342
343 def test_set_symlink_option():
344     boolopt = BoolOption("b", "", default=False)
345     linkopt = SymLinkOption("c", "s1.b", opt=boolopt)
346     descr = OptionDescription("opt", "",
347                               [linkopt, OptionDescription("s1", "", [boolopt])])
348     config = Config(descr)
349     setattr(config, "s1.b", True)
350     setattr(config, "s1.b", False)
351     assert config.s1.b is False
352     assert config.c is False
353     config.c = True
354     assert config.s1.b is True
355     assert config.c is True
356     config.c = False
357     assert config.s1.b is False
358     assert config.c is False
359
360 ##____________________________________________________________
361 #def test_config_impl_values():
362 #    descr = make_description()
363 #    config = Config(descr)
364 #    config.bool = False
365 ##    gcdummy.setoption(config, True, "user")
366 ##    config.setoption("gc.dummy", True, "user")
367 #    #config.gc.dummy = True
368 ##    config.setoption("bool", False, "user")
369 #    config.set(dummy=False)
370 #    assert config.gc._cfgimpl_context._cfgimpl_values.values == {'dummy': False, 'float': 2.3, 'name': 'ref'}
371 #    ## acces to the option object
372 ##    config.gc._cfgimpl_descr.dummy.setoption(config, True, "user")
373 #    assert config.gc.dummy == False
374 ##    config.set(dummy=True)
375 ##    assert config.gc.dummy == True
376
377 #____________________________________________________________
378 #def test_accepts_multiple_changes_from_option():
379 #    s = StrOption("string", "", default="string")
380 #    descr = OptionDescription("options", "", [s])
381 #    config = Config(descr)
382 #    config.string = "egg"
383 #    assert s.getdefault() == "string"
384 #    assert config.string == "egg"
385 #    s.setoption(config, 'blah')
386 #    assert s.getdefault() == "string"
387 #    assert config.string == "blah"
388 #    s.setoption(config, 'bol')
389 #    assert config.string == 'bol'
390
391
392 def test_allow_multiple_changes_from_config():
393     """
394     a `setoption` from the config object is much like the attribute access,
395     except the fact that value owner can bet set
396     """
397     s = StrOption("string", "", default="string")
398     s2 = StrOption("string2", "", default="string")
399     suboption = OptionDescription("bip", "", [s2])
400     descr = OptionDescription("options", "", [s, suboption])
401     config = Config(descr)
402     config.string = "oh"
403     assert config.string == "oh"
404     config.set(string2='blah')
405     assert config.bip.string2 == 'blah'
406
407
408 # ____________________________________________________________
409 # accessing a value by the get method
410 def test_access_by_get():
411     descr = make_description()
412     cfg = Config(descr)
413     raises(AttributeError, "cfg.find(byname='idontexist')")
414     assert cfg.find_first(byname='wantref', type_='value') is False
415     assert cfg.gc.dummy is False
416     assert cfg.find_first(byname='dummy', type_='value') is False
417
418
419 def test_access_by_get_whith_hide():
420     b1 = BoolOption("b1", "", properties=(('hidden'),))
421     descr = OptionDescription("opt", "",
422                               [OptionDescription("sub", "",
423                                                  [b1, ChoiceOption("c1", "", ('a', 'b', 'c'), 'a'),
424                                                   BoolOption("d1", "")]),
425                                BoolOption("b2", ""),
426                                BoolOption("d1", "")])
427     c = Config(descr)
428     setting = c.cfgimpl_get_settings()
429     setting.read_write()
430     raises(AttributeError, "c.find(byname='b1')")