tree_test.cpp revision 1.1 1 1.1 jmmv // Copyright 2012 Google Inc.
2 1.1 jmmv // All rights reserved.
3 1.1 jmmv //
4 1.1 jmmv // Redistribution and use in source and binary forms, with or without
5 1.1 jmmv // modification, are permitted provided that the following conditions are
6 1.1 jmmv // met:
7 1.1 jmmv //
8 1.1 jmmv // * Redistributions of source code must retain the above copyright
9 1.1 jmmv // notice, this list of conditions and the following disclaimer.
10 1.1 jmmv // * Redistributions in binary form must reproduce the above copyright
11 1.1 jmmv // notice, this list of conditions and the following disclaimer in the
12 1.1 jmmv // documentation and/or other materials provided with the distribution.
13 1.1 jmmv // * Neither the name of Google Inc. nor the names of its contributors
14 1.1 jmmv // may be used to endorse or promote products derived from this software
15 1.1 jmmv // without specific prior written permission.
16 1.1 jmmv //
17 1.1 jmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 1.1 jmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 1.1 jmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 1.1 jmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 1.1 jmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 1.1 jmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 1.1 jmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 1.1 jmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 1.1 jmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 1.1 jmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 1.1 jmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 1.1 jmmv
29 1.1 jmmv #include "utils/config/tree.ipp"
30 1.1 jmmv
31 1.1 jmmv #include <atf-c++.hpp>
32 1.1 jmmv
33 1.1 jmmv #include "utils/config/nodes.ipp"
34 1.1 jmmv #include "utils/format/macros.hpp"
35 1.1 jmmv #include "utils/text/operations.ipp"
36 1.1 jmmv
37 1.1 jmmv namespace config = utils::config;
38 1.1 jmmv namespace text = utils::text;
39 1.1 jmmv
40 1.1 jmmv
41 1.1 jmmv namespace {
42 1.1 jmmv
43 1.1 jmmv
44 1.1 jmmv /// Simple wrapper around an integer value without default constructors.
45 1.1 jmmv ///
46 1.1 jmmv /// The purpose of this type is to have a simple class without default
47 1.1 jmmv /// constructors to validate that we can use it as a leaf of a tree.
48 1.1 jmmv class int_wrapper {
49 1.1 jmmv /// The wrapped integer value.
50 1.1 jmmv int _value;
51 1.1 jmmv
52 1.1 jmmv public:
53 1.1 jmmv /// Constructs a new wrapped integer.
54 1.1 jmmv ///
55 1.1 jmmv /// \param value_ The value to store in the object.
56 1.1 jmmv explicit int_wrapper(int value_) :
57 1.1 jmmv _value(value_)
58 1.1 jmmv {
59 1.1 jmmv }
60 1.1 jmmv
61 1.1 jmmv /// Gets the integer value stored in the object.
62 1.1 jmmv int
63 1.1 jmmv value(void) const
64 1.1 jmmv {
65 1.1 jmmv return _value;
66 1.1 jmmv }
67 1.1 jmmv };
68 1.1 jmmv
69 1.1 jmmv
70 1.1 jmmv /// Custom tree leaf type for an object without defualt constructors.
71 1.1 jmmv class wrapped_int_node : public config::typed_leaf_node< int_wrapper > {
72 1.1 jmmv public:
73 1.1 jmmv /// Copies the node.
74 1.1 jmmv ///
75 1.1 jmmv /// \return A dynamically-allocated node.
76 1.1 jmmv virtual base_node*
77 1.1 jmmv deep_copy(void) const
78 1.1 jmmv {
79 1.1 jmmv std::auto_ptr< wrapped_int_node > new_node(new wrapped_int_node());
80 1.1 jmmv new_node->_value = _value;
81 1.1 jmmv return new_node.release();
82 1.1 jmmv }
83 1.1 jmmv
84 1.1 jmmv /// Pushes the node's value onto the Lua stack.
85 1.1 jmmv ///
86 1.1 jmmv /// \param state The Lua state onto which to push the value.
87 1.1 jmmv void
88 1.1 jmmv push_lua(lutok::state& state) const
89 1.1 jmmv {
90 1.1 jmmv state.push_integer(
91 1.1 jmmv config::typed_leaf_node< int_wrapper >::value().value());
92 1.1 jmmv }
93 1.1 jmmv
94 1.1 jmmv /// Sets the value of the node from an entry in the Lua stack.
95 1.1 jmmv ///
96 1.1 jmmv /// \param state The Lua state from which to get the value.
97 1.1 jmmv /// \param value_index The stack index in which the value resides.
98 1.1 jmmv void
99 1.1 jmmv set_lua(lutok::state& state, const int value_index)
100 1.1 jmmv {
101 1.1 jmmv ATF_REQUIRE(state.is_number(value_index));
102 1.1 jmmv int_wrapper new_value(state.to_integer(value_index));
103 1.1 jmmv config::typed_leaf_node< int_wrapper >::set(new_value);
104 1.1 jmmv }
105 1.1 jmmv
106 1.1 jmmv /// Sets the value of the node from a raw string representation.
107 1.1 jmmv ///
108 1.1 jmmv /// \param raw_value The value to set the node to.
109 1.1 jmmv void
110 1.1 jmmv set_string(const std::string& raw_value)
111 1.1 jmmv {
112 1.1 jmmv int_wrapper new_value(text::to_type< int >(raw_value));
113 1.1 jmmv config::typed_leaf_node< int_wrapper >::set(new_value);
114 1.1 jmmv }
115 1.1 jmmv
116 1.1 jmmv /// Converts the contents of the node to a string.
117 1.1 jmmv ///
118 1.1 jmmv /// \return A string representation of the value held by the node.
119 1.1 jmmv std::string
120 1.1 jmmv to_string(void) const
121 1.1 jmmv {
122 1.1 jmmv return F("%s") %
123 1.1 jmmv config::typed_leaf_node< int_wrapper >::value().value();
124 1.1 jmmv }
125 1.1 jmmv };
126 1.1 jmmv
127 1.1 jmmv
128 1.1 jmmv } // anonymous namespace
129 1.1 jmmv
130 1.1 jmmv
131 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(define_set_lookup__one_level);
132 1.1 jmmv ATF_TEST_CASE_BODY(define_set_lookup__one_level)
133 1.1 jmmv {
134 1.1 jmmv config::tree tree;
135 1.1 jmmv
136 1.1 jmmv tree.define< config::int_node >("var1");
137 1.1 jmmv tree.define< config::string_node >("var2");
138 1.1 jmmv tree.define< config::bool_node >("var3");
139 1.1 jmmv
140 1.1 jmmv tree.set< config::int_node >("var1", 42);
141 1.1 jmmv tree.set< config::string_node >("var2", "hello");
142 1.1 jmmv tree.set< config::bool_node >("var3", false);
143 1.1 jmmv
144 1.1 jmmv ATF_REQUIRE_EQ(42, tree.lookup< config::int_node >("var1"));
145 1.1 jmmv ATF_REQUIRE_EQ("hello", tree.lookup< config::string_node >("var2"));
146 1.1 jmmv ATF_REQUIRE(!tree.lookup< config::bool_node >("var3"));
147 1.1 jmmv }
148 1.1 jmmv
149 1.1 jmmv
150 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(define_set_lookup__multiple_levels);
151 1.1 jmmv ATF_TEST_CASE_BODY(define_set_lookup__multiple_levels)
152 1.1 jmmv {
153 1.1 jmmv config::tree tree;
154 1.1 jmmv
155 1.1 jmmv tree.define< config::int_node >("foo.bar.1");
156 1.1 jmmv tree.define< config::string_node >("foo.bar.2");
157 1.1 jmmv tree.define< config::bool_node >("foo.3");
158 1.1 jmmv tree.define_dynamic("sub.tree");
159 1.1 jmmv
160 1.1 jmmv tree.set< config::int_node >("foo.bar.1", 42);
161 1.1 jmmv tree.set< config::string_node >("foo.bar.2", "hello");
162 1.1 jmmv tree.set< config::bool_node >("foo.3", true);
163 1.1 jmmv tree.set< config::string_node >("sub.tree.1", "bye");
164 1.1 jmmv tree.set< config::int_node >("sub.tree.2", 4);
165 1.1 jmmv tree.set< config::int_node >("sub.tree.3.4", 123);
166 1.1 jmmv
167 1.1 jmmv ATF_REQUIRE_EQ(42, tree.lookup< config::int_node >("foo.bar.1"));
168 1.1 jmmv ATF_REQUIRE_EQ("hello", tree.lookup< config::string_node >("foo.bar.2"));
169 1.1 jmmv ATF_REQUIRE(tree.lookup< config::bool_node >("foo.3"));
170 1.1 jmmv ATF_REQUIRE_EQ(4, tree.lookup< config::int_node >("sub.tree.2"));
171 1.1 jmmv ATF_REQUIRE_EQ(123, tree.lookup< config::int_node >("sub.tree.3.4"));
172 1.1 jmmv }
173 1.1 jmmv
174 1.1 jmmv
175 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(deep_copy__empty);
176 1.1 jmmv ATF_TEST_CASE_BODY(deep_copy__empty)
177 1.1 jmmv {
178 1.1 jmmv config::tree tree1;
179 1.1 jmmv config::tree tree2 = tree1.deep_copy();
180 1.1 jmmv
181 1.1 jmmv tree1.define< config::bool_node >("var1");
182 1.1 jmmv // This would crash if the copy shared the internal data.
183 1.1 jmmv tree2.define< config::int_node >("var1");
184 1.1 jmmv }
185 1.1 jmmv
186 1.1 jmmv
187 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(deep_copy__some);
188 1.1 jmmv ATF_TEST_CASE_BODY(deep_copy__some)
189 1.1 jmmv {
190 1.1 jmmv config::tree tree1;
191 1.1 jmmv tree1.define< config::bool_node >("this.is.a.var");
192 1.1 jmmv tree1.set< config::bool_node >("this.is.a.var", true);
193 1.1 jmmv tree1.define< config::int_node >("this.is.another.var");
194 1.1 jmmv tree1.set< config::int_node >("this.is.another.var", 34);
195 1.1 jmmv tree1.define< config::int_node >("and.another");
196 1.1 jmmv tree1.set< config::int_node >("and.another", 123);
197 1.1 jmmv
198 1.1 jmmv config::tree tree2 = tree1.deep_copy();
199 1.1 jmmv tree2.set< config::bool_node >("this.is.a.var", false);
200 1.1 jmmv tree2.set< config::int_node >("this.is.another.var", 43);
201 1.1 jmmv
202 1.1 jmmv ATF_REQUIRE( tree1.lookup< config::bool_node >("this.is.a.var"));
203 1.1 jmmv ATF_REQUIRE(!tree2.lookup< config::bool_node >("this.is.a.var"));
204 1.1 jmmv
205 1.1 jmmv ATF_REQUIRE_EQ(34, tree1.lookup< config::int_node >("this.is.another.var"));
206 1.1 jmmv ATF_REQUIRE_EQ(43, tree2.lookup< config::int_node >("this.is.another.var"));
207 1.1 jmmv
208 1.1 jmmv ATF_REQUIRE_EQ(123, tree1.lookup< config::int_node >("and.another"));
209 1.1 jmmv ATF_REQUIRE_EQ(123, tree2.lookup< config::int_node >("and.another"));
210 1.1 jmmv }
211 1.1 jmmv
212 1.1 jmmv
213 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(lookup__invalid_key);
214 1.1 jmmv ATF_TEST_CASE_BODY(lookup__invalid_key)
215 1.1 jmmv {
216 1.1 jmmv config::tree tree;
217 1.1 jmmv
218 1.1 jmmv ATF_REQUIRE_THROW(config::invalid_key_error,
219 1.1 jmmv tree.lookup< config::int_node >("."));
220 1.1 jmmv }
221 1.1 jmmv
222 1.1 jmmv
223 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(lookup__unknown_key);
224 1.1 jmmv ATF_TEST_CASE_BODY(lookup__unknown_key)
225 1.1 jmmv {
226 1.1 jmmv config::tree tree;
227 1.1 jmmv
228 1.1 jmmv tree.define< config::int_node >("foo.bar");
229 1.1 jmmv tree.define< config::int_node >("a.b.c");
230 1.1 jmmv tree.define_dynamic("a.d");
231 1.1 jmmv tree.set< config::int_node >("a.b.c", 123);
232 1.1 jmmv tree.set< config::int_node >("a.d.100", 0);
233 1.1 jmmv
234 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
235 1.1 jmmv tree.lookup< config::int_node >("abc"));
236 1.1 jmmv
237 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
238 1.1 jmmv tree.lookup< config::int_node >("foo"));
239 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
240 1.1 jmmv tree.lookup< config::int_node >("foo.bar"));
241 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
242 1.1 jmmv tree.lookup< config::int_node >("foo.bar.baz"));
243 1.1 jmmv
244 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
245 1.1 jmmv tree.lookup< config::int_node >("a"));
246 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
247 1.1 jmmv tree.lookup< config::int_node >("a.b"));
248 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
249 1.1 jmmv tree.lookup< config::int_node >("a.c"));
250 1.1 jmmv (void)tree.lookup< config::int_node >("a.b.c");
251 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
252 1.1 jmmv tree.lookup< config::int_node >("a.b.c.d"));
253 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
254 1.1 jmmv tree.lookup< config::int_node >("a.d"));
255 1.1 jmmv (void)tree.lookup< config::int_node >("a.d.100");
256 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
257 1.1 jmmv tree.lookup< config::int_node >("a.d.101"));
258 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
259 1.1 jmmv tree.lookup< config::int_node >("a.d.100.3"));
260 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
261 1.1 jmmv tree.lookup< config::int_node >("a.d.e"));
262 1.1 jmmv }
263 1.1 jmmv
264 1.1 jmmv
265 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(is_set__one_level);
266 1.1 jmmv ATF_TEST_CASE_BODY(is_set__one_level)
267 1.1 jmmv {
268 1.1 jmmv config::tree tree;
269 1.1 jmmv
270 1.1 jmmv tree.define< config::int_node >("var1");
271 1.1 jmmv tree.define< config::string_node >("var2");
272 1.1 jmmv tree.define< config::bool_node >("var3");
273 1.1 jmmv
274 1.1 jmmv tree.set< config::int_node >("var1", 42);
275 1.1 jmmv tree.set< config::bool_node >("var3", false);
276 1.1 jmmv
277 1.1 jmmv ATF_REQUIRE( tree.is_set("var1"));
278 1.1 jmmv ATF_REQUIRE(!tree.is_set("var2"));
279 1.1 jmmv ATF_REQUIRE( tree.is_set("var3"));
280 1.1 jmmv }
281 1.1 jmmv
282 1.1 jmmv
283 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(is_set__multiple_levels);
284 1.1 jmmv ATF_TEST_CASE_BODY(is_set__multiple_levels)
285 1.1 jmmv {
286 1.1 jmmv config::tree tree;
287 1.1 jmmv
288 1.1 jmmv tree.define< config::int_node >("a.b.var1");
289 1.1 jmmv tree.define< config::string_node >("a.b.var2");
290 1.1 jmmv tree.define< config::bool_node >("e.var3");
291 1.1 jmmv
292 1.1 jmmv tree.set< config::int_node >("a.b.var1", 42);
293 1.1 jmmv tree.set< config::bool_node >("e.var3", false);
294 1.1 jmmv
295 1.1 jmmv ATF_REQUIRE(!tree.is_set("a"));
296 1.1 jmmv ATF_REQUIRE(!tree.is_set("a.b"));
297 1.1 jmmv ATF_REQUIRE( tree.is_set("a.b.var1"));
298 1.1 jmmv ATF_REQUIRE(!tree.is_set("a.b.var1.trailing"));
299 1.1 jmmv
300 1.1 jmmv ATF_REQUIRE(!tree.is_set("a"));
301 1.1 jmmv ATF_REQUIRE(!tree.is_set("a.b"));
302 1.1 jmmv ATF_REQUIRE(!tree.is_set("a.b.var2"));
303 1.1 jmmv ATF_REQUIRE(!tree.is_set("a.b.var2.trailing"));
304 1.1 jmmv
305 1.1 jmmv ATF_REQUIRE(!tree.is_set("e"));
306 1.1 jmmv ATF_REQUIRE( tree.is_set("e.var3"));
307 1.1 jmmv ATF_REQUIRE(!tree.is_set("e.var3.trailing"));
308 1.1 jmmv }
309 1.1 jmmv
310 1.1 jmmv
311 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(is_set__invalid_key);
312 1.1 jmmv ATF_TEST_CASE_BODY(is_set__invalid_key)
313 1.1 jmmv {
314 1.1 jmmv config::tree tree;
315 1.1 jmmv
316 1.1 jmmv ATF_REQUIRE_THROW(config::invalid_key_error, tree.is_set(".abc"));
317 1.1 jmmv }
318 1.1 jmmv
319 1.1 jmmv
320 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(set__invalid_key);
321 1.1 jmmv ATF_TEST_CASE_BODY(set__invalid_key)
322 1.1 jmmv {
323 1.1 jmmv config::tree tree;
324 1.1 jmmv
325 1.1 jmmv ATF_REQUIRE_THROW(config::invalid_key_error,
326 1.1 jmmv tree.set< config::int_node >("foo.", 54));
327 1.1 jmmv }
328 1.1 jmmv
329 1.1 jmmv
330 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(set__unknown_key);
331 1.1 jmmv ATF_TEST_CASE_BODY(set__unknown_key)
332 1.1 jmmv {
333 1.1 jmmv config::tree tree;
334 1.1 jmmv
335 1.1 jmmv tree.define< config::int_node >("foo.bar");
336 1.1 jmmv tree.define< config::int_node >("a.b.c");
337 1.1 jmmv tree.define_dynamic("a.d");
338 1.1 jmmv tree.set< config::int_node >("a.b.c", 123);
339 1.1 jmmv tree.set< config::string_node >("a.d.3", "foo");
340 1.1 jmmv
341 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
342 1.1 jmmv tree.set< config::int_node >("abc", 2));
343 1.1 jmmv
344 1.1 jmmv tree.set< config::int_node >("foo.bar", 15);
345 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
346 1.1 jmmv tree.set< config::int_node >("foo.bar.baz", 0));
347 1.1 jmmv
348 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
349 1.1 jmmv tree.set< config::int_node >("a.c", 100));
350 1.1 jmmv tree.set< config::int_node >("a.b.c", -3);
351 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
352 1.1 jmmv tree.set< config::int_node >("a.b.c.d", 82));
353 1.1 jmmv tree.set< config::string_node >("a.d.3", "bar");
354 1.1 jmmv tree.set< config::string_node >("a.d.4", "bar");
355 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
356 1.1 jmmv tree.set< config::int_node >("a.d.4.5", 82));
357 1.1 jmmv tree.set< config::int_node >("a.d.5.6", 82);
358 1.1 jmmv }
359 1.1 jmmv
360 1.1 jmmv
361 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(set__value_error);
362 1.1 jmmv ATF_TEST_CASE_BODY(set__value_error)
363 1.1 jmmv {
364 1.1 jmmv config::tree tree;
365 1.1 jmmv
366 1.1 jmmv tree.define< config::int_node >("foo.bar");
367 1.1 jmmv tree.define_dynamic("a.d");
368 1.1 jmmv
369 1.1 jmmv ATF_REQUIRE_THROW(config::value_error,
370 1.1 jmmv tree.set< config::int_node >("foo", 3));
371 1.1 jmmv ATF_REQUIRE_THROW(config::value_error,
372 1.1 jmmv tree.set< config::int_node >("a", -10));
373 1.1 jmmv }
374 1.1 jmmv
375 1.1 jmmv
376 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(push_lua__ok);
377 1.1 jmmv ATF_TEST_CASE_BODY(push_lua__ok)
378 1.1 jmmv {
379 1.1 jmmv config::tree tree;
380 1.1 jmmv
381 1.1 jmmv tree.define< config::int_node >("top.integer");
382 1.1 jmmv tree.define< wrapped_int_node >("top.custom");
383 1.1 jmmv tree.define_dynamic("dynamic");
384 1.1 jmmv tree.set< config::int_node >("top.integer", 5);
385 1.1 jmmv tree.set< wrapped_int_node >("top.custom", int_wrapper(10));
386 1.1 jmmv tree.set_string("dynamic.first", "foo");
387 1.1 jmmv
388 1.1 jmmv lutok::state state;
389 1.1 jmmv tree.push_lua("top.integer", state);
390 1.1 jmmv tree.push_lua("top.custom", state);
391 1.1 jmmv tree.push_lua("dynamic.first", state);
392 1.1 jmmv ATF_REQUIRE(state.is_number(-3));
393 1.1 jmmv ATF_REQUIRE_EQ(5, state.to_integer(-3));
394 1.1 jmmv ATF_REQUIRE(state.is_number(-2));
395 1.1 jmmv ATF_REQUIRE_EQ(10, state.to_integer(-2));
396 1.1 jmmv ATF_REQUIRE(state.is_string(-1));
397 1.1 jmmv ATF_REQUIRE_EQ("foo", state.to_string(-1));
398 1.1 jmmv state.pop(3);
399 1.1 jmmv }
400 1.1 jmmv
401 1.1 jmmv
402 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(set_lua__ok);
403 1.1 jmmv ATF_TEST_CASE_BODY(set_lua__ok)
404 1.1 jmmv {
405 1.1 jmmv config::tree tree;
406 1.1 jmmv
407 1.1 jmmv tree.define< config::int_node >("top.integer");
408 1.1 jmmv tree.define< wrapped_int_node >("top.custom");
409 1.1 jmmv tree.define_dynamic("dynamic");
410 1.1 jmmv
411 1.1 jmmv {
412 1.1 jmmv lutok::state state;
413 1.1 jmmv state.push_integer(5);
414 1.1 jmmv state.push_integer(10);
415 1.1 jmmv state.push_string("foo");
416 1.1 jmmv tree.set_lua("top.integer", state, -3);
417 1.1 jmmv tree.set_lua("top.custom", state, -2);
418 1.1 jmmv tree.set_lua("dynamic.first", state, -1);
419 1.1 jmmv state.pop(3);
420 1.1 jmmv }
421 1.1 jmmv
422 1.1 jmmv ATF_REQUIRE_EQ(5, tree.lookup< config::int_node >("top.integer"));
423 1.1 jmmv ATF_REQUIRE_EQ(10, tree.lookup< wrapped_int_node >("top.custom").value());
424 1.1 jmmv ATF_REQUIRE_EQ("foo", tree.lookup< config::string_node >("dynamic.first"));
425 1.1 jmmv }
426 1.1 jmmv
427 1.1 jmmv
428 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(lookup_rw);
429 1.1 jmmv ATF_TEST_CASE_BODY(lookup_rw)
430 1.1 jmmv {
431 1.1 jmmv config::tree tree;
432 1.1 jmmv
433 1.1 jmmv tree.define< config::int_node >("var1");
434 1.1 jmmv tree.define< config::bool_node >("var3");
435 1.1 jmmv
436 1.1 jmmv tree.set< config::int_node >("var1", 42);
437 1.1 jmmv tree.set< config::bool_node >("var3", false);
438 1.1 jmmv
439 1.1 jmmv tree.lookup_rw< config::int_node >("var1") += 10;
440 1.1 jmmv ATF_REQUIRE_EQ(52, tree.lookup< config::int_node >("var1"));
441 1.1 jmmv ATF_REQUIRE(!tree.lookup< config::bool_node >("var3"));
442 1.1 jmmv }
443 1.1 jmmv
444 1.1 jmmv
445 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(lookup_string__ok);
446 1.1 jmmv ATF_TEST_CASE_BODY(lookup_string__ok)
447 1.1 jmmv {
448 1.1 jmmv config::tree tree;
449 1.1 jmmv
450 1.1 jmmv tree.define< config::int_node >("var1");
451 1.1 jmmv tree.define< config::string_node >("b.var2");
452 1.1 jmmv tree.define< config::bool_node >("c.d.var3");
453 1.1 jmmv
454 1.1 jmmv tree.set< config::int_node >("var1", 42);
455 1.1 jmmv tree.set< config::string_node >("b.var2", "hello");
456 1.1 jmmv tree.set< config::bool_node >("c.d.var3", false);
457 1.1 jmmv
458 1.1 jmmv ATF_REQUIRE_EQ("42", tree.lookup_string("var1"));
459 1.1 jmmv ATF_REQUIRE_EQ("hello", tree.lookup_string("b.var2"));
460 1.1 jmmv ATF_REQUIRE_EQ("false", tree.lookup_string("c.d.var3"));
461 1.1 jmmv }
462 1.1 jmmv
463 1.1 jmmv
464 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(lookup_string__invalid_key);
465 1.1 jmmv ATF_TEST_CASE_BODY(lookup_string__invalid_key)
466 1.1 jmmv {
467 1.1 jmmv config::tree tree;
468 1.1 jmmv
469 1.1 jmmv ATF_REQUIRE_THROW(config::invalid_key_error, tree.lookup_string(""));
470 1.1 jmmv }
471 1.1 jmmv
472 1.1 jmmv
473 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(lookup_string__unknown_key);
474 1.1 jmmv ATF_TEST_CASE_BODY(lookup_string__unknown_key)
475 1.1 jmmv {
476 1.1 jmmv config::tree tree;
477 1.1 jmmv
478 1.1 jmmv tree.define< config::int_node >("a.b.c");
479 1.1 jmmv
480 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error, tree.lookup_string("a.b"));
481 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error, tree.lookup_string("a.b.c.d"));
482 1.1 jmmv }
483 1.1 jmmv
484 1.1 jmmv
485 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(set_string__ok);
486 1.1 jmmv ATF_TEST_CASE_BODY(set_string__ok)
487 1.1 jmmv {
488 1.1 jmmv config::tree tree;
489 1.1 jmmv
490 1.1 jmmv tree.define< config::int_node >("foo.bar.1");
491 1.1 jmmv tree.define< config::string_node >("foo.bar.2");
492 1.1 jmmv tree.define_dynamic("sub.tree");
493 1.1 jmmv
494 1.1 jmmv tree.set_string("foo.bar.1", "42");
495 1.1 jmmv tree.set_string("foo.bar.2", "hello");
496 1.1 jmmv tree.set_string("sub.tree.2", "15");
497 1.1 jmmv tree.set_string("sub.tree.3.4", "bye");
498 1.1 jmmv
499 1.1 jmmv ATF_REQUIRE_EQ(42, tree.lookup< config::int_node >("foo.bar.1"));
500 1.1 jmmv ATF_REQUIRE_EQ("hello", tree.lookup< config::string_node >("foo.bar.2"));
501 1.1 jmmv ATF_REQUIRE_EQ("15", tree.lookup< config::string_node >("sub.tree.2"));
502 1.1 jmmv ATF_REQUIRE_EQ("bye", tree.lookup< config::string_node >("sub.tree.3.4"));
503 1.1 jmmv }
504 1.1 jmmv
505 1.1 jmmv
506 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(set_string__invalid_key);
507 1.1 jmmv ATF_TEST_CASE_BODY(set_string__invalid_key)
508 1.1 jmmv {
509 1.1 jmmv config::tree tree;
510 1.1 jmmv
511 1.1 jmmv ATF_REQUIRE_THROW(config::invalid_key_error, tree.set_string(".", "foo"));
512 1.1 jmmv }
513 1.1 jmmv
514 1.1 jmmv
515 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(set_string__unknown_key);
516 1.1 jmmv ATF_TEST_CASE_BODY(set_string__unknown_key)
517 1.1 jmmv {
518 1.1 jmmv config::tree tree;
519 1.1 jmmv
520 1.1 jmmv tree.define< config::int_node >("foo.bar");
521 1.1 jmmv tree.define< config::int_node >("a.b.c");
522 1.1 jmmv tree.define_dynamic("a.d");
523 1.1 jmmv tree.set_string("a.b.c", "123");
524 1.1 jmmv tree.set_string("a.d.3", "foo");
525 1.1 jmmv
526 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error, tree.set_string("abc", "2"));
527 1.1 jmmv
528 1.1 jmmv tree.set_string("foo.bar", "15");
529 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
530 1.1 jmmv tree.set_string("foo.bar.baz", "0"));
531 1.1 jmmv
532 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
533 1.1 jmmv tree.set_string("a.c", "100"));
534 1.1 jmmv tree.set_string("a.b.c", "-3");
535 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
536 1.1 jmmv tree.set_string("a.b.c.d", "82"));
537 1.1 jmmv tree.set_string("a.d.3", "bar");
538 1.1 jmmv tree.set_string("a.d.4", "bar");
539 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
540 1.1 jmmv tree.set_string("a.d.4.5", "82"));
541 1.1 jmmv tree.set_string("a.d.5.6", "82");
542 1.1 jmmv }
543 1.1 jmmv
544 1.1 jmmv
545 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(set_string__value_error);
546 1.1 jmmv ATF_TEST_CASE_BODY(set_string__value_error)
547 1.1 jmmv {
548 1.1 jmmv config::tree tree;
549 1.1 jmmv
550 1.1 jmmv tree.define< config::int_node >("foo.bar");
551 1.1 jmmv
552 1.1 jmmv ATF_REQUIRE_THROW(config::value_error,
553 1.1 jmmv tree.set_string("foo", "abc"));
554 1.1 jmmv ATF_REQUIRE_THROW(config::value_error,
555 1.1 jmmv tree.set_string("foo.bar", " -3"));
556 1.1 jmmv ATF_REQUIRE_THROW(config::value_error,
557 1.1 jmmv tree.set_string("foo.bar", "3 "));
558 1.1 jmmv }
559 1.1 jmmv
560 1.1 jmmv
561 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(all_properties__none);
562 1.1 jmmv ATF_TEST_CASE_BODY(all_properties__none)
563 1.1 jmmv {
564 1.1 jmmv const config::tree tree;
565 1.1 jmmv ATF_REQUIRE(tree.all_properties().empty());
566 1.1 jmmv }
567 1.1 jmmv
568 1.1 jmmv
569 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(all_properties__all_set);
570 1.1 jmmv ATF_TEST_CASE_BODY(all_properties__all_set)
571 1.1 jmmv {
572 1.1 jmmv config::tree tree;
573 1.1 jmmv
574 1.1 jmmv tree.define< config::int_node >("plain");
575 1.1 jmmv tree.set< config::int_node >("plain", 1234);
576 1.1 jmmv
577 1.1 jmmv tree.define< config::int_node >("static.first");
578 1.1 jmmv tree.set< config::int_node >("static.first", -3);
579 1.1 jmmv tree.define< config::string_node >("static.second");
580 1.1 jmmv tree.set< config::string_node >("static.second", "some text");
581 1.1 jmmv
582 1.1 jmmv tree.define_dynamic("dynamic");
583 1.1 jmmv tree.set< config::string_node >("dynamic.first", "hello");
584 1.1 jmmv tree.set< config::string_node >("dynamic.second", "bye");
585 1.1 jmmv
586 1.1 jmmv config::properties_map exp_properties;
587 1.1 jmmv exp_properties["plain"] = "1234";
588 1.1 jmmv exp_properties["static.first"] = "-3";
589 1.1 jmmv exp_properties["static.second"] = "some text";
590 1.1 jmmv exp_properties["dynamic.first"] = "hello";
591 1.1 jmmv exp_properties["dynamic.second"] = "bye";
592 1.1 jmmv
593 1.1 jmmv const config::properties_map properties = tree.all_properties();
594 1.1 jmmv ATF_REQUIRE(exp_properties == properties);
595 1.1 jmmv }
596 1.1 jmmv
597 1.1 jmmv
598 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(all_properties__some_unset);
599 1.1 jmmv ATF_TEST_CASE_BODY(all_properties__some_unset)
600 1.1 jmmv {
601 1.1 jmmv config::tree tree;
602 1.1 jmmv
603 1.1 jmmv tree.define< config::int_node >("static.first");
604 1.1 jmmv tree.set< config::int_node >("static.first", -3);
605 1.1 jmmv tree.define< config::string_node >("static.second");
606 1.1 jmmv
607 1.1 jmmv tree.define_dynamic("dynamic");
608 1.1 jmmv
609 1.1 jmmv config::properties_map exp_properties;
610 1.1 jmmv exp_properties["static.first"] = "-3";
611 1.1 jmmv
612 1.1 jmmv const config::properties_map properties = tree.all_properties();
613 1.1 jmmv ATF_REQUIRE(exp_properties == properties);
614 1.1 jmmv }
615 1.1 jmmv
616 1.1 jmmv
617 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__inner);
618 1.1 jmmv ATF_TEST_CASE_BODY(all_properties__subtree__inner)
619 1.1 jmmv {
620 1.1 jmmv config::tree tree;
621 1.1 jmmv
622 1.1 jmmv tree.define< config::int_node >("root.a.b.c.first");
623 1.1 jmmv tree.define< config::int_node >("root.a.b.c.second");
624 1.1 jmmv tree.define< config::int_node >("root.a.d.first");
625 1.1 jmmv
626 1.1 jmmv tree.set< config::int_node >("root.a.b.c.first", 1);
627 1.1 jmmv tree.set< config::int_node >("root.a.b.c.second", 2);
628 1.1 jmmv tree.set< config::int_node >("root.a.d.first", 3);
629 1.1 jmmv
630 1.1 jmmv {
631 1.1 jmmv config::properties_map exp_properties;
632 1.1 jmmv exp_properties["root.a.b.c.first"] = "1";
633 1.1 jmmv exp_properties["root.a.b.c.second"] = "2";
634 1.1 jmmv exp_properties["root.a.d.first"] = "3";
635 1.1 jmmv ATF_REQUIRE(exp_properties == tree.all_properties("root"));
636 1.1 jmmv ATF_REQUIRE(exp_properties == tree.all_properties("root.a"));
637 1.1 jmmv }
638 1.1 jmmv
639 1.1 jmmv {
640 1.1 jmmv config::properties_map exp_properties;
641 1.1 jmmv exp_properties["root.a.b.c.first"] = "1";
642 1.1 jmmv exp_properties["root.a.b.c.second"] = "2";
643 1.1 jmmv ATF_REQUIRE(exp_properties == tree.all_properties("root.a.b"));
644 1.1 jmmv ATF_REQUIRE(exp_properties == tree.all_properties("root.a.b.c"));
645 1.1 jmmv }
646 1.1 jmmv
647 1.1 jmmv {
648 1.1 jmmv config::properties_map exp_properties;
649 1.1 jmmv exp_properties["root.a.d.first"] = "3";
650 1.1 jmmv ATF_REQUIRE(exp_properties == tree.all_properties("root.a.d"));
651 1.1 jmmv }
652 1.1 jmmv }
653 1.1 jmmv
654 1.1 jmmv
655 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__leaf);
656 1.1 jmmv ATF_TEST_CASE_BODY(all_properties__subtree__leaf)
657 1.1 jmmv {
658 1.1 jmmv config::tree tree;
659 1.1 jmmv
660 1.1 jmmv tree.define< config::int_node >("root.a.b.c.first");
661 1.1 jmmv tree.set< config::int_node >("root.a.b.c.first", 1);
662 1.1 jmmv ATF_REQUIRE_THROW_RE(config::value_error, "Cannot export.*leaf",
663 1.1 jmmv tree.all_properties("root.a.b.c.first"));
664 1.1 jmmv }
665 1.1 jmmv
666 1.1 jmmv
667 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__strip_key);
668 1.1 jmmv ATF_TEST_CASE_BODY(all_properties__subtree__strip_key)
669 1.1 jmmv {
670 1.1 jmmv config::tree tree;
671 1.1 jmmv
672 1.1 jmmv tree.define< config::int_node >("root.a.b.c.first");
673 1.1 jmmv tree.define< config::int_node >("root.a.b.c.second");
674 1.1 jmmv tree.define< config::int_node >("root.a.d.first");
675 1.1 jmmv
676 1.1 jmmv tree.set< config::int_node >("root.a.b.c.first", 1);
677 1.1 jmmv tree.set< config::int_node >("root.a.b.c.second", 2);
678 1.1 jmmv tree.set< config::int_node >("root.a.d.first", 3);
679 1.1 jmmv
680 1.1 jmmv config::properties_map exp_properties;
681 1.1 jmmv exp_properties["b.c.first"] = "1";
682 1.1 jmmv exp_properties["b.c.second"] = "2";
683 1.1 jmmv exp_properties["d.first"] = "3";
684 1.1 jmmv ATF_REQUIRE(exp_properties == tree.all_properties("root.a", true));
685 1.1 jmmv }
686 1.1 jmmv
687 1.1 jmmv
688 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__invalid_key);
689 1.1 jmmv ATF_TEST_CASE_BODY(all_properties__subtree__invalid_key)
690 1.1 jmmv {
691 1.1 jmmv config::tree tree;
692 1.1 jmmv
693 1.1 jmmv ATF_REQUIRE_THROW(config::invalid_key_error, tree.all_properties("."));
694 1.1 jmmv }
695 1.1 jmmv
696 1.1 jmmv
697 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__unknown_key);
698 1.1 jmmv ATF_TEST_CASE_BODY(all_properties__subtree__unknown_key)
699 1.1 jmmv {
700 1.1 jmmv config::tree tree;
701 1.1 jmmv
702 1.1 jmmv tree.define< config::int_node >("root.a.b.c.first");
703 1.1 jmmv tree.set< config::int_node >("root.a.b.c.first", 1);
704 1.1 jmmv tree.define< config::int_node >("root.a.b.c.unset");
705 1.1 jmmv
706 1.1 jmmv ATF_REQUIRE_THROW(config::unknown_key_error,
707 1.1 jmmv tree.all_properties("root.a.b.c.first.foo"));
708 1.1 jmmv ATF_REQUIRE_THROW_RE(config::value_error, "Cannot export.*leaf",
709 1.1 jmmv tree.all_properties("root.a.b.c.unset"));
710 1.1 jmmv }
711 1.1 jmmv
712 1.1 jmmv
713 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__empty);
714 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne__empty)
715 1.1 jmmv {
716 1.1 jmmv config::tree t1;
717 1.1 jmmv config::tree t2;
718 1.1 jmmv ATF_REQUIRE( t1 == t2);
719 1.1 jmmv ATF_REQUIRE(!(t1 != t2));
720 1.1 jmmv }
721 1.1 jmmv
722 1.1 jmmv
723 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__shallow_copy);
724 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne__shallow_copy)
725 1.1 jmmv {
726 1.1 jmmv config::tree t1;
727 1.1 jmmv t1.define< config::int_node >("root.a.b.c.first");
728 1.1 jmmv t1.set< config::int_node >("root.a.b.c.first", 1);
729 1.1 jmmv config::tree t2 = t1;
730 1.1 jmmv ATF_REQUIRE( t1 == t2);
731 1.1 jmmv ATF_REQUIRE(!(t1 != t2));
732 1.1 jmmv }
733 1.1 jmmv
734 1.1 jmmv
735 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__deep_copy);
736 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne__deep_copy)
737 1.1 jmmv {
738 1.1 jmmv config::tree t1;
739 1.1 jmmv t1.define< config::int_node >("root.a.b.c.first");
740 1.1 jmmv t1.set< config::int_node >("root.a.b.c.first", 1);
741 1.1 jmmv config::tree t2 = t1.deep_copy();
742 1.1 jmmv ATF_REQUIRE( t1 == t2);
743 1.1 jmmv ATF_REQUIRE(!(t1 != t2));
744 1.1 jmmv }
745 1.1 jmmv
746 1.1 jmmv
747 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__some_contents);
748 1.1 jmmv ATF_TEST_CASE_BODY(operators_eq_and_ne__some_contents)
749 1.1 jmmv {
750 1.1 jmmv config::tree t1, t2;
751 1.1 jmmv
752 1.1 jmmv t1.define< config::int_node >("root.a.b.c.first");
753 1.1 jmmv t1.set< config::int_node >("root.a.b.c.first", 1);
754 1.1 jmmv ATF_REQUIRE(!(t1 == t2));
755 1.1 jmmv ATF_REQUIRE( t1 != t2);
756 1.1 jmmv
757 1.1 jmmv t2.define< config::int_node >("root.a.b.c.first");
758 1.1 jmmv t2.set< config::int_node >("root.a.b.c.first", 1);
759 1.1 jmmv ATF_REQUIRE( t1 == t2);
760 1.1 jmmv ATF_REQUIRE(!(t1 != t2));
761 1.1 jmmv
762 1.1 jmmv t1.set< config::int_node >("root.a.b.c.first", 2);
763 1.1 jmmv ATF_REQUIRE(!(t1 == t2));
764 1.1 jmmv ATF_REQUIRE( t1 != t2);
765 1.1 jmmv
766 1.1 jmmv t2.set< config::int_node >("root.a.b.c.first", 2);
767 1.1 jmmv ATF_REQUIRE( t1 == t2);
768 1.1 jmmv ATF_REQUIRE(!(t1 != t2));
769 1.1 jmmv
770 1.1 jmmv t1.define< config::string_node >("another.key");
771 1.1 jmmv t1.set< config::string_node >("another.key", "some text");
772 1.1 jmmv ATF_REQUIRE(!(t1 == t2));
773 1.1 jmmv ATF_REQUIRE( t1 != t2);
774 1.1 jmmv
775 1.1 jmmv t2.define< config::string_node >("another.key");
776 1.1 jmmv t2.set< config::string_node >("another.key", "some text");
777 1.1 jmmv ATF_REQUIRE( t1 == t2);
778 1.1 jmmv ATF_REQUIRE(!(t1 != t2));
779 1.1 jmmv }
780 1.1 jmmv
781 1.1 jmmv
782 1.1 jmmv ATF_TEST_CASE_WITHOUT_HEAD(custom_leaf__no_default_ctor);
783 1.1 jmmv ATF_TEST_CASE_BODY(custom_leaf__no_default_ctor)
784 1.1 jmmv {
785 1.1 jmmv config::tree tree;
786 1.1 jmmv
787 1.1 jmmv tree.define< wrapped_int_node >("test1");
788 1.1 jmmv tree.define< wrapped_int_node >("test2");
789 1.1 jmmv tree.set< wrapped_int_node >("test1", int_wrapper(5));
790 1.1 jmmv tree.set< wrapped_int_node >("test2", int_wrapper(10));
791 1.1 jmmv const int_wrapper& test1 = tree.lookup< wrapped_int_node >("test1");
792 1.1 jmmv ATF_REQUIRE_EQ(5, test1.value());
793 1.1 jmmv const int_wrapper& test2 = tree.lookup< wrapped_int_node >("test2");
794 1.1 jmmv ATF_REQUIRE_EQ(10, test2.value());
795 1.1 jmmv }
796 1.1 jmmv
797 1.1 jmmv
798 1.1 jmmv ATF_INIT_TEST_CASES(tcs)
799 1.1 jmmv {
800 1.1 jmmv ATF_ADD_TEST_CASE(tcs, define_set_lookup__one_level);
801 1.1 jmmv ATF_ADD_TEST_CASE(tcs, define_set_lookup__multiple_levels);
802 1.1 jmmv
803 1.1 jmmv ATF_ADD_TEST_CASE(tcs, deep_copy__empty);
804 1.1 jmmv ATF_ADD_TEST_CASE(tcs, deep_copy__some);
805 1.1 jmmv
806 1.1 jmmv ATF_ADD_TEST_CASE(tcs, lookup__invalid_key);
807 1.1 jmmv ATF_ADD_TEST_CASE(tcs, lookup__unknown_key);
808 1.1 jmmv
809 1.1 jmmv ATF_ADD_TEST_CASE(tcs, is_set__one_level);
810 1.1 jmmv ATF_ADD_TEST_CASE(tcs, is_set__multiple_levels);
811 1.1 jmmv ATF_ADD_TEST_CASE(tcs, is_set__invalid_key);
812 1.1 jmmv
813 1.1 jmmv ATF_ADD_TEST_CASE(tcs, set__invalid_key);
814 1.1 jmmv ATF_ADD_TEST_CASE(tcs, set__unknown_key);
815 1.1 jmmv ATF_ADD_TEST_CASE(tcs, set__value_error);
816 1.1 jmmv
817 1.1 jmmv ATF_ADD_TEST_CASE(tcs, push_lua__ok);
818 1.1 jmmv ATF_ADD_TEST_CASE(tcs, set_lua__ok);
819 1.1 jmmv
820 1.1 jmmv ATF_ADD_TEST_CASE(tcs, lookup_rw);
821 1.1 jmmv
822 1.1 jmmv ATF_ADD_TEST_CASE(tcs, lookup_string__ok);
823 1.1 jmmv ATF_ADD_TEST_CASE(tcs, lookup_string__invalid_key);
824 1.1 jmmv ATF_ADD_TEST_CASE(tcs, lookup_string__unknown_key);
825 1.1 jmmv
826 1.1 jmmv ATF_ADD_TEST_CASE(tcs, set_string__ok);
827 1.1 jmmv ATF_ADD_TEST_CASE(tcs, set_string__invalid_key);
828 1.1 jmmv ATF_ADD_TEST_CASE(tcs, set_string__unknown_key);
829 1.1 jmmv ATF_ADD_TEST_CASE(tcs, set_string__value_error);
830 1.1 jmmv
831 1.1 jmmv ATF_ADD_TEST_CASE(tcs, all_properties__none);
832 1.1 jmmv ATF_ADD_TEST_CASE(tcs, all_properties__all_set);
833 1.1 jmmv ATF_ADD_TEST_CASE(tcs, all_properties__some_unset);
834 1.1 jmmv ATF_ADD_TEST_CASE(tcs, all_properties__subtree__inner);
835 1.1 jmmv ATF_ADD_TEST_CASE(tcs, all_properties__subtree__leaf);
836 1.1 jmmv ATF_ADD_TEST_CASE(tcs, all_properties__subtree__strip_key);
837 1.1 jmmv ATF_ADD_TEST_CASE(tcs, all_properties__subtree__invalid_key);
838 1.1 jmmv ATF_ADD_TEST_CASE(tcs, all_properties__subtree__unknown_key);
839 1.1 jmmv
840 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__empty);
841 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__shallow_copy);
842 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__deep_copy);
843 1.1 jmmv ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__some_contents);
844 1.1 jmmv
845 1.1 jmmv ATF_ADD_TEST_CASE(tcs, custom_leaf__no_default_ctor);
846 1.1 jmmv }
847