tests are passing again after package renaming
[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.config import *
6 from tiramisu.option import *
7 from tiramisu.error import *
8
9 def make_description():
10     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
11     gcdummy = BoolOption('dummy', 'dummy', default=False)
12     objspaceoption = ChoiceOption('objspace', 'Object space',
13                                 ['std', 'thunk'], 'std')
14     booloption = BoolOption('bool', 'Test boolean option', default=True)
15     intoption = IntOption('int', 'Test int option', default=0)
16     floatoption = FloatOption('float', 'Test float option', default=2.3)
17     stroption = StrOption('str', 'Test string option', default="abc")
18     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
19     wantref_option = BoolOption('wantref', 'Test requires', default=False)
20     wantframework_option = BoolOption('wantframework', 'Test requires',
21                                       default=False)    
22     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
23     descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
24                                            wantref_option, stroption,
25                                            wantframework_option,
26                                            intoption, boolop])
27     return descr
28 #____________________________________________________________
29 # change with __setattr__
30 def test_attribute_access():
31     "Once set, option values can't be changed again by attribute access"
32     s = StrOption("string", "", default="string")
33     descr = OptionDescription("options", "", [s])
34     config = Config(descr)
35     # let's try to change it again
36     config.string = "foo"
37     assert config.string == "foo"
38
39 def test_setitem():
40     s = StrOption("string", "", default=["string", "sdfsdf"], default_multi="prout", multi=True)
41     descr = OptionDescription("options", "", [s])
42     config = Config(descr)
43     print config.string[1]
44     config.string[1] = "titi"
45     print config.string[1]
46     
47 def test_reset():
48     "if value is None, resets to default owner"
49     s = StrOption("string", "", default="string")
50     descr = OptionDescription("options", "", [s])
51     config = Config(descr)
52     config.string = "foo"
53     assert config.string == "foo"
54     assert config._cfgimpl_value_owners['string'] == 'user'
55     config.string = None
56     assert config.string == 'string'
57     assert config._cfgimpl_value_owners['string'] == 'default'
58
59 def test_reset_with_multi():
60     s = StrOption("string", "", default=["string"], default_multi="string" , multi=True)
61     descr = OptionDescription("options", "", [s])
62     config = Config(descr)
63     config.string = []
64     assert config.string == ["string"]
65     assert config._cfgimpl_value_owners['string'] == ['default']
66     config.string = ["eggs", "spam", "foo"]
67     assert config._cfgimpl_value_owners['string'] == ['user', 'user', 'user']
68     config.string = []
69     assert config.string == ["string"]
70     assert config._cfgimpl_value_owners['string'] == ['default']
71     raises(ConfigError, "config.string = None")
72
73 def test_default_with_multi():
74     "default with multi is a list"
75     s = StrOption("string", "", default=[], default_multi="string" , multi=True)
76     descr = OptionDescription("options", "", [s])
77     config = Config(descr)
78     assert config.string == []
79     s = StrOption("string", "", default=None, default_multi="string" , multi=True)
80     descr = OptionDescription("options", "", [s])
81     config = Config(descr)
82     assert config.string == []
83     
84 def test_idontexist():
85     descr = make_description()
86     cfg = Config(descr)
87     raises(AttributeError, "cfg.idontexist")
88 # ____________________________________________________________
89 def test_attribute_access_with_multi():
90     s = StrOption("string", "", default=["string"], default_multi= "string" , multi=True)
91     descr = OptionDescription("options", "", [s])
92     config = Config(descr)
93     config.string = ["foo", "bar"]
94     assert config.string == ["foo", "bar"]
95
96 def test_item_access_with_multi():
97     s = StrOption("string", "", default=["string"], multi=True)
98     descr = OptionDescription("options", "", [s])
99     config = Config(descr)
100     config.string = ["foo", "bar"]
101     assert config.string == ["foo", "bar"]
102     assert config.string[0] == "foo"
103     # FIXME
104     config.string[0] = 'changetest'
105 #    assert config.string[0] == 'changetest'
106 #    assert config.string[
107
108 def test_access_with_multi_default():
109     s = StrOption("string", "", default=["string"], multi=True)
110     descr = OptionDescription("options", "", [s])
111     config = Config(descr)
112     assert config._cfgimpl_value_owners["string"] == ['default']
113     config.string = ["foo", "bar"]
114     assert config.string == ["foo", "bar"]
115     assert config._cfgimpl_value_owners["string"] == ['user', 'user']
116
117 #def test_attribute_access_with_multi2():
118 #    s = StrOption("string", "", default="string", multi=True)
119 #    descr = OptionDescription("options", "", [s])
120 #    config = Config(descr)
121 #    config.string = ["foo", "bar"]
122 #    assert config.string == ["foo", "bar"]
123
124 def test_multi_with_requires():
125     s = StrOption("string", "", default=["string"], default_multi="string", multi=True)
126     intoption = IntOption('int', 'Test int option', default=0)
127     stroption = StrOption('str', 'Test string option', default=["abc"], default_multi = "abc", 
128                           requires=[('int', 1, 'hide')], multi=True)
129     descr = OptionDescription("options", "", [s, intoption, stroption])
130     config = Config(descr)
131     assert stroption._is_hidden() == False
132     config.int = 1
133     raises(HiddenOptionError, "config.str = ['a', 'b']")
134     assert stroption._is_hidden()
135
136 def test__requires_with_inverted():
137     s = StrOption("string", "", default=["string"], multi=True)
138     intoption = IntOption('int', 'Test int option', default=0)
139     stroption = StrOption('str', 'Test string option', default=["abc"], default_multi = "abc",
140                           requires=[('int', 1, 'hide', 'inverted')], multi=True)
141     descr = OptionDescription("options", "", [s, intoption, stroption])
142     config = Config(descr)
143     assert stroption._is_hidden() == False
144     config.int = 1
145     assert stroption._is_hidden() == False
146
147 def test_multi_with_requires_in_another_group():
148     s = StrOption("string", "", default=["string"], multi=True)
149     intoption = IntOption('int', 'Test int option', default=0)
150     descr = OptionDescription("options", "", [intoption])
151     stroption = StrOption('str', 'Test string option', default=["abc"], 
152                           requires=[('int', 1, 'hide')], multi=True)
153     descr = OptionDescription("opt", "", [stroption])
154     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
155     config = Config(descr2)
156     assert stroption._is_hidden() == False
157     config.int = 1
158     raises(HiddenOptionError,  "config.opt.str = ['a', 'b']")
159     assert stroption._is_hidden()
160
161 def test_apply_requires_from_config():
162     s = StrOption("string", "", default=["string"], multi=True)
163     intoption = IntOption('int', 'Test int option', default=0)
164     descr = OptionDescription("options", "", [intoption])
165     stroption = StrOption('str', 'Test string option', default=["abc"], 
166                           requires=[('int', 1, 'hide')], multi=True)
167     descr = OptionDescription("opt", "", [stroption])
168     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
169     config = Config(descr2)
170     assert stroption._is_hidden() == False
171     config.int = 1
172     try:
173         config.opt.str
174     except:
175         pass 
176     assert stroption._is_hidden()
177     
178
179 def test_apply_requires_with_disabled():
180     s = StrOption("string", "", default=["string"], multi=True)
181     intoption = IntOption('int', 'Test int option', default=0)
182     descr = OptionDescription("options", "", [intoption])
183     stroption = StrOption('str', 'Test string option', default=["abc"], 
184                           requires=[('int', 1, 'disable')], multi=True)
185     descr = OptionDescription("opt", "", [stroption])
186     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
187     config = Config(descr2)
188     assert stroption._is_disabled() == False
189     config.int = 1
190     try:
191         config.opt.str
192     except:
193         pass 
194     assert stroption._is_disabled()
195
196 def test_multi_with_requires_with_disabled_in_another_group():
197     s = StrOption("string", "", default=["string"], multi=True)
198     intoption = IntOption('int', 'Test int option', default=0)
199     descr = OptionDescription("options", "", [intoption])
200     stroption = StrOption('str', 'Test string option', default=["abc"], 
201                           requires=[('int', 1, 'disable')], multi=True)
202     descr = OptionDescription("opt", "", [stroption])
203     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
204     config = Config(descr2)
205     assert stroption._is_disabled() == False
206     config.int = 1
207     raises(DisabledOptionError,  "config.opt.str = ['a', 'b']")
208     assert stroption._is_disabled()
209
210 def test_multi_with_requires_that_is_multi():
211     s = StrOption("string", "", default=["string"], multi=True)
212     intoption = IntOption('int', 'Test int option', default=[0], multi=True)
213     stroption = StrOption('str', 'Test string option', default=["abc"], 
214                           requires=[('int', [1, 1], 'hide')], multi=True)
215     descr = OptionDescription("options", "", [s, intoption, stroption])
216     config = Config(descr)
217     assert stroption._is_hidden() == False
218     config.int = [1, 1]
219     raises(HiddenOptionError, "config.str = ['a', 'b']")
220     assert stroption._is_hidden()
221
222 def test_multi_with_bool():
223     s = BoolOption("bool", "", default=[False], multi=True)
224     descr = OptionDescription("options", "", [s])
225     config = Config(descr)
226     assert descr.bool.multi == True
227     config.bool = [True, False]
228     assert config._cfgimpl_values['bool'] == [True, False]
229     assert config.bool == [True, False]
230
231 def test_multi_with_bool_two():
232     s = BoolOption("bool", "", default=[False], multi=True)
233     descr = OptionDescription("options", "", [s])
234     config = Config(descr)
235     assert descr.bool.multi == True
236     raises(ConfigError, "config.bool = True")
237
238 def test_choice_access_with_multi():
239     ch = ChoiceOption("t1", "", ["a", "b"], default=["a"], multi=True)
240     descr = OptionDescription("options", "", [ch])
241     config = Config(descr)
242     config.t1 = ["a", "b", "a", "b"]
243     assert config.t1 == ["a", "b", "a", "b"]
244 # ____________________________________________________________
245
246 def test_setoption_from_option():
247     "a setoption directly from the option is **not** a good practice"
248     booloption = BoolOption('bool', 'Test boolean option', default=True)
249     descr = OptionDescription('descr', '', [booloption])
250     cfg = Config(descr)
251     booloption.setoption(cfg, False, 'owner')
252     assert cfg.bool == False
253 # ____________________________________________________________
254 def test_set_mode_in_config():
255     booloption = BoolOption('bool', 'Test boolean option', default=True, 
256                                                                   mode='expert')
257     descr = OptionDescription('descr', '', [booloption])
258     cfg = Config(descr)
259     cfg.cfgimpl_set_mode('expert')
260     raises(ModeOptionError, "cfg.bool")
261     cfg.cfgimpl_set_mode('normal')
262     assert cfg.bool == True
263 #____________________________________________________________
264 def test_dwim_set():
265     descr = OptionDescription("opt", "", [
266         OptionDescription("sub", "", [
267             BoolOption("b1", ""),
268             ChoiceOption("c1", "", ['a', 'b', 'c'], 'a'),
269             BoolOption("d1", ""),
270         ]),
271         BoolOption("b2", ""),
272         BoolOption("d1", ""),
273     ])
274     c = Config(descr)
275     c.set(b1=False, c1='b')
276     assert not c.sub.b1
277     assert c.sub.c1 == 'b'
278     # new config, because you cannot change values once they are set
279     c = Config(descr)
280     c.set(b2=False, **{'sub.c1': 'c'})
281     assert not c.b2
282     assert c.sub.c1 == 'c'
283     raises(AmbigousOptionError, "c.set(d1=True)")
284     raises(NoMatchingOptionFound, "c.set(unknown='foo')")
285
286 def test_more_set():
287     descr = OptionDescription("opt", "", [
288         OptionDescription("s1", "", [
289             BoolOption("a", "", default=False)]),
290         IntOption("int", "", default=42)])
291     d = {'s1.a': True, 'int': 23}
292     config = Config(descr)
293     config.set(**d)
294     assert config.s1.a
295     assert config.int == 23
296
297 def test_set_with_hidden_option():
298     boolopt = BoolOption("a", "", default=False)
299     boolopt.hide()
300     descr = OptionDescription("opt", "", [
301         OptionDescription("s1", "", [boolopt]),
302         IntOption("int", "", default=42)])
303     d = {'s1.a': True, 'int': 23}
304     config = Config(descr)
305     raises(HiddenOptionError, "config.set(**d)")
306
307 def test_set_with_unknown_option():
308     boolopt = BoolOption("b", "", default=False)
309     descr = OptionDescription("opt", "", [
310         OptionDescription("s1", "", [boolopt]),
311         IntOption("int", "", default=42)])
312     d = {'s1.a': True, 'int': 23}
313     config = Config(descr)
314     raises(NoMatchingOptionFound, "config.set(**d)")
315
316
317 def test_set_symlink_option():
318     boolopt = BoolOption("b", "", default=False)
319     linkopt = SymLinkOption("c", "s1.b")
320     descr = OptionDescription("opt", "", 
321                               [linkopt, OptionDescription("s1", "", [boolopt])])
322     config = Config(descr)
323     setattr(config, "s1.b", True)
324     setattr(config, "s1.b", False)
325     assert config.s1.b == False
326     assert config.c == False
327     config.c = True
328     assert config.s1.b == True
329     assert config.c == True
330     config.c = False
331     assert config.s1.b == False
332     assert config.c == False
333     
334 #____________________________________________________________
335 def test_config_impl_values():
336     descr = make_description()
337     config = Config(descr, bool=False)
338 #    gcdummy.setoption(config, True, "user")
339 #    config.setoption("gc.dummy", True, "user")
340     #config.gc.dummy = True
341 #    config.setoption("bool", False, "user")
342     config.set(dummy=False)
343     assert config.gc._cfgimpl_values == {'dummy': False, 'float': 2.3, 'name': 'ref'}
344     ## acces to the option object 
345 #    config.gc._cfgimpl_descr.dummy.setoption(config, True, "user")
346     assert config.gc.dummy == False
347 #    config.set(dummy=True)
348 #    assert config.gc.dummy == True
349
350 #____________________________________________________________
351 def test_accepts_multiple_changes_from_option():
352     s = StrOption("string", "", default="string")
353     descr = OptionDescription("options", "", [s])
354     config = Config(descr)
355     config.string = "egg"
356     assert s.getdefault() == "string"
357     assert config.string == "egg"
358     s.setoption(config, 'blah', "default")
359     assert s.getdefault() == "blah"
360     assert config.string == "blah"
361     s.setoption(config, 'bol', "user")
362     assert config.string == 'bol'
363     config.override({'string': "blurp"})
364     assert config.string == 'blurp'
365     assert s.getdefault() == 'blurp'
366
367 def test_allow_multiple_changes_from_config():
368     """
369     a `setoption` from the config object is much like the attribute access, 
370     except the fact that value owner can bet set 
371     """
372     s = StrOption("string", "", default="string")
373     s2 = StrOption("string2", "", default="string")
374     suboption = OptionDescription("bip", "", [s2])
375     descr = OptionDescription("options", "", [s, suboption])
376     config = Config(descr)
377     config.setoption("string", 'blah', "user")
378     config.setoption("string", "oh", "user")    
379     assert config.string == "oh"
380     config.set(string2= 'blah')
381     assert config.bip.string2 == 'blah'
382 # ____________________________________________________________
383
384 def test_overrides_are_defaults():
385     descr = OptionDescription("test", "", [
386         BoolOption("b1", "", default=False),
387         BoolOption("b2", "", default=False),
388         ])
389     # overrides here
390     config = Config(descr, b2=True)
391     assert config.b2
392     # test with a require
393     config.b1 = True
394     assert config.b2
395  
396  # ____________________________________________________________
397  # accessing a value by the get method
398 def test_access_by_get():
399     descr = make_description()
400     cfg = Config(descr)
401     raises(NotFoundError, "cfg.get('idontexist')" )
402     assert cfg.get('wantref') == False
403     assert cfg.gc.dummy == False
404     assert cfg.get('dummy') == False
405
406 def test_access_by_get_whith_hide():
407     b1 = BoolOption("b1", "")
408     b1.hide()
409     descr = OptionDescription("opt", "", [
410     OptionDescription("sub", "", [
411         b1,
412         ChoiceOption("c1", "", ['a', 'b', 'c'], 'a'),
413         BoolOption("d1", ""),
414     ]),
415     BoolOption("b2", ""),
416     BoolOption("d1", ""),
417     ])
418     c = Config(descr)
419     raises(HiddenOptionError, "c.get('b1')")
420