python 3.5 support
[tiramisu.git] / test / test_freeze.py
1 # coding: utf-8
2 "frozen and hidden values"
3 from .autopath import do_autopath
4 do_autopath()
5
6 from py.test import raises
7
8 from tiramisu.setting import owners, groups
9 from tiramisu.option import ChoiceOption, BoolOption, IntOption, FloatOption, \
10     StrOption, OptionDescription, SymLinkOption
11 from tiramisu.config import Config
12 from tiramisu.error import PropertiesOptionError, ConfigError
13
14
15 #____________________________________________________________
16 #freeze
17 def make_description_freeze():
18     gcoption = ChoiceOption('name', 'GC name', ('ref', 'framework'), 'ref')
19     gcdummy = BoolOption('dummy', 'dummy', default=False)
20     objspaceoption = ChoiceOption('objspace', 'Object space',
21                                   ('std', 'thunk'), 'std')
22     booloption = BoolOption('bool', 'Test boolean option', default=True)
23     intoption = IntOption('int', 'Test int option', default=0)
24     floatoption = FloatOption('float', 'Test float option', default=2.3)
25     stroption = StrOption('str', 'Test string option', default="abc")
26     boolop = BoolOption('boolop', 'Test boolean option op', default=[True], multi=True)
27     wantref_option = BoolOption('wantref', 'Test requires', default=False, properties=('force_store_value',),
28                                 requires=({'option': booloption, 'expected': True, 'action': 'hidden'},))
29     wantref2_option = BoolOption('wantref2', 'Test requires', default=False, properties=('force_store_value', 'hidden'))
30     wantref3_option = BoolOption('wantref3', 'Test requires', default=[False], multi=True, properties=('force_store_value',))
31     st2 = SymLinkOption('st2', wantref3_option)
32     wantframework_option = BoolOption('wantframework', 'Test requires',
33                                       default=False,
34                                       requires=({'option': booloption, 'expected': True, 'action': 'hidden'},))
35
36     gcgroup = OptionDescription('gc', '', [gcoption, gcdummy, floatoption])
37     descr = OptionDescription('tiramisu', '', [gcgroup, booloption, objspaceoption,
38                               wantref_option, wantref2_option, wantref3_option, st2, stroption,
39                               wantframework_option,
40                               intoption, boolop])
41     return descr
42
43
44 def return_val():
45     return 1
46
47
48 def return_val2(value):
49     return value
50
51
52 def return_val3(context, value):
53     return value
54
55
56 def test_freeze_whole_config():
57     descr = make_description_freeze()
58     conf = Config(descr)
59     setting = conf.cfgimpl_get_settings()
60     conf.read_write()
61     setting.append('everything_frozen')
62     assert conf.gc.dummy is False
63     prop = []
64     try:
65         conf.gc.dummy = True
66     except PropertiesOptionError as err:
67         prop = err.proptype
68     assert 'frozen' in prop
69     assert conf.gc.dummy is False
70     #
71     setting.remove('everything_frozen')
72     conf.gc.dummy = True
73     assert conf.gc.dummy is True
74     setting.append('everything_frozen')
75     owners.addowner("everythingfrozen")
76     prop = []
77     try:
78         conf.cfgimpl_get_values().setowner(descr.gc.dummy, owners.everythingfrozen)
79     except PropertiesOptionError as err:
80         prop = err.proptype
81     assert 'frozen' in prop
82
83
84 def test_freeze_one_option():
85     "freeze an option "
86     descr = make_description_freeze()
87     conf = Config(descr)
88     setting = conf.cfgimpl_get_settings()
89     conf.read_write()
90     #freeze only one option
91     dummy = conf.unwrap_from_path('gc.dummy')
92     setting[dummy].append('frozen')
93     assert conf.gc.dummy is False
94     prop = []
95     try:
96         conf.gc.dummy = True
97     except PropertiesOptionError as err:
98         prop = err.proptype
99     assert 'frozen' in prop
100
101
102 def test_frozen_value():
103     "setattr a frozen value at the config level"
104     s = StrOption("string", "", default="string")
105     descr = OptionDescription("options", "", [s])
106     config = Config(descr)
107     setting = config.cfgimpl_get_settings()
108     config.read_write()
109     setting.append('frozen')
110     setting[s].append('frozen')
111     prop = []
112     try:
113         config.string = "egg"
114     except PropertiesOptionError as err:
115         prop = err.proptype
116     assert 'frozen' in prop
117
118
119 def test_freeze():
120     "freeze a whole configuration object"
121     descr = make_description_freeze()
122     conf = Config(descr)
123     setting = conf.cfgimpl_get_settings()
124     conf.read_write()
125     setting.append('frozen')
126     name = conf.unwrap_from_path("gc.name")
127     setting[name].append('frozen')
128     prop = []
129     try:
130         conf.gc.name = 'framework'
131     except PropertiesOptionError as err:
132         prop = err.proptype
133     assert 'frozen' in prop
134
135
136 def test_freeze_multi():
137     descr = make_description_freeze()
138     conf = Config(descr)
139     setting = conf.cfgimpl_get_settings()
140     conf.read_write()
141     setting.append('frozen')
142     obj = conf.unwrap_from_path('boolop')
143     setting[obj].append('frozen')
144     prop = []
145     try:
146         conf.boolop = [True]
147     except PropertiesOptionError as err:
148         prop = err.proptype
149     assert 'frozen' in prop
150
151
152 def test_freeze_get_multi():
153     descr = make_description_freeze()
154     conf = Config(descr)
155     setting = conf.cfgimpl_get_settings()
156     conf.read_write()
157     setting.append('frozen')
158     valmulti = conf.boolop
159     valmulti.append(False)
160     obj = conf.unwrap_from_path('boolop')
161     setting[obj].append('frozen')
162     prop = []
163     try:
164         valmulti.append(False)
165     except PropertiesOptionError as err:
166         prop = err.proptype
167     assert 'frozen' in prop
168
169
170 def test_force_store_value():
171     descr = make_description_freeze()
172     conf = Config(descr)
173     assert conf.cfgimpl_get_values().get_modified_values() == {'wantref': ('forced', False),
174                                                                    'wantref2': ('forced', False),
175                                                                    'wantref3': ('forced', (False,))}
176     conf.wantref = True
177     assert conf.cfgimpl_get_values().get_modified_values() == {'wantref': ('user', True),
178                                                                    'wantref2': ('forced', False),
179                                                                    'wantref3': ('forced', (False,))}
180     del(conf.wantref)
181     assert conf.cfgimpl_get_values().get_modified_values() == {'wantref': ('forced', False),
182                                                                    'wantref2': ('forced', False),
183                                                                    'wantref3': ('forced', (False,))}
184
185
186 def test_force_store_value_no_requirement():
187     booloption = BoolOption('bool', 'Test boolean option', default=True)
188     try:
189         BoolOption('wantref', 'Test requires', default=False,
190                    requires=({'option': booloption, 'expected': True, 'action': 'force_store_value'},))
191     except ValueError:
192         pass
193
194
195 def test_force_store_value_masterslaves_slave():
196     b = IntOption('int', 'Test int option', multi=True)
197     c = StrOption('str', 'Test string option', multi=True, properties=('force_store_value',))
198     descr = OptionDescription("int", "", [b, c])
199     descr.impl_set_group_type(groups.master)
200     raises(ConfigError, "conf = Config(descr)")
201
202
203 def test_force_store_value_masterslaves():
204     b = IntOption('int', 'Test int option', multi=True, properties=('force_store_value',))
205     c = StrOption('str', 'Test string option', multi=True)
206     descr = OptionDescription("int", "", [b, c])
207     descr.impl_set_group_type(groups.master)
208     conf = Config(descr)
209     assert conf.cfgimpl_get_values().get_modified_values() == {'int': ('forced', ())}
210
211
212 def test_force_store_value_callback():
213     b = IntOption('int', 'Test int option', properties=('force_store_value',), callback=return_val)
214     descr = OptionDescription("int", "", [b])
215     conf = Config(descr)
216     assert conf.cfgimpl_get_values().get_modified_values() == {'int': ('forced', 1)}
217
218
219 def test_force_store_value_callback_params():
220     b = IntOption('int', 'Test int option', properties=('force_store_value',), callback=return_val2, callback_params={'value': (2,)})
221     descr = OptionDescription("int", "", [b])
222     conf = Config(descr)
223     assert conf.cfgimpl_get_values().get_modified_values() == {'int': ('forced', 2)}
224
225
226 def test_force_store_value_callback_params_2():
227     b = IntOption('int', 'Test int option', properties=('force_store_value',), callback=return_val3, callback_params={'': ((None,),), 'value': (2,)})
228     descr = OptionDescription("int", "", [b])
229     conf = Config(descr)
230     assert conf.cfgimpl_get_values().get_modified_values() == {'int': ('forced', 2)}
231
232
233 def test_force_store_value_callback_params_with_opt():
234     a = IntOption('val1', "", 2)
235     b = IntOption('int', 'Test int option', properties=('force_store_value',), callback=return_val2, callback_params={'value': ((a, False),)})
236     descr = OptionDescription("int", "", [a, b])
237     conf = Config(descr)
238     assert conf.cfgimpl_get_values().get_modified_values() == {'int': ('forced', 2)}