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