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