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, OptionDescription
8
9
10 def make_description():
11     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
12     gcdummy = BoolOption('dummy', 'dummy', default=False)
13     objspaceoption = ChoiceOption('objspace', 'Object space',
14                                   ('std', 'thunk'), 'std')
15     booloption = BoolOption('bool', 'Test boolean option', default=True)
16     booloption2 = BoolOption('bool', 'Test boolean option', default=True)
17     intoption = IntOption('int', 'Test int option', default=0)
18     floatoption2 = FloatOption('float', 'Test float option', default=2.3)
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', 'Tests', default=False)
23     wantframework_option = BoolOption('wantframework', 'Test', default=False)
24     gcgroup2 = OptionDescription('gc2', '', [booloption2])
25     gcgroup = OptionDescription('gc', '', [gcgroup2, gcoption, gcdummy, floatoption])
26     descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
27                                                wantref_option, stroption,
28                                                wantframework_option,
29                                                intoption, boolop, floatoption2])
30     return descr
31
32
33 #FIXME
34 #def test_compare_configs():
35 #    "config object comparison"
36 #    descr = make_description()
37 #    conf1 = Config(descr)
38 #    conf2 = Config(descr)
39 #    conf2.wantref = True
40 #    assert conf1 != conf2
41 #    assert hash(conf1) != hash(conf2)
42 #    #assert conf1.getkey() != conf2.getkey()
43 #    conf1.wantref = True
44 #    assert conf1 == conf2
45 #    assert hash(conf1) == hash(conf2)
46 #    #assert conf1.getkey() == conf2.getkey()
47 #    conf2.gc.dummy = True
48 #    assert conf1 != conf2
49 #    assert hash(conf1) != hash(conf2)
50 #    #assert conf1.getkey() != conf2.getkey()
51 #    conf1.gc.dummy = True
52 #    assert conf1 == conf2
53 #    assert hash(conf1) == hash(conf2)
54 #    assert not conf1 == 'conf2'
55 #    assert conf1 != 'conf2'
56 # ____________________________________________________________
57
58
59 def test_iter_config():
60     "iteration on config object"
61     s = StrOption("string", "", default="string")
62     s2 = StrOption("string2", "", default="string2")
63     descr = OptionDescription("options", "", [s, s2])
64     config = Config(descr)
65     assert [(name, value) for name, value in config] == \
66         [('string', 'string'), ('string2', 'string2')]
67
68
69 def test_iter_subconfig():
70     "iteration on config sub object"
71     descr = make_description()
72     conf = Config(descr)
73     for (name, value), (gname, gvalue) in \
74             zip(conf.gc, [("name", "ref"), ("dummy", False)]):
75         assert name == gname
76         assert value == gvalue
77
78
79 def test_str():
80     descr = make_description()
81     c = Config(descr)
82     c  # does not crash
83
84
85 def test_make_dict():
86     "serialization of the whole config to a dict"
87     descr = OptionDescription("opt", "", [
88         OptionDescription("s1", "", [
89             BoolOption("a", "", default=False)]),
90         IntOption("int", "", default=42)])
91     config = Config(descr)
92     d = config.make_dict()
93     assert d == {"s1.a": False, "int": 42}
94     config.int = 43
95     config.s1.a = True
96     d = config.make_dict()
97     assert d == {"s1.a": True, "int": 43}
98     d2 = config.make_dict(flatten=True)
99     assert d2 == {'a': True, 'int': 43}
100     raises(ValueError, 'd2 = config.make_dict(withvalue="3")')
101
102
103 def test_find_in_config():
104     "finds option in config"
105     descr = make_description()
106     conf = Config(descr)
107     assert conf.find(byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
108     assert conf.find(byname='float') == [conf.unwrap_from_path('gc.float'), conf.unwrap_from_path('float')]
109     assert conf.find_first(byname='bool') == conf.unwrap_from_path('gc.gc2.bool')
110     assert conf.find_first(byname='dummy') == conf.unwrap_from_path('gc.dummy')
111     assert conf.find_first(byname='float') == conf.unwrap_from_path('gc.float')
112     assert conf.find(bytype=ChoiceOption) == [conf.unwrap_from_path('gc.name'), conf.unwrap_from_path('objspace')]
113     assert conf.find_first(bytype=ChoiceOption) == conf.unwrap_from_path('gc.name')
114     assert conf.find(byvalue='ref') == [conf.unwrap_from_path('gc.name')]
115     assert conf.find_first(byvalue='ref') == conf.unwrap_from_path('gc.name')
116     # combinaison of filters
117     assert conf.find(bytype=BoolOption, byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
118     assert conf.find_first(bytype=BoolOption, byname='dummy') == conf.unwrap_from_path('gc.dummy')
119     assert conf.find(byvalue=False, byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
120     assert conf.find_first(byvalue=False, byname='dummy') == conf.unwrap_from_path('gc.dummy')
121     #subconfig
122     assert conf.gc.find(byname='dummy') == [conf.unwrap_from_path('gc.dummy')]
123     assert conf.gc.find(byname='float') == [conf.unwrap_from_path('gc.float')]
124     assert conf.gc.find(byname='bool') == [conf.unwrap_from_path('gc.gc2.bool')]
125     raises(AttributeError, "conf.gc.find(byname='wantref').first()")
126     # not OptionDescription
127     raises(AttributeError, "conf.find_first(byname='gc')")
128     raises(AttributeError, "conf.gc.find_first(byname='gc2')")
129
130
131 def test_find_multi():
132     b = BoolOption('bool', '', multi=True)
133     o = OptionDescription('od', '', [b])
134     conf = Config(o)
135     raises(AttributeError, "conf.find(byvalue=True)")
136     raises(AttributeError, "conf.find_first(byvalue=True)")
137     conf.bool.append(False)
138     raises(AttributeError, "conf.find(byvalue=True)")
139     raises(AttributeError, "conf.find_first(byvalue=True)")
140     conf.bool.append(False)
141     raises(AttributeError, "conf.find(byvalue=True)")
142     raises(AttributeError, "conf.find_first(byvalue=True)")
143     conf.bool.append(True)
144     assert conf.find(byvalue=True) == [b]
145     assert conf.find_first(byvalue=True) == b
146
147
148 def test_does_not_find_in_config():
149     descr = make_description()
150     conf = Config(descr)
151     raises(AttributeError, "conf.find(byname='IDontExist')")
152
153
154 def test_filename():
155     a = FilenameOption('a', '')
156     o = OptionDescription('o', '', [a])
157     c = Config(o)
158     c.a = u'/'
159     c.a = u'/tmp'
160     c.a = u'/tmp/'
161     c.a = u'/tmp/text.txt'
162     c.a = u'tmp'
163     c.a = u'tmp/'
164     c.a = u'tmp/text.txt'
165     raises(ValueError, "c.a = u'/tmp/with space.txt'")
166     raises(ValueError, "c.a = u'/tmp/with$.txt'")