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