dad5e20ddb48e116cc082ec159c6f101a8c517ff
[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 config import *
6 from option import *
7 from 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 #____________________________________________________________
30 # change with __setattr__
31 def test_attribute_access():
32     "Once set, option values can't be changed again by attribute access"
33     s = StrOption("string", "", default="string")
34     descr = OptionDescription("options", "", [s])
35     config = Config(descr)
36     # let's try to change it again
37     config.string = "foo"
38     assert config.string == "foo"
39 #    raises(ConflictConfigError, 'config.string = "bar"')
40
41 def test_idontexist():
42     descr = make_description()
43     cfg = Config(descr)
44     raises(AttributeError, "cfg.idontexist")
45 # ____________________________________________________________
46 def test_attribute_access_with_multi():
47     s = StrOption("string", "", default="string", multi=True)
48     descr = OptionDescription("options", "", [s])
49     config = Config(descr)
50     config.string = ["foo", "bar"]
51     assert config.string == ["foo", "bar"]
52
53 def test_attribute_access_with_multi():
54     s = StrOption("string", "", default="string", multi=True)
55     descr = OptionDescription("options", "", [s])
56     config = Config(descr)
57     config.string = ["foo", "bar"]
58     assert config.string == ["foo", "bar"]
59
60 def test_multi_with_requires():
61     s = StrOption("string", "", default="string", multi=True)
62     intoption = IntOption('int', 'Test int option', default=0)
63     stroption = StrOption('str', 'Test string option', default="abc", 
64                           requires=[('int', 1, 'hide')], multi=True)
65     descr = OptionDescription("options", "", [s, intoption, stroption])
66     config = Config(descr)
67     assert stroption._is_hidden() == False
68     config.int = 1
69     raises(HiddenOptionError, "config.str = ['a', 'b']")
70     assert stroption._is_hidden()
71
72 def test__requires_with_inverted():
73     s = StrOption("string", "", default="string", multi=True)
74     intoption = IntOption('int', 'Test int option', default=0)
75     stroption = StrOption('str', 'Test string option', default="abc", 
76                           requires=[('int', 1, 'hide', 'inverted')], multi=True)
77     descr = OptionDescription("options", "", [s, intoption, stroption])
78     config = Config(descr)
79     assert stroption._is_hidden() == False
80     config.int = 1
81     assert stroption._is_hidden() == False
82
83 def test_multi_with_requires_in_another_group():
84     s = StrOption("string", "", default="string", multi=True)
85     intoption = IntOption('int', 'Test int option', default=0)
86     descr = OptionDescription("options", "", [intoption])
87     stroption = StrOption('str', 'Test string option', default="abc", 
88                           requires=[('int', 1, 'hide')], multi=True)
89     descr = OptionDescription("opt", "", [stroption])
90     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
91     config = Config(descr2)
92     assert stroption._is_hidden() == False
93     config.int = 1
94     raises(HiddenOptionError,  "config.opt.str = ['a', 'b']")
95     assert stroption._is_hidden()
96
97 def test_apply_requires_from_config():
98     s = StrOption("string", "", default="string", multi=True)
99     intoption = IntOption('int', 'Test int option', default=0)
100     descr = OptionDescription("options", "", [intoption])
101     stroption = StrOption('str', 'Test string option', default="abc", 
102                           requires=[('int', 1, 'hide')], multi=True)
103     descr = OptionDescription("opt", "", [stroption])
104     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
105     config = Config(descr2)
106     assert stroption._is_hidden() == False
107     config.int = 1
108     try:
109         config.opt.str
110     except:
111         pass 
112     assert stroption._is_hidden()
113     
114
115 def test_apply_requires_with_disabled():
116     s = StrOption("string", "", default="string", multi=True)
117     intoption = IntOption('int', 'Test int option', default=0)
118     descr = OptionDescription("options", "", [intoption])
119     stroption = StrOption('str', 'Test string option', default="abc", 
120                           requires=[('int', 1, 'disable')], multi=True)
121     descr = OptionDescription("opt", "", [stroption])
122     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
123     config = Config(descr2)
124     assert stroption._is_disabled() == False
125     config.int = 1
126     try:
127         config.opt.str
128     except:
129         pass 
130     assert stroption._is_disabled()
131
132 def test_multi_with_requires_with_disabled_in_another_group():
133     s = StrOption("string", "", default="string", multi=True)
134     intoption = IntOption('int', 'Test int option', default=0)
135     descr = OptionDescription("options", "", [intoption])
136     stroption = StrOption('str', 'Test string option', default="abc", 
137                           requires=[('int', 1, 'disable')], multi=True)
138     descr = OptionDescription("opt", "", [stroption])
139     descr2 = OptionDescription("opt2", "", [intoption, s, descr])
140     config = Config(descr2)
141     assert stroption._is_disabled() == False
142     config.int = 1
143     raises(DisabledOptionError,  "config.opt.str = ['a', 'b']")
144     assert stroption._is_disabled()
145
146 def test_multi_with_requires_that_is_multi():
147     s = StrOption("string", "", default="string", multi=True)
148     intoption = IntOption('int', 'Test int option', default=[0, 0], multi=True)
149     stroption = StrOption('str', 'Test string option', default="abc", 
150                           requires=[('int', [1, 1], 'hide')], multi=True)
151     descr = OptionDescription("options", "", [s, intoption, stroption])
152     config = Config(descr)
153     assert stroption._is_hidden() == False
154     config.int = [1, 1]
155     raises(HiddenOptionError, "config.str = ['a', 'b']")
156     assert stroption._is_hidden()
157
158 def test_multi_with_bool():
159     s = BoolOption("bool", "", default=[False], multi=True)
160     descr = OptionDescription("options", "", [s])
161     config = Config(descr)
162     assert descr.bool.multi == True
163     config.bool = [True, False]
164     assert config._cfgimpl_values['bool'] == [True, False]
165     assert config.bool == [True, False]
166
167 def test_multi_with_bool_two():
168     s = BoolOption("bool", "", default=[False], multi=True)
169     descr = OptionDescription("options", "", [s])
170     config = Config(descr)
171     assert descr.bool.multi == True
172     raises(ConfigError, "config.bool = True")
173
174 def test_choice_access_with_multi():
175     ch = ChoiceOption("t1", "", ["a", "b"], default=["a", "a", "a"], multi=True)
176     descr = OptionDescription("options", "", [ch])
177     config = Config(descr)
178     config.t1 = ["a", "b", "a", "b"]
179     assert config.t1 == ["a", "b", "a", "b"]
180 # ____________________________________________________________
181
182 def test_setoption_from_option():
183     "a setoption directly from the option is **not** a good practice"
184     booloption = BoolOption('bool', 'Test boolean option', default=True)
185     descr = OptionDescription('descr', '', [booloption])
186     cfg = Config(descr)
187     booloption.setoption(cfg, False, 'owner')
188     assert cfg.bool == False
189 # ____________________________________________________________
190 def test_set_mode_in_config():
191     booloption = BoolOption('bool', 'Test boolean option', default=True, 
192                                                                   mode='expert')
193     descr = OptionDescription('descr', '', [booloption])
194     cfg = Config(descr)
195     cfg.cfgimpl_set_mode('expert')
196     raises(ModeOptionError, "cfg.bool")
197     cfg.cfgimpl_set_mode('normal')
198     assert cfg.bool == True
199 #____________________________________________________________
200 def test_dwim_set():
201     descr = OptionDescription("opt", "", [
202         OptionDescription("sub", "", [
203             BoolOption("b1", ""),
204             ChoiceOption("c1", "", ['a', 'b', 'c'], 'a'),
205             BoolOption("d1", ""),
206         ]),
207         BoolOption("b2", ""),
208         BoolOption("d1", ""),
209     ])
210     c = Config(descr)
211     c.set(b1=False, c1='b')
212     assert not c.sub.b1
213     assert c.sub.c1 == 'b'
214     # new config, because you cannot change values once they are set
215     c = Config(descr)
216     c.set(b2=False, **{'sub.c1': 'c'})
217     assert not c.b2
218     assert c.sub.c1 == 'c'
219     raises(AmbigousOptionError, "c.set(d1=True)")
220     raises(NoMatchingOptionFound, "c.set(unknown='foo')")
221
222 def test_more_set():
223     descr = OptionDescription("opt", "", [
224         OptionDescription("s1", "", [
225             BoolOption("a", "", default=False)]),
226         IntOption("int", "", default=42)])
227     d = {'s1.a': True, 'int': 23}
228     config = Config(descr)
229     config.set(**d)
230     assert config.s1.a
231     assert config.int == 23
232
233 def test_set_with_hidden_option():
234     boolopt = BoolOption("a", "", default=False)
235     boolopt.hide()
236     descr = OptionDescription("opt", "", [
237         OptionDescription("s1", "", [boolopt]),
238         IntOption("int", "", default=42)])
239     d = {'s1.a': True, 'int': 23}
240     config = Config(descr)
241     raises(HiddenOptionError, "config.set(**d)")
242
243 def test_set_with_unknown_option():
244     boolopt = BoolOption("b", "", default=False)
245     descr = OptionDescription("opt", "", [
246         OptionDescription("s1", "", [boolopt]),
247         IntOption("int", "", default=42)])
248     d = {'s1.a': True, 'int': 23}
249     config = Config(descr)
250     raises(NoMatchingOptionFound, "config.set(**d)")
251
252
253 def test_set_symlink_option():
254     boolopt = BoolOption("b", "", default=False)
255     linkopt = SymLinkOption("c", "s1.b")
256     descr = OptionDescription("opt", "", 
257                               [linkopt, OptionDescription("s1", "", [boolopt])])
258     config = Config(descr)
259     setattr(config, "s1.b", True)
260     setattr(config, "s1.b", False)
261     assert config.s1.b == False
262     assert config.c == False
263     config.c = True
264     assert config.s1.b == True
265     assert config.c == True
266     config.c = False
267     assert config.s1.b == False
268     assert config.c == False
269     
270 #____________________________________________________________
271 def test_config_impl_values():
272     descr = make_description()
273     config = Config(descr, bool=False)
274 #    gcdummy.setoption(config, True, "user")
275 #    config.setoption("gc.dummy", True, "user")
276     #config.gc.dummy = True
277 #    config.setoption("bool", False, "user")
278     config.set(dummy=False)
279     assert config.gc._cfgimpl_values == {'dummy': False, 'float': 2.3, 'name': 'ref'}
280     ## acces to the option object 
281 #    config.gc._cfgimpl_descr.dummy.setoption(config, True, "user")
282     assert config.gc.dummy == False
283 #    config.set(dummy=True)
284 #    assert config.gc.dummy == True
285
286 #____________________________________________________________
287 def test_accepts_multiple_changes_from_option():
288     s = StrOption("string", "", default="string")
289     descr = OptionDescription("options", "", [s])
290     config = Config(descr)
291     config.string = "egg"
292     assert s.getdefault() == "string"
293     assert config.string == "egg"
294     s.setoption(config, 'blah', "default")
295     assert s.getdefault() == "blah"
296     assert config.string == "blah"
297     s.setoption(config, 'bol', "user")
298     assert config.string == 'bol'
299     config.override({'string': "blurp"})
300     assert config.string == 'blurp'
301     assert s.getdefault() == 'blurp'
302
303 def test_allow_multiple_changes_from_config():
304     """
305     a `setoption` from the config object is much like the attribute access, 
306     except the fact that value owner can bet set 
307     """
308     s = StrOption("string", "", default="string")
309     s2 = StrOption("string2", "", default="string")
310     suboption = OptionDescription("bip", "", [s2])
311     descr = OptionDescription("options", "", [s, suboption])
312     config = Config(descr)
313     config.setoption("string", 'blah', "user")
314     config.setoption("string", "oh", "user")    
315     assert config.string == "oh"
316     config.set(string2= 'blah')
317     assert config.bip.string2 == 'blah'
318 # ____________________________________________________________
319
320 def test_overrides_are_defaults():
321     descr = OptionDescription("test", "", [
322         BoolOption("b1", "", default=False),
323         BoolOption("b2", "", default=False),
324         ])
325     # overrides here
326     config = Config(descr, b2=True)
327     assert config.b2
328     # test with a require
329     config.b1 = True
330     assert config.b2
331  
332  # ____________________________________________________________
333  # accessing a value by the get method
334 def test_access_by_get():
335     descr = make_description()
336     cfg = Config(descr)
337     raises(NotFoundError, "cfg.get('idontexist')" )
338     assert cfg.get('wantref') == False
339     assert cfg.gc.dummy == False
340     assert cfg.get('dummy') == False
341
342 def test_access_by_get_whith_hide():
343     b1 = BoolOption("b1", "")
344     b1.hide()
345     descr = OptionDescription("opt", "", [
346     OptionDescription("sub", "", [
347         b1,
348         ChoiceOption("c1", "", ['a', 'b', 'c'], 'a'),
349         BoolOption("d1", ""),
350     ]),
351     BoolOption("b2", ""),
352     BoolOption("d1", ""),
353     ])
354     c = Config(descr)
355     raises(HiddenOptionError, "c.get('b1')")
356