commented code for unicity by name
[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'])
19     wantframework_option = BoolOption('wantframework', 'Test requires',
20                                       default=False,
21                                       requires=['boolop'])
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'])
42     wantframework_option = BoolOption('wantframework', 'Test requires',
43                                       default=False,
44                                       requires=['boolop'])
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     descr = make_description_duplicates()
61     raises(ConflictConfigError, "cfg = Config(descr)")
62
63 #def test_identical_for_names():
64 #    """if there is something that 
65 #    have the same name, an exection is raised
66 #    """    
67 #    descr = make_description_duplicates()
68 #    raises(ConflictConfigError, "cfg = Config(descr)")
69
70
71 def make_description2():
72     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
73     gcdummy = BoolOption('dummy', 'dummy', default=False)
74
75     floatoption = FloatOption('float', 'Test float option', default=2.3)
76     
77     objspaceoption = ChoiceOption('objspace', 'Object space',
78                                 ['std', 'thunk'], 'std')
79     booloption = BoolOption('bool', 'Test boolean option', default=True)
80     intoption = IntOption('int', 'Test int option', default=0)
81     stroption = StrOption('str', 'Test string option', default="abc")
82     # first multi
83     boolop = BoolOption('boolop', 'Test boolean option op', default=True)
84     boolop.enable_multi()
85     wantref_option = BoolOption('wantref', 'Test requires', default=False,
86                                     requires=['boolop'])
87     # second multi
88     wantframework_option = BoolOption('wantframework', 'Test requires',
89                                       default=False,
90                                       requires=['boolop'])
91     wantframework_option.enable_multi()
92     
93     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
94     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
95                                            wantref_option, stroption,
96                                            wantframework_option,
97                                            intoption, boolop])
98     return descr
99
100 # FIXME: XXX would you mind putting the multi validations anywhere else 
101 # than in the requires !!! 
102 #def test_multi_constraints():
103 #    "a multi in a constraint has to have the same length"
104 #    descr = make_description2()
105 #    cfg = Config(descr)
106 #    cfg.boolop = [True, True, False]
107 #    cfg.wantframework = [False, False, True]
108 #    
109 #def test_multi_raise():
110 #    "a multi in a constraint has to have the same length"
111 #    # FIXME fusionner les deux tests, MAIS PROBLEME :
112 #    # il ne devrait pas etre necessaire de refaire une config
113 #    # si la valeur est modifiee une deuxieme fois -> 
114 #    #raises(ConflictConfigError, "cfg.wantframework = [False, False, True]")
115 #    #   ExceptionFailure: 'DID NOT RAISE'
116 #    descr = make_description2()
117 #    cfg = Config(descr)
118 #    cfg.boolop = [True]
119 #    raises(ConflictConfigError, "cfg.wantframework = [False, False, True]")
120 # ____________________________________________________________
121 # adding dynamically new options description schema
122 def test_newoption_add_in_descr():
123     descr = make_description()
124     newoption = BoolOption('newoption', 'dummy twoo', default=False)
125     descr.add_child(newoption)
126     config = Config(descr)
127     assert config.newoption == False
128
129 def test_newoption_add_in_subdescr():
130     descr = make_description()
131     newoption = BoolOption('newoption', 'dummy twoo', default=False)
132     descr.gc.add_child(newoption)
133     config = Config(descr, bool=False)
134     assert config.gc.newoption == False
135
136 def test_newoption_add_in_config():
137     descr = make_description()
138     config = Config(descr, 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 def make_description_requires():
145     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
146     gcdummy = BoolOption('dummy', 'dummy', default=False)
147
148     floatoption = FloatOption('float', 'Test float option', default=2.3)
149     
150     objspaceoption = ChoiceOption('objspace', 'Object space',
151                                 ['std', 'thunk'], 'std')
152     booloption = BoolOption('bool', 'Test boolean option', default=True)
153     intoption = IntOption('int', 'Test int option', default=0)
154     stroption = StrOption('str', 'Test string option', default="abc", 
155                           requires=[('int', 1, 'hide')])
156     
157     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
158     descr = OptionDescription('constraints', '', [gcgroup, booloption, objspaceoption,
159                                            stroption, intoption])
160     return descr
161
162 def test_hidden_if_in():
163     descr = make_description_requires()
164     cfg = Config(descr)
165     intoption = cfg.unwrap_from_path('int')
166     stroption = cfg.unwrap_from_path('str')
167     assert not stroption._is_hidden()
168     cfg.int = 1
169     raises(PropertiesOptionError, "cfg.str")
170     raises(PropertiesOptionError, 'cfg.str= "uvw"')
171     assert stroption._is_hidden()
172
173 def test_hidden_if_in_with_group():
174     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
175     gcdummy = BoolOption('dummy', 'dummy', default=False)
176
177     floatoption = FloatOption('float', 'Test float option', default=2.3)
178     
179     objspaceoption = ChoiceOption('objspace', 'Object space',
180                                 ['std', 'thunk'], 'std')
181     booloption = BoolOption('bool', 'Test boolean option', default=True)
182     intoption = IntOption('int', 'Test int option', default=0)
183     stroption = StrOption('str', 'Test string option', default="abc")
184     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption], 
185                                                   requires=[('int', 1, 'hide')])
186     descr = OptionDescription('constraints', '', [gcgroup, booloption, 
187                                           objspaceoption, stroption, intoption])
188     cfg = Config(descr)
189     assert not gcgroup._is_hidden()
190     cfg.int = 1
191     raises(PropertiesOptionError, "cfg.gc.name")
192     assert gcgroup._is_hidden()
193
194 def test_disabled_with_group():
195     gcoption = ChoiceOption('name', 'GC name', ['ref', 'framework'], 'ref')
196     gcdummy = BoolOption('dummy', 'dummy', default=False)
197
198     floatoption = FloatOption('float', 'Test float option', default=2.3)
199     
200     objspaceoption = ChoiceOption('objspace', 'Object space',
201                                 ['std', 'thunk'], 'std')
202     booloption = BoolOption('bool', 'Test boolean option', default=True)
203     intoption = IntOption('int', 'Test int option', default=0)
204     stroption = StrOption('str', 'Test string option', default="abc")
205     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption], 
206                                                   requires=[('int', 1, 'disable')])
207     descr = OptionDescription('constraints', '', [gcgroup, booloption, 
208                                           objspaceoption, stroption, intoption])
209     cfg = Config(descr)
210     assert not gcgroup._is_disabled()
211     cfg.int = 1
212     raises(PropertiesOptionError, "cfg.gc.name")
213     assert gcgroup._is_disabled()
214