Merge branch 'master' into orm
[tiramisu.git] / test / test_config_api.py
1 "configuration objects global API"
2 import autopath
3 from py.test import raises
4
5 from tiramisu.config import Config
6 from tiramisu.option import IntOption, FloatOption, StrOption, ChoiceOption, \
7     BoolOption, FilenameOption, UnicodeOption, SymLinkOption, IPOption, \
8     PortOption, OptionDescription
9
10
11 def make_description():
12     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
13     gcdummy = BoolOption('dummy', 'dummy', default=False)
14     prop = BoolOption('prop', '', properties=('disabled',))
15     prop2 = BoolOption('prop', '', properties=('hidden',))
16     objspaceoption = ChoiceOption('objspace', 'Object space',
17                                   ('std', 'thunk'), 'std')
18     booloption = BoolOption('bool', 'Test boolean option', default=True)
19     booloption2 = BoolOption('bool', 'Test boolean option', default=False)
20     intoption = IntOption('int', 'Test int option', default=0)
21     floatoption2 = FloatOption('float', 'Test float option', default=2.3)
22     floatoption = FloatOption('float', 'Test float option', default=2.3)
23     stroption = StrOption('str', 'Test string option', default="abc")
24     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
25     wantref_option = BoolOption('wantref', 'Tests', default=False)
26     wantframework_option = BoolOption('wantframework', 'Test', default=False)
27     gcgroup2 = OptionDescription('gc2', '', [booloption2, prop])
28     gcgroup = OptionDescription('gc', '', [gcgroup2, gcoption, gcdummy, floatoption, prop2])
29     descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
30                                                wantref_option, stroption,
31                                                wantframework_option,
32                                                intoption, boolop, floatoption2])
33     return descr
34
35
36 #FIXME
37 #def test_compare_configs():
38 #    "config object comparison"
39 #    descr = make_description()
40 #    conf1 = Config(descr)
41 #    conf2 = Config(descr)
42 #    conf2.wantref = True
43 #    assert conf1 != conf2
44 #    assert hash(conf1) != hash(conf2)
45 #    #assert conf1.getkey() != conf2.getkey()
46 #    conf1.wantref = True
47 #    assert conf1 == conf2
48 #    assert hash(conf1) == hash(conf2)
49 #    #assert conf1.getkey() == conf2.getkey()
50 #    conf2.gc.dummy = True
51 #    assert conf1 != conf2
52 #    assert hash(conf1) != hash(conf2)
53 #    #assert conf1.getkey() != conf2.getkey()
54 #    conf1.gc.dummy = True
55 #    assert conf1 == conf2
56 #    assert hash(conf1) == hash(conf2)
57 #    assert not conf1 == 'conf2'
58 #    assert conf1 != 'conf2'
59 # ____________________________________________________________
60
61
62 def test_iter_config():
63     "iteration on config object"
64     s = StrOption("string", "", default="string")
65     s2 = StrOption("string2", "", default="string2")
66     descr = OptionDescription("options", "", [s, s2])
67     config = Config(descr)
68     assert [(name, value) for name, value in config] == \
69         [('string', 'string'), ('string2', 'string2')]
70
71
72 def test_iter_config_property():
73     "iteration on config object"
74     s = StrOption("string", "", default="string", properties=('disabled',))
75     s2 = StrOption("string2", "", default="string2")
76     descr = OptionDescription("options", "", [s, s2])
77     config = Config(descr)
78     config.read_only()
79     assert [(name, value) for name, value in config] == \
80         [('string2', 'string2')]
81
82
83 def test_iter_subconfig():
84     "iteration on config sub object"
85     descr = make_description()
86     conf = Config(descr)
87     for (name, value), (gname, gvalue) in \
88             zip(conf.gc, [("name", "ref"), ("dummy", False)]):
89         assert name == gname
90         assert value == gvalue
91
92
93 def test_str():
94     descr = make_description()
95     c = Config(descr)
96     c  # does not crash
97
98
99 def test_make_dict():
100     "serialization of the whole config to a dict"
101     descr = OptionDescription("opt", "", [
102         OptionDescription("s1", "", [
103             BoolOption("a", "", default=False)]),
104         IntOption("int", "", default=42)])
105     config = Config(descr)
106     d = config.make_dict()
107     assert d == {"s1.a": False, "int": 42}
108     config.int = 43
109     config.s1.a = True
110     d = config.make_dict()
111     assert d == {"s1.a": True, "int": 43}
112     d2 = config.make_dict(flatten=True)
113     assert d2 == {'a': True, 'int': 43}
114     raises(ValueError, 'd2 = config.make_dict(withvalue="3")')
115
116
117 def test_find_in_config():
118     "finds option in config"
119     descr = make_description()
120     conf = Config(descr)
121     conf.read_only()
122     assert conf.find(byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
123     assert conf.find(byname='float') == [conf.unwrap_from_path('gc.float'), conf.unwrap_from_path('float')]
124     assert conf.find_first(byname='bool') == conf.unwrap_from_path('gc.gc2.bool')
125     assert conf.find_first(byname='bool', byvalue=True) == conf.unwrap_from_path('bool')
126     assert conf.find_first(byname='dummy') == conf.unwrap_from_path('gc.dummy')
127     assert conf.find_first(byname='float') == conf.unwrap_from_path('gc.float')
128     assert conf.find(bytype=ChoiceOption) == [conf.unwrap_from_path('gc.name'), conf.unwrap_from_path('objspace')]
129     assert conf.find_first(bytype=ChoiceOption) == conf.unwrap_from_path('gc.name')
130     assert conf.find(byvalue='ref') == [conf.unwrap_from_path('gc.name')]
131     assert conf.find_first(byvalue='ref') == conf.unwrap_from_path('gc.name')
132     assert conf.find(byname='prop') == [conf.unwrap_from_path('gc.prop')]
133     conf.read_write()
134     raises(AttributeError, "assert conf.find(byname='prop')")
135     assert conf.find(byname='prop', check_properties=False) == [conf.unwrap_from_path('gc.prop'), conf.unwrap_from_path('gc.gc2.prop')]
136     # combinaison of filters
137     assert conf.find(bytype=BoolOption, byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
138     assert conf.find_first(bytype=BoolOption, byname='dummy') == conf.unwrap_from_path('gc.dummy')
139     assert conf.find(byvalue=False, byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
140     assert conf.find_first(byvalue=False, byname='dummy') == conf.unwrap_from_path('gc.dummy')
141     #subconfig
142     assert conf.gc.find(byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
143     assert conf.gc.find(byname='float') == [conf.unwrap_from_path('gc.float')]
144     assert conf.gc.find(byname='bool') == [conf.unwrap_from_path('gc.gc2.bool')]
145     assert conf.gc.find_first(byname='bool', byvalue=False) == conf.unwrap_from_path('gc.gc2.bool')
146     raises(AttributeError, "assert conf.gc.find_first(byname='bool', byvalue=True)")
147     raises(AttributeError, "conf.gc.find(byname='wantref').first()")
148     assert conf.gc.find(byname='prop', check_properties=False) == [conf.unwrap_from_path('gc.prop'), conf.unwrap_from_path('gc.gc2.prop')]
149     conf.read_only()
150     assert conf.gc.find(byname='prop') == [conf.unwrap_from_path('gc.prop')]
151     # not OptionDescription
152     raises(AttributeError, "conf.find_first(byname='gc')")
153     raises(AttributeError, "conf.gc.find_first(byname='gc2')")
154     raises(ValueError, "conf.find(byname='bool', type_='unknown')")
155
156
157 def test_find_multi():
158     b = BoolOption('bool', '', multi=True)
159     o = OptionDescription('od', '', [b])
160     conf = Config(o)
161     raises(AttributeError, "conf.find(byvalue=True)")
162     raises(AttributeError, "conf.find_first(byvalue=True)")
163     conf.bool.append(False)
164     raises(AttributeError, "conf.find(byvalue=True)")
165     raises(AttributeError, "conf.find_first(byvalue=True)")
166     conf.bool.append(False)
167     raises(AttributeError, "conf.find(byvalue=True)")
168     raises(AttributeError, "conf.find_first(byvalue=True)")
169     conf.bool.append(True)
170     assert conf.find(byvalue=True) == [b]
171     assert conf.find_first(byvalue=True) == b
172
173
174 def test_does_not_find_in_config():
175     descr = make_description()
176     conf = Config(descr)
177     raises(AttributeError, "conf.find(byname='IDontExist')")
178
179
180 def test_filename():
181     a = FilenameOption('a', '')
182     o = OptionDescription('o', '', [a])
183     c = Config(o)
184     c.a = u'/'
185     c.a = u'/tmp'
186     c.a = u'/tmp/'
187     c.a = u'/tmp/text.txt'
188     c.a = u'tmp'
189     c.a = u'tmp/'
190     c.a = u'tmp/text.txt'
191     raises(ValueError, "c.a = u'/tmp/with space.txt'")
192     raises(ValueError, "c.a = u'/tmp/with$.txt'")
193
194
195 def test_iter_all():
196     s = StrOption("string", "", default="string")
197     s2 = StrOption("string2", "", default="string2")
198     descr = OptionDescription("options", "", [s, s2])
199     config = Config(descr)
200     assert list(config.iter_all()) == [('string', 'string'), ('string2', 'string2')]
201     for i in config.iter_all():
202         #test StopIteration
203         break
204
205
206 def test_iter_all_prop():
207     s = StrOption("string", "", default="string", properties=('disabled',))
208     s2 = StrOption("string2", "", default="string2")
209     descr = OptionDescription("options", "", [s, s2])
210     config = Config(descr)
211     config.read_only()
212     assert list(config.iter_all()) == [('string2', 'string2')]
213
214
215 def test_invalid_option():
216     raises(TypeError, "ChoiceOption('a', '', [1, 2])")
217     raises(TypeError, "ChoiceOption('a', '', 1)")
218     raises(TypeError, "ChoiceOption('a', '', (1,), open_values='string')")
219     raises(ValueError, "ChoiceOption('a', '', (1,), 3)")
220     raises(ValueError, "FloatOption('a', '', 'string')")
221     raises(ValueError, "UnicodeOption('a', '', 1)")
222     raises(ValueError, "SymLinkOption('a', 'string')")
223     raises(ValueError, "IPOption('a', '', 1)")
224     raises(ValueError, "IPOption('a', '', 'string')")
225     raises(ValueError, "PortOption('a', '', 'string')")
226     raises(ValueError, "PortOption('a', '', '11:12:13', allow_range=True)")
227     raises(ValueError, "PortOption('a', '', 11111111111111111111)")