sqlalchemy
[tiramisu.git] / test / test_config.py
1 # -*- coding: utf-8 -*-
2
3 """theses tests are much more to test that config, option description, vs...
4 **it's there** and answers via attribute access"""
5
6 import autopath
7 from py.test import raises
8
9 from tiramisu.config import Config
10 from tiramisu.option import IntOption, FloatOption, StrOption, ChoiceOption, \
11     BoolOption, UnicodeOption, OptionDescription
12 from tiramisu.error import ConflictError, ConfigError
13
14
15 def make_description():
16     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
17     gcdummy = BoolOption('dummy', 'dummy', default=False)
18     objspaceoption = ChoiceOption('objspace', 'Object space',
19                                   ('std', 'thunk'), 'std')
20     booloption = BoolOption('bool', 'Test boolean option', default=True)
21     intoption = IntOption('int', 'Test int option', default=0)
22     floatoption = FloatOption('float', 'Test float option', default=2.3)
23     stroption = StrOption('str', 'Test string option', default="abc", properties=('mandatory', ))
24     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
25     wantref_option = BoolOption('wantref', 'Test requires', default=False)
26     wantframework_option = BoolOption('wantframework', 'Test requires',
27                                       default=False)
28
29     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
30     descr = OptionDescription('tiram', '', [gcgroup, booloption, objspaceoption,
31                                             wantref_option, stroption,
32                                             wantframework_option,
33                                             intoption, boolop])
34     return descr
35
36
37 def test_base_config():
38     """making a :class:`tiramisu.config.Config()` object
39     and a :class:`tiramisu.option.OptionDescription()` object
40     """
41     gcdummy = BoolOption('dummy', 'dummy', default=False)
42     descr = OptionDescription('tiramisu', '', [gcdummy])
43     cfg = Config(descr)
44     assert cfg.dummy is False
45     dm = cfg.unwrap_from_path('dummy')
46     assert dm.impl_getname() == 'dummy'
47
48
49 def test_not_config():
50     assert raises(TypeError, "Config('str')")
51
52
53 def test_base_path():
54     gcdummy = BoolOption('dummy', 'dummy', default=False)
55     descr = OptionDescription('tiramisu', '', [gcdummy])
56     cfg = Config(descr)
57     assert cfg._impl_path is None
58     base = OptionDescription('config', '', [descr])
59     cfg = Config(base)
60     assert cfg._impl_path is None
61     assert cfg.tiramisu._impl_path == 'tiramisu'
62     nbase = OptionDescription('baseconfig', '', [base])
63     cfg = Config(nbase)
64     assert cfg._impl_path is None
65     assert cfg.config._impl_path == 'config'
66     assert cfg.config.tiramisu._impl_path == 'config.tiramisu'
67
68
69 def test_reset_value():
70     descr = make_description()
71     cfg = Config(descr)
72     assert cfg.gc.dummy is False
73     cfg.gc.dummy = True
74     assert cfg.gc.dummy is True
75
76
77 def test_base_config_and_groups():
78     descr = make_description()
79     # overrides the booloption default value
80     config = Config(descr)
81     config.bool = False
82     assert config.gc.name == 'ref'
83     assert config.bool is False
84     nm = config.unwrap_from_path('gc.name')
85     assert nm.impl_getname() == 'name'
86     gc = config.unwrap_from_path('gc')
87     assert gc.impl_getname() == 'gc'
88     #nm = config.unwrap_from_name('name')
89     #assert nm.impl_getname() == 'name'
90
91
92 def test_base_config_in_a_tree():
93     "how options are organized into a tree, see :ref:`tree`"
94     descr = make_description()
95     config = Config(descr)
96     config.bool = False
97     assert config.gc.name == 'ref'
98     config.gc.name = 'framework'
99     assert config.gc.name == 'framework'
100     assert getattr(config, "gc.name") == 'framework'
101
102     assert config.objspace == 'std'
103     config.objspace = 'thunk'
104     assert config.objspace == 'thunk'
105
106     assert config.gc.float == 2.3
107     assert config.int == 0
108     config.gc.float = 3.4
109     config.int = 123
110     assert config.gc.float == 3.4
111     assert config.int == 123
112
113     assert not config.wantref
114
115     assert config.str == "abc"
116     config.str = "def"
117     assert config.str == "def"
118
119     raises(AttributeError, 'config.gc.foo = "bar"')
120
121     config = Config(descr)
122     config.bool = False
123     assert config.gc.name == 'ref'
124     config.wantframework = True
125
126
127 def test_cfgimpl_get_home_by_path():
128     " :meth:`tiramisu.config.SubConfig.cfgimpl_get_home_by_path()` to retrieve a path"
129     descr = make_description()
130     config = Config(descr)
131     config.bool = False
132     assert config.cfgimpl_get_home_by_path('gc.dummy')[1] == 'dummy'
133     assert config.cfgimpl_get_home_by_path('dummy')[1] == 'dummy'
134
135
136 def test_not_valid_properties():
137     raises(TypeError, "stroption = StrOption('str', 'Test string option', default='abc', properties=['mandatory',])")
138
139
140 def test_information_config():
141     descr = make_description()
142     config = Config(descr)
143     string = 'some informations'
144     config.impl_set_information('info', string)
145     assert config.impl_get_information('info') == string
146     raises(ValueError, "config.impl_get_information('noinfo')")
147     assert config.impl_get_information('noinfo', 'default') == 'default'
148
149
150 #FIXME test impl_get_xxx pour OD ou ne pas cacher
151 def test_config_impl_get_path_by_opt():
152     descr = make_description()
153     config = Config(descr)
154     dummy = config.unwrap_from_path('gc.dummy')
155     boo = config.unwrap_from_path('bool')
156     unknown = IntOption('test', '')
157     assert config.cfgimpl_get_description().impl_get_path_by_opt(boo) == 'bool'
158     assert config.cfgimpl_get_description().impl_get_path_by_opt(dummy) == 'gc.dummy'
159     raises(AttributeError, "config.cfgimpl_get_description().impl_get_path_by_opt(unknown)")
160
161
162 def test_config_impl_get_opt_by_path():
163     descr = make_description()
164     config = Config(descr)
165     dummy = config.unwrap_from_path('gc.dummy')
166     boo = config.unwrap_from_path('bool')
167     assert config.cfgimpl_get_description().impl_get_opt_by_path('bool') == boo
168     assert config.cfgimpl_get_description().impl_get_opt_by_path('gc.dummy') == dummy
169     raises(AttributeError, "config.cfgimpl_get_description().impl_get_opt_by_path('gc.unknown')")
170
171
172 def test_information_display():
173     g1 = IntOption('g1', '', 1)
174     g2 = StrOption('g2', '', 'héhé')
175     g3 = UnicodeOption('g3', '', u'héhé')
176     g4 = BoolOption('g4', '', True)
177     g5 = StrOption('g5', '')
178     d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5])
179     root = OptionDescription('root', '', [d1])
180     config = Config(root)
181     config.od == """g1 = 1
182 g2 = héhé
183 g3 = héhé
184 g4 = True
185 g5 = None"""
186     config == '[od]'
187
188
189 def test_get_modified_values():
190     g1 = IntOption('g1', '', 1)
191     g2 = StrOption('g2', '', 'héhé')
192     g3 = UnicodeOption('g3', '', u'héhé')
193     g4 = BoolOption('g4', '', True)
194     g5 = StrOption('g5', '')
195     d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5])
196     root = OptionDescription('root', '', [d1])
197     config = Config(root)
198     assert config.cfgimpl_get_values().get_modified_values() == {}
199     config.od.g5 = 'yes'
200     assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes')}
201     config.od.g4 = True
202     assert config.cfgimpl_get_values().get_modified_values() == {'od.g5': ('user', 'yes'), 'od.g4': ('user', True)}
203
204
205 def test_has_value():
206     g1 = IntOption('g1', '', 1)
207     g2 = StrOption('g2', '', 'héhé')
208     g3 = UnicodeOption('g3', '', u'héhé')
209     g4 = BoolOption('g4', '', True)
210     g5 = StrOption('g5', '')
211     d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5])
212     root = OptionDescription('root', '', [d1])
213     config = Config(root)
214     assert not g5 in config.cfgimpl_get_values()
215     config.od.g5 = 'yes'
216     assert g5 in config.cfgimpl_get_values()
217
218
219 def test_values_not_setitem():
220     g1 = IntOption('g1', '', 1)
221     g2 = StrOption('g2', '', 'héhé')
222     g3 = UnicodeOption('g3', '', u'héhé')
223     g4 = BoolOption('g4', '', True)
224     g5 = StrOption('g5', '')
225     d1 = OptionDescription('od', '', [g1, g2, g3, g4, g5])
226     root = OptionDescription('root', '', [d1])
227     config = Config(root)
228     raises(ValueError, "config.cfgimpl_get_values()[g1] = 2")
229
230
231 def test_duplicated_option():
232     g1 = IntOption('g1', '', 1)
233     #in same OptionDescription
234     raises(ConflictError, "d1 = OptionDescription('od', '', [g1, g1])")
235
236
237 def test_duplicated_option_diff_od():
238     g1 = IntOption('g1', '', 1)
239     d1 = OptionDescription('od1', '', [g1])
240     #in different OptionDescription
241     raises(ConflictError, "d2 = OptionDescription('od2', '', [g1])")
242
243
244
245 def test_cannot_assign_value_to_option_description():
246     descr = make_description()
247     cfg = Config(descr)
248     raises(TypeError, "cfg.gc = 3")
249
250
251 def test_config_multi():
252     i1 = IntOption('test1', '', multi=True)
253     i2 = IntOption('test2', '', multi=True, default_multi=1)
254     i3 = IntOption('test3', '', default=[2], multi=True, default_multi=1)
255     od = OptionDescription('test', '', [i1, i2, i3])
256     config = Config(od)
257     assert config.test1 == []
258     assert config.test2 == []
259     config.test2.append()
260     assert config.test2 == [1]
261     assert config.test3 == [2]
262     config.test3.append()
263     assert config.test3 == [2, 1]
264
265
266 def test_no_validation():
267     i1 = IntOption('test1', '')
268     od = OptionDescription('test', '', [i1])
269     c = Config(od)
270     setting = c.cfgimpl_get_settings()
271     c.test1 = 1
272     raises(ValueError, 'c.test1 = "yes"')
273     assert c.test1 == 1
274     setting.remove('validator')
275     c.test1 = "yes"
276     assert c.test1 == "yes"
277     setting.append('validator')
278     raises(ValueError, 'c.test1')
279     del(c.test1)
280     assert c.test1 is None
281
282
283 def test_delete_config_with_subconfig():
284     test = IntOption('test', '')
285     multi = IntOption('multi', '', multi=True)
286     od = OptionDescription('od', '', [test, multi])
287     odroot = OptionDescription('odroot', '', [od])
288     c = Config(odroot)
289     sub = c.od
290     val = c.cfgimpl_get_values()
291     setting = c.cfgimpl_get_settings()
292     val[test]
293     val[multi]
294     setting[test]
295     sub.make_dict()
296     del(c)
297     raises(ConfigError, 'val[test]')
298     raises(ConfigError, 'val[multi]')
299     raises(ConfigError, 'setting[test]')
300     raises(ConfigError, 'sub.make_dict()')