1 "config.set() or config.setoption() or option.setoption()"
3 from py.test import raises
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
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',
25 gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
26 descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
27 wantref_option, stroption,
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
42 assert config.string == "foo"
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"
53 "if value is None, resets to default owner"
54 s = StrOption("string", "", default="string")
55 descr = OptionDescription("options", "", [s])
56 config = Config(descr)
58 assert config.string == "foo"
59 assert config.getowner(s) == owners.user
61 assert config.string == 'string'
62 assert config.getowner(s) == owners.default
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)
71 assert config.string == ["string"]
72 assert config.getowner(s) == 'default'
73 config.string = ["eggs", "spam", "foo"]
74 assert config.getowner(s) == 'user'
77 # assert config.string == ["string"]
78 assert config.getowner(s) == 'default'
79 raises(ValueError, "config.string = None")
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 == []
94 def test_idontexist():
95 descr = make_description()
97 raises(AttributeError, "cfg.idontexist")
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"]
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'
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'
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()
139 assert not 'hidden' in setting[stroption]
141 raises(PropertiesOptionError, "config.str = ['a', 'b']")
142 assert 'hidden' in setting[stroption]
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]
155 assert not 'hidden' in setting[stroption]
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 descr = OptionDescription("options", "", [intoption])
162 stroption = StrOption('str', 'Test string option', default=["abc"],
163 requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)
164 descr = OptionDescription("opt", "", [stroption])
165 descr2 = OptionDescription("opt2", "", [intoption, s, descr])
166 config = Config(descr2)
167 setting = config.cfgimpl_get_settings()
169 assert not 'hidden' in setting[stroption]
171 raises(PropertiesOptionError, "config.opt.str = ['a', 'b']")
172 assert 'hidden' in setting[stroption]
175 def test_apply_requires_from_config():
176 s = StrOption("string", "", default=["string"], multi=True)
177 intoption = IntOption('int', 'Test int option', default=0)
178 descr = OptionDescription("options", "", [intoption])
179 stroption = StrOption('str', 'Test string option', default=["abc"],
180 requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)
181 descr = OptionDescription("opt", "", [stroption])
182 descr2 = OptionDescription("opt2", "", [intoption, s, descr])
183 config = Config(descr2)
184 setting = config.cfgimpl_get_settings()
186 assert not 'hidden' in setting[stroption]
188 raises(PropertiesOptionError, 'config.opt.str')
189 assert 'hidden' in setting[stroption]
192 def test_apply_requires_with_disabled():
193 s = StrOption("string", "", default=["string"], multi=True)
194 intoption = IntOption('int', 'Test int option', default=0)
195 descr = OptionDescription("options", "", [intoption])
196 stroption = StrOption('str', 'Test string option', default=["abc"],
197 requires=[{'option': intoption, 'expected': 1, 'action': 'disabled'}], multi=True)
198 descr = OptionDescription("opt", "", [stroption])
199 descr2 = OptionDescription("opt2", "", [intoption, s, descr])
200 config = Config(descr2)
201 setting = config.cfgimpl_get_settings()
203 assert not 'disabled' in setting[stroption]
205 raises(PropertiesOptionError, 'config.opt.str')
206 assert 'disabled' in setting[stroption]
209 def test_multi_with_requires_with_disabled_in_another_group():
210 s = StrOption("string", "", default=["string"], multi=True)
211 intoption = IntOption('int', 'Test int option', default=0)
212 descr = OptionDescription("options", "", [intoption])
213 stroption = StrOption('str', 'Test string option', default=["abc"],
214 requires=[{'option': intoption, 'expected': 1, 'action': 'disabled'}], multi=True)
215 descr = OptionDescription("opt", "", [stroption])
216 descr2 = OptionDescription("opt2", "", [intoption, s, descr])
217 config = Config(descr2)
218 setting = config.cfgimpl_get_settings()
220 assert not 'disabled' in setting[stroption]
222 raises(PropertiesOptionError, "config.opt.str = ['a', 'b']")
223 assert 'disabled' in setting[stroption]
226 def test_multi_with_requires_that_is_multi():
227 s = StrOption("string", "", default=["string"], multi=True)
228 intoption = IntOption('int', 'Test int option', default=[0], multi=True)
229 raises(ValueError, "StrOption('str', 'Test string option', default=['abc'], requires=[{'option': intoption, 'expected': 1, 'action': 'hidden'}], multi=True)")
232 def test_multi_with_bool():
233 s = BoolOption("bool", "", default=[False], multi=True)
234 descr = OptionDescription("options", "", [s])
235 config = Config(descr)
236 assert descr.bool.impl_is_multi() is True
237 config.bool = [True, False]
238 assert config.cfgimpl_get_values()[s] == [True, False]
239 assert config.bool == [True, False]
242 def test_multi_with_bool_two():
243 s = BoolOption("bool", "", default=[False], multi=True)
244 descr = OptionDescription("options", "", [s])
245 config = Config(descr)
246 assert descr.bool.impl_is_multi() is True
247 raises(ValueError, "config.bool = True")
250 def test_choice_access_with_multi():
251 ch = ChoiceOption("t1", "", ("a", "b"), default=["a"], multi=True)
252 descr = OptionDescription("options", "", [ch])
253 config = Config(descr)
254 config.t1 = ["a", "b", "a", "b"]
255 assert config.t1 == ["a", "b", "a", "b"]
258 #____________________________________________________________
259 def test_accepts_multiple_changes_from_option():
260 s = StrOption("string", "", default="string")
261 descr = OptionDescription("options", "", [s])
262 config = Config(descr)
263 config.string = "egg"
264 assert s.impl_getdefault() == "string"
265 assert config.string == "egg"
266 config.string = 'blah'
267 assert s.impl_getdefault() == "string"
268 assert config.string == "blah"
269 config.string = 'bol'
270 assert config.string == 'bol'
273 def test_allow_multiple_changes_from_config():
275 a `setoption` from the config object is much like the attribute access,
276 except the fact that value owner can bet set
278 s = StrOption("string", "", default="string")
279 s2 = StrOption("string2", "", default="string")
280 suboption = OptionDescription("bip", "", [s2])
281 descr = OptionDescription("options", "", [s, suboption])
282 config = Config(descr)
284 assert config.string == "oh"
285 config.string = "blah"
286 assert config.string == "blah"
289 # ____________________________________________________________
290 # accessing a value by the get method
291 def test_access_by_get():
292 descr = make_description()
294 raises(AttributeError, "cfg.find(byname='idontexist')")
295 assert cfg.find_first(byname='wantref', type_='value') is False
296 assert cfg.gc.dummy is False
297 assert cfg.find_first(byname='dummy', type_='value') is False
300 def test_access_by_get_whith_hide():
301 b1 = BoolOption("b1", "", properties=(('hidden'),))
302 descr = OptionDescription("opt", "",
303 [OptionDescription("sub", "",
304 [b1, ChoiceOption("c1", "", ('a', 'b', 'c'), 'a'),
305 BoolOption("d1", "")]),
306 BoolOption("b2", ""),
307 BoolOption("d1", "")])
310 raises(AttributeError, "c.find(byname='b1')")
313 def test_append_properties():
314 descr = make_description()
316 setting = cfg.cfgimpl_get_settings()
317 option = cfg.cfgimpl_get_description().gc.dummy
318 assert option._properties == tuple()
319 assert not 'test' in setting[option]
320 setting[option].append('test')
321 assert option._properties == tuple()
322 assert 'test' in setting[option]
325 def test_reset_properties():
326 descr = make_description()
328 setting = cfg.cfgimpl_get_settings()
329 option = cfg.cfgimpl_get_description().gc.dummy
330 assert setting._p_.get_properties(cfg) == {}
331 setting.append('frozen')
332 assert setting._p_.get_properties(cfg) == {None: set(('frozen', 'expire', 'validator'))}
334 assert setting._p_.get_properties(cfg) == {}
335 setting[option].append('test')
336 assert setting._p_.get_properties(cfg) == {'gc.dummy': set(('test',))}
338 assert setting._p_.get_properties(cfg) == {'gc.dummy': set(('test',))}
339 setting.append('frozen')
340 assert setting._p_.get_properties(cfg) == {None: set(('frozen', 'expire', 'validator')), 'gc.dummy': set(('test',))}
341 setting.reset(option)
342 assert setting._p_.get_properties(cfg) == {None: set(('frozen', 'expire', 'validator'))}
343 setting[option].append('test')
344 assert setting._p_.get_properties(cfg) == {None: set(('frozen', 'expire', 'validator')), 'gc.dummy': set(('test',))}
345 setting.reset(all_properties=True)
346 assert setting._p_.get_properties(cfg) == {}
347 raises(ValueError, 'setting.reset(all_properties=True, opt=option)')
349 setting[a].append('test')
354 def test_reset_multiple():
355 descr = make_description()
357 setting = cfg.cfgimpl_get_settings()
358 option = cfg.cfgimpl_get_description().gc.dummy
359 setting.append('frozen')
360 setting[option].append('test')
363 setting.append('frozen')
364 setting[option].append('test')
365 setting.reset(option)
366 setting.reset(option)
367 setting.append('frozen')
368 setting[option].append('test')
369 setting.reset(all_properties=True)
370 setting.reset(all_properties=True)