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