better performance in find_firsts
[tiramisu.git] / test / test_metaconfig.py
1 import autopath
2
3 from py.test import raises
4
5 from tiramisu.setting import owners
6 from tiramisu.config import Config, GroupConfig, MetaConfig
7 from tiramisu.option import IntOption, OptionDescription
8 from tiramisu.error import ConfigError, PropertiesOptionError
9
10 owners.addowner('meta')
11
12
13 def make_description():
14     i1 = IntOption('i1', '')
15     i2 = IntOption('i2', '', default=1)
16     i3 = IntOption('i3', '')
17     i4 = IntOption('i4', '', default=2)
18     i5 = IntOption('i5', '', default=[2], multi=True)
19     i6 = IntOption('i6', '', properties=('disabled',))
20     od1 = OptionDescription('od1', '', [i1, i2, i3, i4, i5, i6])
21     od2 = OptionDescription('od2', '', [od1])
22     conf1 = Config(od2)
23     conf2 = Config(od2)
24     conf1.read_write()
25     conf2.read_write()
26     meta = MetaConfig([conf1, conf2])
27     meta.cfgimpl_get_settings().setowner(owners.meta)
28     return meta
29
30
31 #FIXME ne pas mettre 2 meta dans une config
32 #FIXME ne pas mettre 2 OD differents dans un meta
33 #FIXME serialization
34 def test_none():
35     meta = make_description()
36     conf1, conf2 = meta.cfgimpl_get_children()
37     assert conf1.od1.i3 is conf2.od1.i3 is None
38     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
39     meta.od1.i3 = 3
40     assert conf1.od1.i3 == conf2.od1.i3 == 3
41     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
42     meta.od1.i3 = 3
43     conf1.od1.i3 = 2
44     assert conf1.od1.i3 == 2
45     assert conf2.od1.i3 == 3
46     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
47     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
48     meta.od1.i3 = 4
49     assert conf1.od1.i3 == 2
50     assert conf2.od1.i3 == 4
51     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
52     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.meta
53     del(meta.od1.i3)
54     assert conf1.od1.i3 == 2
55     assert conf2.od1.i3 is None
56     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is owners.user
57     assert conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
58     del(conf1.od1.i3)
59     assert conf1.od1.i3 is conf2.od1.i3 is None
60     assert conf1.getowner(conf1.unwrap_from_path('od1.i3')) is conf2.getowner(conf2.unwrap_from_path('od1.i3')) is owners.default
61
62
63 def test_default():
64     meta = make_description()
65     conf1, conf2 = meta.cfgimpl_get_children()
66     assert conf1.od1.i2 == conf2.od1.i2 == 1
67     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
68     meta.od1.i2 = 3
69     assert conf1.od1.i2 == conf2.od1.i2 == 3
70     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
71     meta.od1.i2 = 3
72     conf1.od1.i2 = 2
73     assert conf1.od1.i2 == 2
74     assert conf2.od1.i2 == 3
75     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
76     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
77     meta.od1.i2 = 4
78     assert conf1.od1.i2 == 2
79     assert conf2.od1.i2 == 4
80     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
81     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
82     del(meta.od1.i2)
83     assert conf1.od1.i2 == 2
84     assert conf2.od1.i2 == 1
85     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
86     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
87     del(conf1.od1.i2)
88     assert conf1.od1.i2 == conf2.od1.i2 == 1
89     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
90
91
92 def test_contexts():
93     meta = make_description()
94     conf1, conf2 = meta.cfgimpl_get_children()
95     assert conf1.od1.i2 == conf2.od1.i2 == 1
96     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
97     meta.setattrs('od1.i2', 6)
98     assert meta.od1.i2 == 1
99     assert conf1.od1.i2 == conf2.od1.i2 == 6
100     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.user
101
102
103 def test_find():
104     meta = make_description()
105     i2 = meta.unwrap_from_path('od1.i2')
106     assert [i2] == meta.find(byname='i2')
107     assert i2 == meta.find_first(byname='i2')
108     assert meta.make_dict() == {'od1.i4': 2, 'od1.i1': None, 'od1.i3': None,
109                                 'od1.i2': 1, 'od1.i5': [2], 'od1.i6': None}
110
111
112 def test_meta_meta():
113     meta1 = make_description()
114     meta2 = MetaConfig([meta1])
115     meta2.cfgimpl_get_settings().setowner(owners.meta)
116     conf1, conf2 = meta1.cfgimpl_get_children()
117     assert conf1.od1.i2 == conf2.od1.i2 == 1
118     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
119     meta2.od1.i2 = 3
120     assert conf1.od1.i2 == conf2.od1.i2 == 3
121     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
122     meta2.od1.i2 = 3
123     conf1.od1.i2 = 2
124     assert conf1.od1.i2 == 2
125     assert conf2.od1.i2 == 3
126     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
127     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
128     meta2.od1.i2 = 4
129     assert conf1.od1.i2 == 2
130     assert conf2.od1.i2 == 4
131     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
132     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
133     del(meta2.od1.i2)
134     assert conf1.od1.i2 == 2
135     assert conf2.od1.i2 == 1
136     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is owners.user
137     assert conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
138     del(conf1.od1.i2)
139     assert conf1.od1.i2 == conf2.od1.i2 == 1
140     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.default
141     meta1.od1.i2 = 6
142     assert conf1.od1.i2 == conf2.od1.i2 == 6
143     assert conf1.getowner(conf1.unwrap_from_path('od1.i2')) is conf2.getowner(conf2.unwrap_from_path('od1.i2')) is owners.meta
144
145
146 def test_meta_meta_set():
147     meta1 = make_description()
148     meta2 = MetaConfig([meta1])
149     meta2.cfgimpl_get_settings().setowner(owners.meta)
150     conf1, conf2 = meta1.cfgimpl_get_children()
151     meta2.setattrs('od1.i1', 7)
152     #PropertiesOptionError
153     meta2.setattrs('od1.i6', 7)
154     assert conf1.od1.i1 == conf2.od1.i1 == 7
155     assert conf1.getowner(conf1.unwrap_from_path('od1.i1')) is conf2.getowner(conf2.unwrap_from_path('od1.i1')) is owners.user
156     assert [conf1, conf2] == meta2.find_firsts(byname='i1', byvalue=7, type_='config')
157     assert ['od1.i1', 'od1.i1'] == meta2.find_firsts(byname='i1', byvalue=7, type_='path')
158     conf1.od1.i1 = 8
159     assert [conf1, conf2] == meta2.find_firsts(byname='i1', type_='config')
160     assert ['od1.i1', 'od1.i1'] == meta2.find_firsts(byname='i1', type_='path')
161     assert [conf2] == meta2.find_firsts(byname='i1', byvalue=7, type_='config')
162     assert ['od1.i1'] == meta2.find_firsts(byname='i1', byvalue=7, type_='path')
163     assert [conf1] == meta2.find_firsts(byname='i1', byvalue=8, type_='config')
164     assert ['od1.i1'] == meta2.find_firsts(byname='i1', byvalue=8, type_='path')
165     assert [conf1, conf2] == meta2.find_firsts(byname='i5', byvalue=2, type_='config')
166     assert ['od1.i5', 'od1.i5'] == meta2.find_firsts(byname='i5', byvalue=2, type_='path')
167     raises(AttributeError, "meta2.find_firsts(byname='i1', byvalue=10)")
168     raises(AttributeError, "meta2.find_firsts(byname='not', byvalue=10)")
169     raises(AttributeError, "meta2.find_firsts(byname='i6')")
170
171
172 def test_not_meta():
173     i1 = IntOption('i1', '')
174     od1 = OptionDescription('od1', '', [i1])
175     od2 = OptionDescription('od2', '', [od1])
176     conf1 = Config(od2)
177     conf2 = Config(od2)
178     raises(ValueError, "GroupConfig(conf1)")
179     meta = GroupConfig([conf1, conf2])
180     raises(ConfigError, 'meta.od1.i1')
181     conf1, conf2 = meta.cfgimpl_get_children()
182     meta.setattrs('od1.i1', 7)
183     assert conf1.od1.i1 == conf2.od1.i1 == 7
184     assert conf1.getowner(conf1.unwrap_from_path('od1.i1')) is conf2.getowner(conf2.unwrap_from_path('od1.i1')) is owners.user
185
186
187 def test_group_find_firsts():
188     i1 = IntOption('i1', '')
189     od1 = OptionDescription('od1', '', [i1])
190     od2 = OptionDescription('od2', '', [od1])
191     conf1 = Config(od2)
192     conf2 = Config(od2)
193     meta = GroupConfig([conf1, conf2])
194     conf1, conf2 = meta.find_firsts(byname='i1')
195
196
197 def test_meta_path():
198     meta = make_description()
199     assert meta._impl_path is None
200     assert meta.od1._impl_path == 'od1'
201
202
203 def test_meta_unconsistent():
204     i1 = IntOption('i1', '')
205     i2 = IntOption('i2', '', default=1)
206     i3 = IntOption('i3', '')
207     i4 = IntOption('i4', '', default=2)
208     od1 = OptionDescription('od1', '', [i1, i2, i3, i4])
209     od2 = OptionDescription('od2', '', [od1])
210     conf1 = Config(od2)
211     conf2 = Config(od2)
212     conf3 = Config(od2)
213     conf4 = Config(od1)
214     meta = MetaConfig([conf1, conf2])
215     meta.cfgimpl_get_settings().setowner(owners.meta)
216     raises(TypeError, 'MetaConfig("string")')
217     raises(ValueError, "MetaConfig([conf1, conf3])")
218     raises(ValueError, "MetaConfig([conf3, conf4])")