pass force_properties to value's _setitem and remove config's setoption
[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 from error import ConfigError
7
8 def make_description():
9     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
10     gcdummy = BoolOption('dummy', 'dummy', default=False)
11     objspaceoption = ChoiceOption('objspace', 'Object space',
12                                 ('std', 'thunk'), 'std')
13     booloption = BoolOption('bool', 'Test boolean option', default=True)
14     intoption = IntOption('int', 'Test int option', default=0)
15     floatoption = FloatOption('float', 'Test float option', default=2.3)
16     stroption = StrOption('str', 'Test string option', default="abc")
17     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
18     wantref_option = BoolOption('wantref', 'Test requires', default=False,
19                                     requires=(('boolop', True, 'hidden'),))
20     wantframework_option = BoolOption('wantframework', 'Test requires',
21                                       default=False,
22                                       requires=(('boolop', True, 'hidden'),))
23     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
24     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
25                                            wantref_option, stroption,
26                                            wantframework_option,
27                                            intoption, boolop])
28     return descr
29
30 def make_description_duplicates():
31     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
32     ## dummy 1
33     gcdummy = BoolOption('dummy', 'dummy', default=False)
34     objspaceoption = ChoiceOption('objspace', 'Object space',
35                                 ('std', 'thunk'), 'std')
36     booloption = BoolOption('bool', 'Test boolean option', default=True)
37     intoption = IntOption('int', 'Test int option', default=0)
38     floatoption = FloatOption('float', 'Test float option', default=2.3)
39     stroption = StrOption('str', 'Test string option', default="abc")
40     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
41     wantref_option = BoolOption('wantref', 'Test requires', default=False,
42                                     requires=(('boolop', True, 'hidden'),))
43     wantframework_option = BoolOption('wantframework', 'Test requires',
44                                       default=False,
45                                       requires=(('boolop', True, 'hidden'),))
46     # dummy2 (same path)
47     gcdummy2  = BoolOption('dummy', 'dummy2', default=True)
48     # dummy3 (same name)
49     gcdummy3  = BoolOption('dummy', 'dummy2', default=True)
50     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, gcdummy2, floatoption])
51     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
52                                            wantref_option, stroption,
53                                            wantframework_option,
54                                            intoption, boolop, gcdummy3])
55     return descr
56
57 def test_identical_paths():
58     """If in the schema (the option description) there is something that
59     have the same name, an exection is raised
60     """
61     raises(ConflictConfigError, "make_description_duplicates()")
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', True, 'hidden'),))
79     # second multi
80     wantframework_option = BoolOption('wantframework', 'Test requires',
81                                       default=False,
82                                       requires=(('boolop', True, 'hidden'),))
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, 'hidden'),))
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     setting = cfg.cfgimpl_get_settings()
159     setting.read_write()
160     intoption = cfg.unwrap_from_path('int')
161     stroption = cfg.unwrap_from_path('str')
162     assert not setting.has_property('hidden', stroption)
163     cfg.int = 1
164     raises(PropertiesOptionError, "cfg.str")
165     raises(PropertiesOptionError, 'cfg.str= "uvw"')
166     assert setting.has_property('hidden', stroption)
167
168 def test_hidden_if_in_with_group():
169     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
170     gcdummy = BoolOption('dummy', 'dummy', default=False)
171
172     floatoption = FloatOption('float', 'Test float option', default=2.3)
173
174     objspaceoption = ChoiceOption('objspace', 'Object space',
175                                 ('std', 'thunk'), 'std')
176     booloption = BoolOption('bool', 'Test boolean option', default=True)
177     intoption = IntOption('int', 'Test int option', default=0)
178     stroption = StrOption('str', 'Test string option', default="abc")
179     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption],
180                                                   requires=(('int', 1, 'hidden'),))
181     descr = OptionDescription('constraints', '', [gcgroup, booloption,
182                                           objspaceoption, stroption, intoption])
183     cfg = Config(descr)
184     setting = cfg.cfgimpl_get_settings()
185     setting.read_write()
186     assert not setting.has_property('hidden', stroption)
187     cfg.int = 1
188     raises(PropertiesOptionError, "cfg.gc.name")
189
190 def test_disabled_with_group():
191     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
192     gcdummy = BoolOption('dummy', 'dummy', default=False)
193
194     floatoption = FloatOption('float', 'Test float option', default=2.3)
195
196     objspaceoption = ChoiceOption('objspace', 'Object space',
197                                 ('std', 'thunk'), 'std')
198     booloption = BoolOption('bool', 'Test boolean option', default=True)
199     intoption = IntOption('int', 'Test int option', default=0)
200     stroption = StrOption('str', 'Test string option', default="abc")
201     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption],
202                                                   requires=(('int', 1, 'disabled'),))
203     descr = OptionDescription('constraints', '', [gcgroup, booloption,
204                                           objspaceoption, stroption, intoption])
205     cfg = Config(descr)
206     setting = cfg.cfgimpl_get_settings()
207     setting.read_write()
208     assert cfg.gc.name
209     cfg.int = 1
210     raises(PropertiesOptionError, "cfg.gc.name")
211 #____________________________________________________________
212
213 def make_description_callback():
214     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
215     gcdummy = BoolOption('dummy', 'dummy', callback="toto")
216     objspaceoption = ChoiceOption('objspace', 'Object space',
217                                 ('std', 'thunk'), 'std')
218     booloption = BoolOption('bool', 'Test boolean option', default=True)
219     intoption = IntOption('int', 'Test int option', default=0)
220     floatoption = FloatOption('float', 'Test float option', default=2.3)
221     stroption = StrOption('str', 'Test string option', default="abc")
222     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
223     wantref_option = BoolOption('wantref', 'Test requires', default=False,
224                                     requires=(('boolop', True, 'hidden'),))
225     wantframework_option = BoolOption('wantframework', 'Test requires',
226                                       default=False,
227                                       requires=(('boolop', True, 'hidden'),))
228     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
229     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
230                                            wantref_option, stroption,
231                                            wantframework_option,
232                                            intoption, boolop])
233     return descr
234
235 def test_has_callback():
236     descr = make_description_callback()
237     # here the owner is 'default'
238     config = Config(descr)
239     setting = config.cfgimpl_get_settings()
240     setting.read_write()
241     config.bool = False
242     # because dummy has a callback
243     dummy = config.unwrap_from_path('gc.dummy')
244     setting.enable_property('freeze')
245     setting.add_property('frozen', dummy)
246     raises(PropertiesOptionError, "config.gc.dummy = True")
247
248 def test_freeze_and_has_callback():
249     descr = make_description_callback()
250     config = Config(descr)
251     setting = config.cfgimpl_get_settings()
252     setting.read_write()
253     config.bool = False
254     config.cfgimpl_get_settings().enable_property('freeze')
255     dummy = config.unwrap_from_path('gc.dummy')
256     config.cfgimpl_get_settings().add_property('frozen', dummy)
257     raises(PropertiesOptionError, "config.gc.dummy = True")
258 #____________________________________________________________