values are in value objects now
[tiramisu.git] / test / test_option_consistency.py
1 import autopath
2 from py.test import raises
3
4 from tiramisu.config import *
5 from tiramisu.option import *
6
7 def make_description():
8     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
9     gcdummy = BoolOption('dummy', 'dummy', default=False)
10     objspaceoption = ChoiceOption('objspace', 'Object space',
11                                 ['std', 'thunk'], 'std')
12     booloption = BoolOption('bool', 'Test boolean option', default=True)
13     intoption = IntOption('int', 'Test int option', default=0)
14     floatoption = FloatOption('float', 'Test float option', default=2.3)
15     stroption = StrOption('str', 'Test string option', default="abc")
16     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
17     wantref_option = BoolOption('wantref', 'Test requires', default=False,
18                                     requires=['boolop'])
19     wantframework_option = BoolOption('wantframework', 'Test requires',
20                                       default=False,
21                                       requires=['boolop'])
22     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
23     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
24                                            wantref_option, stroption,
25                                            wantframework_option,
26                                            intoption, boolop])
27     return descr
28
29 def make_description_duplicates():
30     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
31     ## dummy 1
32     gcdummy = BoolOption('dummy', 'dummy', default=False)
33     objspaceoption = ChoiceOption('objspace', 'Object space',
34                                 ['std', 'thunk'], 'std')
35     booloption = BoolOption('bool', 'Test boolean option', default=True)
36     intoption = IntOption('int', 'Test int option', default=0)
37     floatoption = FloatOption('float', 'Test float option', default=2.3)
38     stroption = StrOption('str', 'Test string option', default="abc")
39     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
40     wantref_option = BoolOption('wantref', 'Test requires', default=False,
41                                     requires=['boolop'])
42     wantframework_option = BoolOption('wantframework', 'Test requires',
43                                       default=False,
44                                       requires=['boolop'])
45     # dummy2 (same path)
46     gcdummy2  = BoolOption('dummy', 'dummy2', default=True)
47     # dummy3 (same name)
48     gcdummy3  = BoolOption('dummy', 'dummy2', default=True)
49     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, gcdummy2, floatoption])
50     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
51                                            wantref_option, stroption,
52                                            wantframework_option,
53                                            intoption, boolop, gcdummy3])
54     return descr
55
56 def test_identical_paths():
57     """If in the schema (the option description) there is something that
58     have the same name, an exection is raised
59     """
60     descr = make_description_duplicates()
61     raises(ConflictConfigError, "cfg = Config(descr)")
62
63 def make_description2():
64     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
65     gcdummy = BoolOption('dummy', 'dummy', default=False)
66
67     floatoption = FloatOption('float', 'Test float option', default=2.3)
68
69     objspaceoption = ChoiceOption('objspace', 'Object space',
70                                 ['std', 'thunk'], 'std')
71     booloption = BoolOption('bool', 'Test boolean option', default=True)
72     intoption = IntOption('int', 'Test int option', default=0)
73     stroption = StrOption('str', 'Test string option', default="abc")
74     # first multi
75     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
76     boolop.enable_multi()
77     wantref_option = BoolOption('wantref', 'Test requires', default=False,
78                                     requires=['boolop'])
79     # second multi
80     wantframework_option = BoolOption('wantframework', 'Test requires',
81                                       default=False,
82                                       requires=['boolop'])
83     wantframework_option.enable_multi()
84
85     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
86     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
87                                            wantref_option, stroption,
88                                            wantframework_option,
89                                            intoption, boolop])
90     return descr
91
92 # FIXME: il faudra tester les validations sur les multis
93 #def test_multi_constraints():
94 #    "a multi in a constraint has to have the same length"
95 #    descr = make_description2()
96 #    cfg = Config(descr)
97 #    cfg.boolop = [True, True, False]
98 #    cfg.wantframework = [False, False, True]
99 #
100 #def test_multi_raise():
101 #    "a multi in a constraint has to have the same length"
102 #    # FIXME fusionner les deux tests, MAIS PROBLEME :
103 #    # il ne devrait pas etre necessaire de refaire une config
104 #    # si la valeur est modifiee une deuxieme fois ->
105 #    #raises(ConflictConfigError, "cfg.wantframework = [False, False, True]")
106 #    #   ExceptionFailure: 'DID NOT RAISE'
107 #    descr = make_description2()
108 #    cfg = Config(descr)
109 #    cfg.boolop = [True]
110 #    raises(ConflictConfigError, "cfg.wantframework = [False, False, True]")
111 # ____________________________________________________________
112 # adding dynamically new options description schema
113 def test_newoption_add_in_descr():
114     descr = make_description()
115     newoption = BoolOption('newoption', 'dummy twoo', default=False)
116     descr.add_child(newoption)
117     config = Config(descr)
118     assert config.newoption == False
119
120 def test_newoption_add_in_subdescr():
121     descr = make_description()
122     newoption = BoolOption('newoption', 'dummy twoo', default=False)
123     descr.gc.add_child(newoption)
124     config = Config(descr)
125     config.bool = False
126     assert config.gc.newoption == False
127
128 #def test_newoption_add_in_config():
129 #    descr = make_description()
130 #    config = Config(descr)
131 #    config.bool = False
132 #    newoption = BoolOption('newoption', 'dummy twoo', default=False)
133 #    descr.add_child(newoption)
134 #    config.cfgimpl_update()
135 #    assert config.newoption == False
136 # ____________________________________________________________
137 def make_description_requires():
138     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
139     gcdummy = BoolOption('dummy', 'dummy', default=False)
140
141     floatoption = FloatOption('float', 'Test float option', default=2.3)
142
143     objspaceoption = ChoiceOption('objspace', 'Object space',
144                                 ['std', 'thunk'], 'std')
145     booloption = BoolOption('bool', 'Test boolean option', default=True)
146     intoption = IntOption('int', 'Test int option', default=0)
147     stroption = StrOption('str', 'Test string option', default="abc",
148                           requires=[('int', 1, 'hide')])
149
150     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
151     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
152                                            stroption, intoption])
153     return descr
154
155 def test_hidden_if_in():
156     descr = make_description_requires()
157     cfg = Config(descr)
158     intoption = cfg.unwrap_from_path('int')
159     stroption = cfg.unwrap_from_path('str')
160     assert not stroption._is_hidden()
161     cfg.int = 1
162     raises(PropertiesOptionError, "cfg.str")
163     raises(PropertiesOptionError, 'cfg.str= "uvw"')
164     assert stroption._is_hidden()
165
166 def test_hidden_if_in_with_group():
167     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
168     gcdummy = BoolOption('dummy', 'dummy', default=False)
169
170     floatoption = FloatOption('float', 'Test float option', default=2.3)
171
172     objspaceoption = ChoiceOption('objspace', 'Object space',
173                                 ['std', 'thunk'], 'std')
174     booloption = BoolOption('bool', 'Test boolean option', default=True)
175     intoption = IntOption('int', 'Test int option', default=0)
176     stroption = StrOption('str', 'Test string option', default="abc")
177     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption],
178                                                   requires=[('int', 1, 'hide')])
179     descr = OptionDescription('constraints', '', [gcgroup, booloption,
180                                           objspaceoption, stroption, intoption])
181     cfg = Config(descr)
182     assert not gcgroup._is_hidden()
183     cfg.int = 1
184     raises(PropertiesOptionError, "cfg.gc.name")
185     assert gcgroup._is_hidden()
186
187 def test_disabled_with_group():
188     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
189     gcdummy = BoolOption('dummy', 'dummy', default=False)
190
191     floatoption = FloatOption('float', 'Test float option', default=2.3)
192
193     objspaceoption = ChoiceOption('objspace', 'Object space',
194                                 ['std', 'thunk'], 'std')
195     booloption = BoolOption('bool', 'Test boolean option', default=True)
196     intoption = IntOption('int', 'Test int option', default=0)
197     stroption = StrOption('str', 'Test string option', default="abc")
198     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption],
199                                                   requires=[('int', 1, 'disable')])
200     descr = OptionDescription('constraints', '', [gcgroup, booloption,
201                                           objspaceoption, stroption, intoption])
202     cfg = Config(descr)
203     assert not gcgroup._is_disabled()
204     cfg.int = 1
205     raises(PropertiesOptionError, "cfg.gc.name")
206     assert gcgroup._is_disabled()
207 #____________________________________________________________
208
209 def make_description_callback():
210     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
211     gcdummy = BoolOption('dummy', 'dummy', callback="toto")
212     objspaceoption = ChoiceOption('objspace', 'Object space',
213                                 ['std', 'thunk'], 'std')
214     booloption = BoolOption('bool', 'Test boolean option', default=True)
215     intoption = IntOption('int', 'Test int option', default=0)
216     floatoption = FloatOption('float', 'Test float option', default=2.3)
217     stroption = StrOption('str', 'Test string option', default="abc")
218     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
219     wantref_option = BoolOption('wantref', 'Test requires', default=False,
220                                     requires=['boolop'])
221     wantframework_option = BoolOption('wantframework', 'Test requires',
222                                       default=False,
223                                       requires=['boolop'])
224     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
225     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
226                                            wantref_option, stroption,
227                                            wantframework_option,
228                                            intoption, boolop])
229     return descr
230
231 def test_has_callback():
232     descr = make_description_callback()
233     # here the owner is 'default'
234     config = Config(descr)
235     config.bool = False
236     # because dummy has a callback
237     dummy = config.unwrap_from_path('gc.dummy')
238     settings = config.cfgimpl_get_settings()
239     settings.freeze()
240     dummy.freeze()
241     raises(TypeError, "config.gc.dummy = True")
242
243 def test_freeze_and_has_callback_with_setoption():
244     descr = make_description_callback()
245     config = Config(descr)
246     config.bool = False
247     settings = config.cfgimpl_get_settings()
248     settings.freeze()
249     dummy = config.unwrap_from_path('gc.dummy')
250     dummy.freeze()
251     raises(TypeError, "config.gc.setoption('dummy', True, 'gen_config')")
252 #____________________________________________________________