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