1b0d29bc4SBrooks Davis // Copyright 2012 The Kyua Authors.
2b0d29bc4SBrooks Davis // All rights reserved.
3b0d29bc4SBrooks Davis //
4b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6b0d29bc4SBrooks Davis // met:
7b0d29bc4SBrooks Davis //
8b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer.
10b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the
12b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution.
13b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software
15b0d29bc4SBrooks Davis // without specific prior written permission.
16b0d29bc4SBrooks Davis //
17b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28b0d29bc4SBrooks Davis
29b0d29bc4SBrooks Davis #include "utils/config/tree.ipp"
30b0d29bc4SBrooks Davis
31b0d29bc4SBrooks Davis #include <atf-c++.hpp>
32b0d29bc4SBrooks Davis
33b0d29bc4SBrooks Davis #include "utils/config/nodes.ipp"
34b0d29bc4SBrooks Davis #include "utils/format/macros.hpp"
35b0d29bc4SBrooks Davis #include "utils/text/operations.ipp"
36b0d29bc4SBrooks Davis
37b0d29bc4SBrooks Davis namespace config = utils::config;
38b0d29bc4SBrooks Davis namespace text = utils::text;
39b0d29bc4SBrooks Davis
40b0d29bc4SBrooks Davis
41b0d29bc4SBrooks Davis namespace {
42b0d29bc4SBrooks Davis
43b0d29bc4SBrooks Davis
44b0d29bc4SBrooks Davis /// Simple wrapper around an integer value without default constructors.
45b0d29bc4SBrooks Davis ///
46b0d29bc4SBrooks Davis /// The purpose of this type is to have a simple class without default
47b0d29bc4SBrooks Davis /// constructors to validate that we can use it as a leaf of a tree.
48b0d29bc4SBrooks Davis class int_wrapper {
49b0d29bc4SBrooks Davis /// The wrapped integer value.
50b0d29bc4SBrooks Davis int _value;
51b0d29bc4SBrooks Davis
52b0d29bc4SBrooks Davis public:
53b0d29bc4SBrooks Davis /// Constructs a new wrapped integer.
54b0d29bc4SBrooks Davis ///
55b0d29bc4SBrooks Davis /// \param value_ The value to store in the object.
int_wrapper(int value_)56b0d29bc4SBrooks Davis explicit int_wrapper(int value_) :
57b0d29bc4SBrooks Davis _value(value_)
58b0d29bc4SBrooks Davis {
59b0d29bc4SBrooks Davis }
60b0d29bc4SBrooks Davis
61b0d29bc4SBrooks Davis /// \return The integer value stored by the object.
62b0d29bc4SBrooks Davis int
value(void) const63b0d29bc4SBrooks Davis value(void) const
64b0d29bc4SBrooks Davis {
65b0d29bc4SBrooks Davis return _value;
66b0d29bc4SBrooks Davis }
67b0d29bc4SBrooks Davis };
68b0d29bc4SBrooks Davis
69b0d29bc4SBrooks Davis
70b0d29bc4SBrooks Davis /// Custom tree leaf type for an object without defualt constructors.
71b0d29bc4SBrooks Davis class wrapped_int_node : public config::typed_leaf_node< int_wrapper > {
72b0d29bc4SBrooks Davis public:
73b0d29bc4SBrooks Davis /// Copies the node.
74b0d29bc4SBrooks Davis ///
75b0d29bc4SBrooks Davis /// \return A dynamically-allocated node.
76b0d29bc4SBrooks Davis virtual base_node*
deep_copy(void) const77b0d29bc4SBrooks Davis deep_copy(void) const
78b0d29bc4SBrooks Davis {
79*b392a90bSJohn Baldwin std::unique_ptr< wrapped_int_node > new_node(new wrapped_int_node());
80b0d29bc4SBrooks Davis new_node->_value = _value;
81b0d29bc4SBrooks Davis return new_node.release();
82b0d29bc4SBrooks Davis }
83b0d29bc4SBrooks Davis
84b0d29bc4SBrooks Davis /// Pushes the node's value onto the Lua stack.
85b0d29bc4SBrooks Davis ///
86b0d29bc4SBrooks Davis /// \param state The Lua state onto which to push the value.
87b0d29bc4SBrooks Davis void
push_lua(lutok::state & state) const88b0d29bc4SBrooks Davis push_lua(lutok::state& state) const
89b0d29bc4SBrooks Davis {
90b0d29bc4SBrooks Davis state.push_integer(
91b0d29bc4SBrooks Davis config::typed_leaf_node< int_wrapper >::value().value());
92b0d29bc4SBrooks Davis }
93b0d29bc4SBrooks Davis
94b0d29bc4SBrooks Davis /// Sets the value of the node from an entry in the Lua stack.
95b0d29bc4SBrooks Davis ///
96b0d29bc4SBrooks Davis /// \param state The Lua state from which to get the value.
97b0d29bc4SBrooks Davis /// \param value_index The stack index in which the value resides.
98b0d29bc4SBrooks Davis void
set_lua(lutok::state & state,const int value_index)99b0d29bc4SBrooks Davis set_lua(lutok::state& state, const int value_index)
100b0d29bc4SBrooks Davis {
101b0d29bc4SBrooks Davis ATF_REQUIRE(state.is_number(value_index));
102b0d29bc4SBrooks Davis int_wrapper new_value(state.to_integer(value_index));
103b0d29bc4SBrooks Davis config::typed_leaf_node< int_wrapper >::set(new_value);
104b0d29bc4SBrooks Davis }
105b0d29bc4SBrooks Davis
106b0d29bc4SBrooks Davis /// Sets the value of the node from a raw string representation.
107b0d29bc4SBrooks Davis ///
108b0d29bc4SBrooks Davis /// \param raw_value The value to set the node to.
109b0d29bc4SBrooks Davis void
set_string(const std::string & raw_value)110b0d29bc4SBrooks Davis set_string(const std::string& raw_value)
111b0d29bc4SBrooks Davis {
112b0d29bc4SBrooks Davis int_wrapper new_value(text::to_type< int >(raw_value));
113b0d29bc4SBrooks Davis config::typed_leaf_node< int_wrapper >::set(new_value);
114b0d29bc4SBrooks Davis }
115b0d29bc4SBrooks Davis
116b0d29bc4SBrooks Davis /// Converts the contents of the node to a string.
117b0d29bc4SBrooks Davis ///
118b0d29bc4SBrooks Davis /// \return A string representation of the value held by the node.
119b0d29bc4SBrooks Davis std::string
to_string(void) const120b0d29bc4SBrooks Davis to_string(void) const
121b0d29bc4SBrooks Davis {
122b0d29bc4SBrooks Davis return F("%s") %
123b0d29bc4SBrooks Davis config::typed_leaf_node< int_wrapper >::value().value();
124b0d29bc4SBrooks Davis }
125b0d29bc4SBrooks Davis };
126b0d29bc4SBrooks Davis
127b0d29bc4SBrooks Davis
128b0d29bc4SBrooks Davis } // anonymous namespace
129b0d29bc4SBrooks Davis
130b0d29bc4SBrooks Davis
131b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(define_set_lookup__one_level);
ATF_TEST_CASE_BODY(define_set_lookup__one_level)132b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(define_set_lookup__one_level)
133b0d29bc4SBrooks Davis {
134b0d29bc4SBrooks Davis config::tree tree;
135b0d29bc4SBrooks Davis
136b0d29bc4SBrooks Davis tree.define< config::int_node >("var1");
137b0d29bc4SBrooks Davis tree.define< config::string_node >("var2");
138b0d29bc4SBrooks Davis tree.define< config::bool_node >("var3");
139b0d29bc4SBrooks Davis
140b0d29bc4SBrooks Davis tree.set< config::int_node >("var1", 42);
141b0d29bc4SBrooks Davis tree.set< config::string_node >("var2", "hello");
142b0d29bc4SBrooks Davis tree.set< config::bool_node >("var3", false);
143b0d29bc4SBrooks Davis
144b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(42, tree.lookup< config::int_node >("var1"));
145b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("hello", tree.lookup< config::string_node >("var2"));
146b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.lookup< config::bool_node >("var3"));
147b0d29bc4SBrooks Davis }
148b0d29bc4SBrooks Davis
149b0d29bc4SBrooks Davis
150b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(define_set_lookup__multiple_levels);
ATF_TEST_CASE_BODY(define_set_lookup__multiple_levels)151b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(define_set_lookup__multiple_levels)
152b0d29bc4SBrooks Davis {
153b0d29bc4SBrooks Davis config::tree tree;
154b0d29bc4SBrooks Davis
155b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar.1");
156b0d29bc4SBrooks Davis tree.define< config::string_node >("foo.bar.2");
157b0d29bc4SBrooks Davis tree.define< config::bool_node >("foo.3");
158b0d29bc4SBrooks Davis tree.define_dynamic("sub.tree");
159b0d29bc4SBrooks Davis
160b0d29bc4SBrooks Davis tree.set< config::int_node >("foo.bar.1", 42);
161b0d29bc4SBrooks Davis tree.set< config::string_node >("foo.bar.2", "hello");
162b0d29bc4SBrooks Davis tree.set< config::bool_node >("foo.3", true);
163b0d29bc4SBrooks Davis tree.set< config::string_node >("sub.tree.1", "bye");
164b0d29bc4SBrooks Davis tree.set< config::int_node >("sub.tree.2", 4);
165b0d29bc4SBrooks Davis tree.set< config::int_node >("sub.tree.3.4", 123);
166b0d29bc4SBrooks Davis
167b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(42, tree.lookup< config::int_node >("foo.bar.1"));
168b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("hello", tree.lookup< config::string_node >("foo.bar.2"));
169b0d29bc4SBrooks Davis ATF_REQUIRE(tree.lookup< config::bool_node >("foo.3"));
170b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(4, tree.lookup< config::int_node >("sub.tree.2"));
171b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(123, tree.lookup< config::int_node >("sub.tree.3.4"));
172b0d29bc4SBrooks Davis }
173b0d29bc4SBrooks Davis
174b0d29bc4SBrooks Davis
175b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(deep_copy__empty);
ATF_TEST_CASE_BODY(deep_copy__empty)176b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(deep_copy__empty)
177b0d29bc4SBrooks Davis {
178b0d29bc4SBrooks Davis config::tree tree1;
179b0d29bc4SBrooks Davis config::tree tree2 = tree1.deep_copy();
180b0d29bc4SBrooks Davis
181b0d29bc4SBrooks Davis tree1.define< config::bool_node >("var1");
182b0d29bc4SBrooks Davis // This would crash if the copy shared the internal data.
183b0d29bc4SBrooks Davis tree2.define< config::int_node >("var1");
184b0d29bc4SBrooks Davis }
185b0d29bc4SBrooks Davis
186b0d29bc4SBrooks Davis
187b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(deep_copy__some);
ATF_TEST_CASE_BODY(deep_copy__some)188b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(deep_copy__some)
189b0d29bc4SBrooks Davis {
190b0d29bc4SBrooks Davis config::tree tree1;
191b0d29bc4SBrooks Davis tree1.define< config::bool_node >("this.is.a.var");
192b0d29bc4SBrooks Davis tree1.set< config::bool_node >("this.is.a.var", true);
193b0d29bc4SBrooks Davis tree1.define< config::int_node >("this.is.another.var");
194b0d29bc4SBrooks Davis tree1.set< config::int_node >("this.is.another.var", 34);
195b0d29bc4SBrooks Davis tree1.define< config::int_node >("and.another");
196b0d29bc4SBrooks Davis tree1.set< config::int_node >("and.another", 123);
197b0d29bc4SBrooks Davis
198b0d29bc4SBrooks Davis config::tree tree2 = tree1.deep_copy();
199b0d29bc4SBrooks Davis tree2.set< config::bool_node >("this.is.a.var", false);
200b0d29bc4SBrooks Davis tree2.set< config::int_node >("this.is.another.var", 43);
201b0d29bc4SBrooks Davis
202b0d29bc4SBrooks Davis ATF_REQUIRE( tree1.lookup< config::bool_node >("this.is.a.var"));
203b0d29bc4SBrooks Davis ATF_REQUIRE(!tree2.lookup< config::bool_node >("this.is.a.var"));
204b0d29bc4SBrooks Davis
205b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(34, tree1.lookup< config::int_node >("this.is.another.var"));
206b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(43, tree2.lookup< config::int_node >("this.is.another.var"));
207b0d29bc4SBrooks Davis
208b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(123, tree1.lookup< config::int_node >("and.another"));
209b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(123, tree2.lookup< config::int_node >("and.another"));
210b0d29bc4SBrooks Davis }
211b0d29bc4SBrooks Davis
212b0d29bc4SBrooks Davis
213b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(combine__empty);
ATF_TEST_CASE_BODY(combine__empty)214b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(combine__empty)
215b0d29bc4SBrooks Davis {
216b0d29bc4SBrooks Davis const config::tree t1, t2;
217b0d29bc4SBrooks Davis const config::tree combined = t1.combine(t2);
218b0d29bc4SBrooks Davis
219b0d29bc4SBrooks Davis const config::tree expected;
220b0d29bc4SBrooks Davis ATF_REQUIRE(expected == combined);
221b0d29bc4SBrooks Davis }
222b0d29bc4SBrooks Davis
223b0d29bc4SBrooks Davis
224b0d29bc4SBrooks Davis static void
init_tree_for_combine_test(config::tree & tree)225b0d29bc4SBrooks Davis init_tree_for_combine_test(config::tree& tree)
226b0d29bc4SBrooks Davis {
227b0d29bc4SBrooks Davis tree.define< config::int_node >("int-node");
228b0d29bc4SBrooks Davis tree.define< config::string_node >("string-node");
229b0d29bc4SBrooks Davis tree.define< config::int_node >("unused.node");
230b0d29bc4SBrooks Davis tree.define< config::int_node >("deeper.int.node");
231b0d29bc4SBrooks Davis tree.define_dynamic("deeper.dynamic");
232b0d29bc4SBrooks Davis }
233b0d29bc4SBrooks Davis
234b0d29bc4SBrooks Davis
235b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(combine__same_layout__no_overrides);
ATF_TEST_CASE_BODY(combine__same_layout__no_overrides)236b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(combine__same_layout__no_overrides)
237b0d29bc4SBrooks Davis {
238b0d29bc4SBrooks Davis config::tree t1, t2;
239b0d29bc4SBrooks Davis init_tree_for_combine_test(t1);
240b0d29bc4SBrooks Davis init_tree_for_combine_test(t2);
241b0d29bc4SBrooks Davis t1.set< config::int_node >("int-node", 3);
242b0d29bc4SBrooks Davis t1.set< config::string_node >("string-node", "foo");
243b0d29bc4SBrooks Davis t1.set< config::int_node >("deeper.int.node", 15);
244b0d29bc4SBrooks Davis t1.set_string("deeper.dynamic.first", "value1");
245b0d29bc4SBrooks Davis t1.set_string("deeper.dynamic.second", "value2");
246b0d29bc4SBrooks Davis const config::tree combined = t1.combine(t2);
247b0d29bc4SBrooks Davis
248b0d29bc4SBrooks Davis ATF_REQUIRE(t1 == combined);
249b0d29bc4SBrooks Davis }
250b0d29bc4SBrooks Davis
251b0d29bc4SBrooks Davis
252b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(combine__same_layout__no_base);
ATF_TEST_CASE_BODY(combine__same_layout__no_base)253b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(combine__same_layout__no_base)
254b0d29bc4SBrooks Davis {
255b0d29bc4SBrooks Davis config::tree t1, t2;
256b0d29bc4SBrooks Davis init_tree_for_combine_test(t1);
257b0d29bc4SBrooks Davis init_tree_for_combine_test(t2);
258b0d29bc4SBrooks Davis t2.set< config::int_node >("int-node", 3);
259b0d29bc4SBrooks Davis t2.set< config::string_node >("string-node", "foo");
260b0d29bc4SBrooks Davis t2.set< config::int_node >("deeper.int.node", 15);
261b0d29bc4SBrooks Davis t2.set_string("deeper.dynamic.first", "value1");
262b0d29bc4SBrooks Davis t2.set_string("deeper.dynamic.second", "value2");
263b0d29bc4SBrooks Davis const config::tree combined = t1.combine(t2);
264b0d29bc4SBrooks Davis
265b0d29bc4SBrooks Davis ATF_REQUIRE(t2 == combined);
266b0d29bc4SBrooks Davis }
267b0d29bc4SBrooks Davis
268b0d29bc4SBrooks Davis
269b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(combine__same_layout__mix);
ATF_TEST_CASE_BODY(combine__same_layout__mix)270b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(combine__same_layout__mix)
271b0d29bc4SBrooks Davis {
272b0d29bc4SBrooks Davis config::tree t1, t2;
273b0d29bc4SBrooks Davis init_tree_for_combine_test(t1);
274b0d29bc4SBrooks Davis init_tree_for_combine_test(t2);
275b0d29bc4SBrooks Davis t1.set< config::int_node >("int-node", 3);
276b0d29bc4SBrooks Davis t2.set< config::int_node >("int-node", 5);
277b0d29bc4SBrooks Davis t1.set< config::string_node >("string-node", "foo");
278b0d29bc4SBrooks Davis t2.set< config::int_node >("deeper.int.node", 15);
279b0d29bc4SBrooks Davis t1.set_string("deeper.dynamic.first", "value1");
280b0d29bc4SBrooks Davis t1.set_string("deeper.dynamic.second", "value2.1");
281b0d29bc4SBrooks Davis t2.set_string("deeper.dynamic.second", "value2.2");
282b0d29bc4SBrooks Davis t2.set_string("deeper.dynamic.third", "value3");
283b0d29bc4SBrooks Davis const config::tree combined = t1.combine(t2);
284b0d29bc4SBrooks Davis
285b0d29bc4SBrooks Davis config::tree expected;
286b0d29bc4SBrooks Davis init_tree_for_combine_test(expected);
287b0d29bc4SBrooks Davis expected.set< config::int_node >("int-node", 5);
288b0d29bc4SBrooks Davis expected.set< config::string_node >("string-node", "foo");
289b0d29bc4SBrooks Davis expected.set< config::int_node >("deeper.int.node", 15);
290b0d29bc4SBrooks Davis expected.set_string("deeper.dynamic.first", "value1");
291b0d29bc4SBrooks Davis expected.set_string("deeper.dynamic.second", "value2.2");
292b0d29bc4SBrooks Davis expected.set_string("deeper.dynamic.third", "value3");
293b0d29bc4SBrooks Davis ATF_REQUIRE(expected == combined);
294b0d29bc4SBrooks Davis }
295b0d29bc4SBrooks Davis
296b0d29bc4SBrooks Davis
297b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(combine__different_layout);
ATF_TEST_CASE_BODY(combine__different_layout)298b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(combine__different_layout)
299b0d29bc4SBrooks Davis {
300b0d29bc4SBrooks Davis config::tree t1;
301b0d29bc4SBrooks Davis t1.define< config::int_node >("common.base1");
302b0d29bc4SBrooks Davis t1.define< config::int_node >("common.base2");
303b0d29bc4SBrooks Davis t1.define_dynamic("dynamic.base");
304b0d29bc4SBrooks Davis t1.define< config::int_node >("unset.base");
305b0d29bc4SBrooks Davis
306b0d29bc4SBrooks Davis config::tree t2;
307b0d29bc4SBrooks Davis t2.define< config::int_node >("common.base2");
308b0d29bc4SBrooks Davis t2.define< config::int_node >("common.base3");
309b0d29bc4SBrooks Davis t2.define_dynamic("dynamic.other");
310b0d29bc4SBrooks Davis t2.define< config::int_node >("unset.other");
311b0d29bc4SBrooks Davis
312b0d29bc4SBrooks Davis t1.set< config::int_node >("common.base1", 1);
313b0d29bc4SBrooks Davis t1.set< config::int_node >("common.base2", 2);
314b0d29bc4SBrooks Davis t1.set_string("dynamic.base.first", "foo");
315b0d29bc4SBrooks Davis t1.set_string("dynamic.base.second", "bar");
316b0d29bc4SBrooks Davis
317b0d29bc4SBrooks Davis t2.set< config::int_node >("common.base2", 4);
318b0d29bc4SBrooks Davis t2.set< config::int_node >("common.base3", 3);
319b0d29bc4SBrooks Davis t2.set_string("dynamic.other.first", "FOO");
320b0d29bc4SBrooks Davis t2.set_string("dynamic.other.second", "BAR");
321b0d29bc4SBrooks Davis
322b0d29bc4SBrooks Davis config::tree combined = t1.combine(t2);
323b0d29bc4SBrooks Davis
324b0d29bc4SBrooks Davis config::tree expected;
325b0d29bc4SBrooks Davis expected.define< config::int_node >("common.base1");
326b0d29bc4SBrooks Davis expected.define< config::int_node >("common.base2");
327b0d29bc4SBrooks Davis expected.define< config::int_node >("common.base3");
328b0d29bc4SBrooks Davis expected.define_dynamic("dynamic.base");
329b0d29bc4SBrooks Davis expected.define_dynamic("dynamic.other");
330b0d29bc4SBrooks Davis expected.define< config::int_node >("unset.base");
331b0d29bc4SBrooks Davis expected.define< config::int_node >("unset.other");
332b0d29bc4SBrooks Davis
333b0d29bc4SBrooks Davis expected.set< config::int_node >("common.base1", 1);
334b0d29bc4SBrooks Davis expected.set< config::int_node >("common.base2", 4);
335b0d29bc4SBrooks Davis expected.set< config::int_node >("common.base3", 3);
336b0d29bc4SBrooks Davis expected.set_string("dynamic.base.first", "foo");
337b0d29bc4SBrooks Davis expected.set_string("dynamic.base.second", "bar");
338b0d29bc4SBrooks Davis expected.set_string("dynamic.other.first", "FOO");
339b0d29bc4SBrooks Davis expected.set_string("dynamic.other.second", "BAR");
340b0d29bc4SBrooks Davis
341b0d29bc4SBrooks Davis ATF_REQUIRE(expected == combined);
342b0d29bc4SBrooks Davis
343b0d29bc4SBrooks Davis // The combined tree should have respected existing but unset nodes. Check
344b0d29bc4SBrooks Davis // that these calls do not crash.
345b0d29bc4SBrooks Davis combined.set< config::int_node >("unset.base", 5);
346b0d29bc4SBrooks Davis combined.set< config::int_node >("unset.other", 5);
347b0d29bc4SBrooks Davis }
348b0d29bc4SBrooks Davis
349b0d29bc4SBrooks Davis
350b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(combine__dynamic_wins);
ATF_TEST_CASE_BODY(combine__dynamic_wins)351b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(combine__dynamic_wins)
352b0d29bc4SBrooks Davis {
353b0d29bc4SBrooks Davis config::tree t1;
354b0d29bc4SBrooks Davis t1.define< config::int_node >("inner.leaf1");
355b0d29bc4SBrooks Davis t1.set< config::int_node >("inner.leaf1", 3);
356b0d29bc4SBrooks Davis
357b0d29bc4SBrooks Davis config::tree t2;
358b0d29bc4SBrooks Davis t2.define_dynamic("inner");
359b0d29bc4SBrooks Davis t2.set_string("inner.leaf2", "4");
360b0d29bc4SBrooks Davis
361b0d29bc4SBrooks Davis config::tree combined = t1.combine(t2);
362b0d29bc4SBrooks Davis
363b0d29bc4SBrooks Davis config::tree expected;
364b0d29bc4SBrooks Davis expected.define_dynamic("inner");
365b0d29bc4SBrooks Davis expected.set_string("inner.leaf1", "3");
366b0d29bc4SBrooks Davis expected.set_string("inner.leaf2", "4");
367b0d29bc4SBrooks Davis
368b0d29bc4SBrooks Davis ATF_REQUIRE(expected == combined);
369b0d29bc4SBrooks Davis
370b0d29bc4SBrooks Davis // The combined inner node should have become dynamic so this call should
371b0d29bc4SBrooks Davis // not fail.
372b0d29bc4SBrooks Davis combined.set_string("inner.leaf3", "5");
373b0d29bc4SBrooks Davis }
374b0d29bc4SBrooks Davis
375b0d29bc4SBrooks Davis
376b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(combine__inner_leaf_mismatch);
ATF_TEST_CASE_BODY(combine__inner_leaf_mismatch)377b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(combine__inner_leaf_mismatch)
378b0d29bc4SBrooks Davis {
379b0d29bc4SBrooks Davis config::tree t1;
380b0d29bc4SBrooks Davis t1.define< config::int_node >("top.foo.bar");
381b0d29bc4SBrooks Davis
382b0d29bc4SBrooks Davis config::tree t2;
383b0d29bc4SBrooks Davis t2.define< config::int_node >("top.foo");
384b0d29bc4SBrooks Davis
385b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(config::bad_combination_error,
386b0d29bc4SBrooks Davis "'top.foo' is an inner node in the base tree but a "
387b0d29bc4SBrooks Davis "leaf node in the overrides tree",
388b0d29bc4SBrooks Davis t1.combine(t2));
389b0d29bc4SBrooks Davis
390b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(config::bad_combination_error,
391b0d29bc4SBrooks Davis "'top.foo' is a leaf node in the base tree but an "
392b0d29bc4SBrooks Davis "inner node in the overrides tree",
393b0d29bc4SBrooks Davis t2.combine(t1));
394b0d29bc4SBrooks Davis }
395b0d29bc4SBrooks Davis
396b0d29bc4SBrooks Davis
397b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(lookup__invalid_key);
ATF_TEST_CASE_BODY(lookup__invalid_key)398b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(lookup__invalid_key)
399b0d29bc4SBrooks Davis {
400b0d29bc4SBrooks Davis config::tree tree;
401b0d29bc4SBrooks Davis
402b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_error,
403b0d29bc4SBrooks Davis tree.lookup< config::int_node >("."));
404b0d29bc4SBrooks Davis }
405b0d29bc4SBrooks Davis
406b0d29bc4SBrooks Davis
407b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(lookup__unknown_key);
ATF_TEST_CASE_BODY(lookup__unknown_key)408b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(lookup__unknown_key)
409b0d29bc4SBrooks Davis {
410b0d29bc4SBrooks Davis config::tree tree;
411b0d29bc4SBrooks Davis
412b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar");
413b0d29bc4SBrooks Davis tree.define< config::int_node >("a.b.c");
414b0d29bc4SBrooks Davis tree.define_dynamic("a.d");
415b0d29bc4SBrooks Davis tree.set< config::int_node >("a.b.c", 123);
416b0d29bc4SBrooks Davis tree.set< config::int_node >("a.d.100", 0);
417b0d29bc4SBrooks Davis
418b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
419b0d29bc4SBrooks Davis tree.lookup< config::int_node >("abc"));
420b0d29bc4SBrooks Davis
421b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
422b0d29bc4SBrooks Davis tree.lookup< config::int_node >("foo"));
423b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
424b0d29bc4SBrooks Davis tree.lookup< config::int_node >("foo.bar"));
425b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
426b0d29bc4SBrooks Davis tree.lookup< config::int_node >("foo.bar.baz"));
427b0d29bc4SBrooks Davis
428b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
429b0d29bc4SBrooks Davis tree.lookup< config::int_node >("a"));
430b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
431b0d29bc4SBrooks Davis tree.lookup< config::int_node >("a.b"));
432b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
433b0d29bc4SBrooks Davis tree.lookup< config::int_node >("a.c"));
434b0d29bc4SBrooks Davis (void)tree.lookup< config::int_node >("a.b.c");
435b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
436b0d29bc4SBrooks Davis tree.lookup< config::int_node >("a.b.c.d"));
437b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
438b0d29bc4SBrooks Davis tree.lookup< config::int_node >("a.d"));
439b0d29bc4SBrooks Davis (void)tree.lookup< config::int_node >("a.d.100");
440b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
441b0d29bc4SBrooks Davis tree.lookup< config::int_node >("a.d.101"));
442b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
443b0d29bc4SBrooks Davis tree.lookup< config::int_node >("a.d.100.3"));
444b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
445b0d29bc4SBrooks Davis tree.lookup< config::int_node >("a.d.e"));
446b0d29bc4SBrooks Davis }
447b0d29bc4SBrooks Davis
448b0d29bc4SBrooks Davis
449b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_set__one_level);
ATF_TEST_CASE_BODY(is_set__one_level)450b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(is_set__one_level)
451b0d29bc4SBrooks Davis {
452b0d29bc4SBrooks Davis config::tree tree;
453b0d29bc4SBrooks Davis
454b0d29bc4SBrooks Davis tree.define< config::int_node >("var1");
455b0d29bc4SBrooks Davis tree.define< config::string_node >("var2");
456b0d29bc4SBrooks Davis tree.define< config::bool_node >("var3");
457b0d29bc4SBrooks Davis
458b0d29bc4SBrooks Davis tree.set< config::int_node >("var1", 42);
459b0d29bc4SBrooks Davis tree.set< config::bool_node >("var3", false);
460b0d29bc4SBrooks Davis
461b0d29bc4SBrooks Davis ATF_REQUIRE( tree.is_set("var1"));
462b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("var2"));
463b0d29bc4SBrooks Davis ATF_REQUIRE( tree.is_set("var3"));
464b0d29bc4SBrooks Davis }
465b0d29bc4SBrooks Davis
466b0d29bc4SBrooks Davis
467b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_set__multiple_levels);
ATF_TEST_CASE_BODY(is_set__multiple_levels)468b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(is_set__multiple_levels)
469b0d29bc4SBrooks Davis {
470b0d29bc4SBrooks Davis config::tree tree;
471b0d29bc4SBrooks Davis
472b0d29bc4SBrooks Davis tree.define< config::int_node >("a.b.var1");
473b0d29bc4SBrooks Davis tree.define< config::string_node >("a.b.var2");
474b0d29bc4SBrooks Davis tree.define< config::bool_node >("e.var3");
475b0d29bc4SBrooks Davis
476b0d29bc4SBrooks Davis tree.set< config::int_node >("a.b.var1", 42);
477b0d29bc4SBrooks Davis tree.set< config::bool_node >("e.var3", false);
478b0d29bc4SBrooks Davis
479b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a"));
480b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a.b"));
481b0d29bc4SBrooks Davis ATF_REQUIRE( tree.is_set("a.b.var1"));
482b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a.b.var1.trailing"));
483b0d29bc4SBrooks Davis
484b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a"));
485b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a.b"));
486b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a.b.var2"));
487b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a.b.var2.trailing"));
488b0d29bc4SBrooks Davis
489b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("e"));
490b0d29bc4SBrooks Davis ATF_REQUIRE( tree.is_set("e.var3"));
491b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("e.var3.trailing"));
492b0d29bc4SBrooks Davis }
493b0d29bc4SBrooks Davis
494b0d29bc4SBrooks Davis
495b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(is_set__invalid_key);
ATF_TEST_CASE_BODY(is_set__invalid_key)496b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(is_set__invalid_key)
497b0d29bc4SBrooks Davis {
498b0d29bc4SBrooks Davis config::tree tree;
499b0d29bc4SBrooks Davis
500b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_error, tree.is_set(".abc"));
501b0d29bc4SBrooks Davis }
502b0d29bc4SBrooks Davis
503b0d29bc4SBrooks Davis
504b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set__invalid_key);
ATF_TEST_CASE_BODY(set__invalid_key)505b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set__invalid_key)
506b0d29bc4SBrooks Davis {
507b0d29bc4SBrooks Davis config::tree tree;
508b0d29bc4SBrooks Davis
509b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_error,
510b0d29bc4SBrooks Davis tree.set< config::int_node >("foo.", 54));
511b0d29bc4SBrooks Davis }
512b0d29bc4SBrooks Davis
513b0d29bc4SBrooks Davis
514b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set__invalid_key_value);
ATF_TEST_CASE_BODY(set__invalid_key_value)515b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set__invalid_key_value)
516b0d29bc4SBrooks Davis {
517b0d29bc4SBrooks Davis config::tree tree;
518b0d29bc4SBrooks Davis
519b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar");
520b0d29bc4SBrooks Davis tree.define_dynamic("a.d");
521b0d29bc4SBrooks Davis
522b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_value,
523b0d29bc4SBrooks Davis tree.set< config::int_node >("foo", 3));
524b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_value,
525b0d29bc4SBrooks Davis tree.set< config::int_node >("a", -10));
526b0d29bc4SBrooks Davis }
527b0d29bc4SBrooks Davis
528b0d29bc4SBrooks Davis
529b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set__unknown_key);
ATF_TEST_CASE_BODY(set__unknown_key)530b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set__unknown_key)
531b0d29bc4SBrooks Davis {
532b0d29bc4SBrooks Davis config::tree tree;
533b0d29bc4SBrooks Davis
534b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar");
535b0d29bc4SBrooks Davis tree.define< config::int_node >("a.b.c");
536b0d29bc4SBrooks Davis tree.define_dynamic("a.d");
537b0d29bc4SBrooks Davis tree.set< config::int_node >("a.b.c", 123);
538b0d29bc4SBrooks Davis tree.set< config::string_node >("a.d.3", "foo");
539b0d29bc4SBrooks Davis
540b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
541b0d29bc4SBrooks Davis tree.set< config::int_node >("abc", 2));
542b0d29bc4SBrooks Davis
543b0d29bc4SBrooks Davis tree.set< config::int_node >("foo.bar", 15);
544b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
545b0d29bc4SBrooks Davis tree.set< config::int_node >("foo.bar.baz", 0));
546b0d29bc4SBrooks Davis
547b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
548b0d29bc4SBrooks Davis tree.set< config::int_node >("a.c", 100));
549b0d29bc4SBrooks Davis tree.set< config::int_node >("a.b.c", -3);
550b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
551b0d29bc4SBrooks Davis tree.set< config::int_node >("a.b.c.d", 82));
552b0d29bc4SBrooks Davis tree.set< config::string_node >("a.d.3", "bar");
553b0d29bc4SBrooks Davis tree.set< config::string_node >("a.d.4", "bar");
554b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
555b0d29bc4SBrooks Davis tree.set< config::int_node >("a.d.4.5", 82));
556b0d29bc4SBrooks Davis tree.set< config::int_node >("a.d.5.6", 82);
557b0d29bc4SBrooks Davis }
558b0d29bc4SBrooks Davis
559b0d29bc4SBrooks Davis
560b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set__unknown_key_not_strict);
ATF_TEST_CASE_BODY(set__unknown_key_not_strict)561b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set__unknown_key_not_strict)
562b0d29bc4SBrooks Davis {
563b0d29bc4SBrooks Davis config::tree tree(false);
564b0d29bc4SBrooks Davis
565b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar");
566b0d29bc4SBrooks Davis tree.define< config::int_node >("a.b.c");
567b0d29bc4SBrooks Davis tree.define_dynamic("a.d");
568b0d29bc4SBrooks Davis tree.set< config::int_node >("a.b.c", 123);
569b0d29bc4SBrooks Davis tree.set< config::string_node >("a.d.3", "foo");
570b0d29bc4SBrooks Davis
571b0d29bc4SBrooks Davis tree.set< config::int_node >("abc", 2);
572b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("abc"));
573b0d29bc4SBrooks Davis
574b0d29bc4SBrooks Davis tree.set< config::int_node >("foo.bar", 15);
575b0d29bc4SBrooks Davis tree.set< config::int_node >("foo.bar.baz", 0);
576b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("foo.bar.baz"));
577b0d29bc4SBrooks Davis
578b0d29bc4SBrooks Davis tree.set< config::int_node >("a.c", 100);
579b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a.c"));
580b0d29bc4SBrooks Davis }
581b0d29bc4SBrooks Davis
582b0d29bc4SBrooks Davis
583b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(push_lua__ok);
ATF_TEST_CASE_BODY(push_lua__ok)584b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(push_lua__ok)
585b0d29bc4SBrooks Davis {
586b0d29bc4SBrooks Davis config::tree tree;
587b0d29bc4SBrooks Davis
588b0d29bc4SBrooks Davis tree.define< config::int_node >("top.integer");
589b0d29bc4SBrooks Davis tree.define< wrapped_int_node >("top.custom");
590b0d29bc4SBrooks Davis tree.define_dynamic("dynamic");
591b0d29bc4SBrooks Davis tree.set< config::int_node >("top.integer", 5);
592b0d29bc4SBrooks Davis tree.set< wrapped_int_node >("top.custom", int_wrapper(10));
593b0d29bc4SBrooks Davis tree.set_string("dynamic.first", "foo");
594b0d29bc4SBrooks Davis
595b0d29bc4SBrooks Davis lutok::state state;
596b0d29bc4SBrooks Davis tree.push_lua("top.integer", state);
597b0d29bc4SBrooks Davis tree.push_lua("top.custom", state);
598b0d29bc4SBrooks Davis tree.push_lua("dynamic.first", state);
599b0d29bc4SBrooks Davis ATF_REQUIRE(state.is_number(-3));
600b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(5, state.to_integer(-3));
601b0d29bc4SBrooks Davis ATF_REQUIRE(state.is_number(-2));
602b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(10, state.to_integer(-2));
603b0d29bc4SBrooks Davis ATF_REQUIRE(state.is_string(-1));
604b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", state.to_string(-1));
605b0d29bc4SBrooks Davis state.pop(3);
606b0d29bc4SBrooks Davis }
607b0d29bc4SBrooks Davis
608b0d29bc4SBrooks Davis
609b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_lua__ok);
ATF_TEST_CASE_BODY(set_lua__ok)610b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set_lua__ok)
611b0d29bc4SBrooks Davis {
612b0d29bc4SBrooks Davis config::tree tree;
613b0d29bc4SBrooks Davis
614b0d29bc4SBrooks Davis tree.define< config::int_node >("top.integer");
615b0d29bc4SBrooks Davis tree.define< wrapped_int_node >("top.custom");
616b0d29bc4SBrooks Davis tree.define_dynamic("dynamic");
617b0d29bc4SBrooks Davis
618b0d29bc4SBrooks Davis {
619b0d29bc4SBrooks Davis lutok::state state;
620b0d29bc4SBrooks Davis state.push_integer(5);
621b0d29bc4SBrooks Davis state.push_integer(10);
622b0d29bc4SBrooks Davis state.push_string("foo");
623b0d29bc4SBrooks Davis tree.set_lua("top.integer", state, -3);
624b0d29bc4SBrooks Davis tree.set_lua("top.custom", state, -2);
625b0d29bc4SBrooks Davis tree.set_lua("dynamic.first", state, -1);
626b0d29bc4SBrooks Davis state.pop(3);
627b0d29bc4SBrooks Davis }
628b0d29bc4SBrooks Davis
629b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(5, tree.lookup< config::int_node >("top.integer"));
630b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(10, tree.lookup< wrapped_int_node >("top.custom").value());
631b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("foo", tree.lookup< config::string_node >("dynamic.first"));
632b0d29bc4SBrooks Davis }
633b0d29bc4SBrooks Davis
634b0d29bc4SBrooks Davis
635b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(lookup_rw);
ATF_TEST_CASE_BODY(lookup_rw)636b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(lookup_rw)
637b0d29bc4SBrooks Davis {
638b0d29bc4SBrooks Davis config::tree tree;
639b0d29bc4SBrooks Davis
640b0d29bc4SBrooks Davis tree.define< config::int_node >("var1");
641b0d29bc4SBrooks Davis tree.define< config::bool_node >("var3");
642b0d29bc4SBrooks Davis
643b0d29bc4SBrooks Davis tree.set< config::int_node >("var1", 42);
644b0d29bc4SBrooks Davis tree.set< config::bool_node >("var3", false);
645b0d29bc4SBrooks Davis
646b0d29bc4SBrooks Davis tree.lookup_rw< config::int_node >("var1") += 10;
647b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(52, tree.lookup< config::int_node >("var1"));
648b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.lookup< config::bool_node >("var3"));
649b0d29bc4SBrooks Davis }
650b0d29bc4SBrooks Davis
651b0d29bc4SBrooks Davis
652b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(lookup_string__ok);
ATF_TEST_CASE_BODY(lookup_string__ok)653b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(lookup_string__ok)
654b0d29bc4SBrooks Davis {
655b0d29bc4SBrooks Davis config::tree tree;
656b0d29bc4SBrooks Davis
657b0d29bc4SBrooks Davis tree.define< config::int_node >("var1");
658b0d29bc4SBrooks Davis tree.define< config::string_node >("b.var2");
659b0d29bc4SBrooks Davis tree.define< config::bool_node >("c.d.var3");
660b0d29bc4SBrooks Davis
661b0d29bc4SBrooks Davis tree.set< config::int_node >("var1", 42);
662b0d29bc4SBrooks Davis tree.set< config::string_node >("b.var2", "hello");
663b0d29bc4SBrooks Davis tree.set< config::bool_node >("c.d.var3", false);
664b0d29bc4SBrooks Davis
665b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("42", tree.lookup_string("var1"));
666b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("hello", tree.lookup_string("b.var2"));
667b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("false", tree.lookup_string("c.d.var3"));
668b0d29bc4SBrooks Davis }
669b0d29bc4SBrooks Davis
670b0d29bc4SBrooks Davis
671b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(lookup_string__invalid_key);
ATF_TEST_CASE_BODY(lookup_string__invalid_key)672b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(lookup_string__invalid_key)
673b0d29bc4SBrooks Davis {
674b0d29bc4SBrooks Davis config::tree tree;
675b0d29bc4SBrooks Davis
676b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_error, tree.lookup_string(""));
677b0d29bc4SBrooks Davis }
678b0d29bc4SBrooks Davis
679b0d29bc4SBrooks Davis
680b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(lookup_string__unknown_key);
ATF_TEST_CASE_BODY(lookup_string__unknown_key)681b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(lookup_string__unknown_key)
682b0d29bc4SBrooks Davis {
683b0d29bc4SBrooks Davis config::tree tree;
684b0d29bc4SBrooks Davis
685b0d29bc4SBrooks Davis tree.define< config::int_node >("a.b.c");
686b0d29bc4SBrooks Davis
687b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error, tree.lookup_string("a.b"));
688b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error, tree.lookup_string("a.b.c.d"));
689b0d29bc4SBrooks Davis }
690b0d29bc4SBrooks Davis
691b0d29bc4SBrooks Davis
692b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_string__ok);
ATF_TEST_CASE_BODY(set_string__ok)693b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set_string__ok)
694b0d29bc4SBrooks Davis {
695b0d29bc4SBrooks Davis config::tree tree;
696b0d29bc4SBrooks Davis
697b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar.1");
698b0d29bc4SBrooks Davis tree.define< config::string_node >("foo.bar.2");
699b0d29bc4SBrooks Davis tree.define_dynamic("sub.tree");
700b0d29bc4SBrooks Davis
701b0d29bc4SBrooks Davis tree.set_string("foo.bar.1", "42");
702b0d29bc4SBrooks Davis tree.set_string("foo.bar.2", "hello");
703b0d29bc4SBrooks Davis tree.set_string("sub.tree.2", "15");
704b0d29bc4SBrooks Davis tree.set_string("sub.tree.3.4", "bye");
705b0d29bc4SBrooks Davis
706b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(42, tree.lookup< config::int_node >("foo.bar.1"));
707b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("hello", tree.lookup< config::string_node >("foo.bar.2"));
708b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("15", tree.lookup< config::string_node >("sub.tree.2"));
709b0d29bc4SBrooks Davis ATF_REQUIRE_EQ("bye", tree.lookup< config::string_node >("sub.tree.3.4"));
710b0d29bc4SBrooks Davis }
711b0d29bc4SBrooks Davis
712b0d29bc4SBrooks Davis
713b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_string__invalid_key);
ATF_TEST_CASE_BODY(set_string__invalid_key)714b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set_string__invalid_key)
715b0d29bc4SBrooks Davis {
716b0d29bc4SBrooks Davis config::tree tree;
717b0d29bc4SBrooks Davis
718b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_error, tree.set_string(".", "foo"));
719b0d29bc4SBrooks Davis }
720b0d29bc4SBrooks Davis
721b0d29bc4SBrooks Davis
722b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_string__invalid_key_value);
ATF_TEST_CASE_BODY(set_string__invalid_key_value)723b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set_string__invalid_key_value)
724b0d29bc4SBrooks Davis {
725b0d29bc4SBrooks Davis config::tree tree;
726b0d29bc4SBrooks Davis
727b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar");
728b0d29bc4SBrooks Davis
729b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_value,
730b0d29bc4SBrooks Davis tree.set_string("foo", "abc"));
731b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_value,
732b0d29bc4SBrooks Davis tree.set_string("foo.bar", " -3"));
733b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_value,
734b0d29bc4SBrooks Davis tree.set_string("foo.bar", "3 "));
735b0d29bc4SBrooks Davis }
736b0d29bc4SBrooks Davis
737b0d29bc4SBrooks Davis
738b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_string__unknown_key);
ATF_TEST_CASE_BODY(set_string__unknown_key)739b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set_string__unknown_key)
740b0d29bc4SBrooks Davis {
741b0d29bc4SBrooks Davis config::tree tree;
742b0d29bc4SBrooks Davis
743b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar");
744b0d29bc4SBrooks Davis tree.define< config::int_node >("a.b.c");
745b0d29bc4SBrooks Davis tree.define_dynamic("a.d");
746b0d29bc4SBrooks Davis tree.set_string("a.b.c", "123");
747b0d29bc4SBrooks Davis tree.set_string("a.d.3", "foo");
748b0d29bc4SBrooks Davis
749b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error, tree.set_string("abc", "2"));
750b0d29bc4SBrooks Davis
751b0d29bc4SBrooks Davis tree.set_string("foo.bar", "15");
752b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
753b0d29bc4SBrooks Davis tree.set_string("foo.bar.baz", "0"));
754b0d29bc4SBrooks Davis
755b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
756b0d29bc4SBrooks Davis tree.set_string("a.c", "100"));
757b0d29bc4SBrooks Davis tree.set_string("a.b.c", "-3");
758b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
759b0d29bc4SBrooks Davis tree.set_string("a.b.c.d", "82"));
760b0d29bc4SBrooks Davis tree.set_string("a.d.3", "bar");
761b0d29bc4SBrooks Davis tree.set_string("a.d.4", "bar");
762b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
763b0d29bc4SBrooks Davis tree.set_string("a.d.4.5", "82"));
764b0d29bc4SBrooks Davis tree.set_string("a.d.5.6", "82");
765b0d29bc4SBrooks Davis }
766b0d29bc4SBrooks Davis
767b0d29bc4SBrooks Davis
768b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(set_string__unknown_key_not_strict);
ATF_TEST_CASE_BODY(set_string__unknown_key_not_strict)769b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(set_string__unknown_key_not_strict)
770b0d29bc4SBrooks Davis {
771b0d29bc4SBrooks Davis config::tree tree(false);
772b0d29bc4SBrooks Davis
773b0d29bc4SBrooks Davis tree.define< config::int_node >("foo.bar");
774b0d29bc4SBrooks Davis tree.define< config::int_node >("a.b.c");
775b0d29bc4SBrooks Davis tree.define_dynamic("a.d");
776b0d29bc4SBrooks Davis tree.set_string("a.b.c", "123");
777b0d29bc4SBrooks Davis tree.set_string("a.d.3", "foo");
778b0d29bc4SBrooks Davis
779b0d29bc4SBrooks Davis tree.set_string("abc", "2");
780b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("abc"));
781b0d29bc4SBrooks Davis
782b0d29bc4SBrooks Davis tree.set_string("foo.bar", "15");
783b0d29bc4SBrooks Davis tree.set_string("foo.bar.baz", "0");
784b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("foo.bar.baz"));
785b0d29bc4SBrooks Davis
786b0d29bc4SBrooks Davis tree.set_string("a.c", "100");
787b0d29bc4SBrooks Davis ATF_REQUIRE(!tree.is_set("a.c"));
788b0d29bc4SBrooks Davis }
789b0d29bc4SBrooks Davis
790b0d29bc4SBrooks Davis
791b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(all_properties__none);
ATF_TEST_CASE_BODY(all_properties__none)792b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(all_properties__none)
793b0d29bc4SBrooks Davis {
794b0d29bc4SBrooks Davis const config::tree tree;
795b0d29bc4SBrooks Davis ATF_REQUIRE(tree.all_properties().empty());
796b0d29bc4SBrooks Davis }
797b0d29bc4SBrooks Davis
798b0d29bc4SBrooks Davis
799b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(all_properties__all_set);
ATF_TEST_CASE_BODY(all_properties__all_set)800b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(all_properties__all_set)
801b0d29bc4SBrooks Davis {
802b0d29bc4SBrooks Davis config::tree tree;
803b0d29bc4SBrooks Davis
804b0d29bc4SBrooks Davis tree.define< config::int_node >("plain");
805b0d29bc4SBrooks Davis tree.set< config::int_node >("plain", 1234);
806b0d29bc4SBrooks Davis
807b0d29bc4SBrooks Davis tree.define< config::int_node >("static.first");
808b0d29bc4SBrooks Davis tree.set< config::int_node >("static.first", -3);
809b0d29bc4SBrooks Davis tree.define< config::string_node >("static.second");
810b0d29bc4SBrooks Davis tree.set< config::string_node >("static.second", "some text");
811b0d29bc4SBrooks Davis
812b0d29bc4SBrooks Davis tree.define_dynamic("dynamic");
813b0d29bc4SBrooks Davis tree.set< config::string_node >("dynamic.first", "hello");
814b0d29bc4SBrooks Davis tree.set< config::string_node >("dynamic.second", "bye");
815b0d29bc4SBrooks Davis
816b0d29bc4SBrooks Davis config::properties_map exp_properties;
817b0d29bc4SBrooks Davis exp_properties["plain"] = "1234";
818b0d29bc4SBrooks Davis exp_properties["static.first"] = "-3";
819b0d29bc4SBrooks Davis exp_properties["static.second"] = "some text";
820b0d29bc4SBrooks Davis exp_properties["dynamic.first"] = "hello";
821b0d29bc4SBrooks Davis exp_properties["dynamic.second"] = "bye";
822b0d29bc4SBrooks Davis
823b0d29bc4SBrooks Davis const config::properties_map properties = tree.all_properties();
824b0d29bc4SBrooks Davis ATF_REQUIRE(exp_properties == properties);
825b0d29bc4SBrooks Davis }
826b0d29bc4SBrooks Davis
827b0d29bc4SBrooks Davis
828b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(all_properties__some_unset);
ATF_TEST_CASE_BODY(all_properties__some_unset)829b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(all_properties__some_unset)
830b0d29bc4SBrooks Davis {
831b0d29bc4SBrooks Davis config::tree tree;
832b0d29bc4SBrooks Davis
833b0d29bc4SBrooks Davis tree.define< config::int_node >("static.first");
834b0d29bc4SBrooks Davis tree.set< config::int_node >("static.first", -3);
835b0d29bc4SBrooks Davis tree.define< config::string_node >("static.second");
836b0d29bc4SBrooks Davis
837b0d29bc4SBrooks Davis tree.define_dynamic("dynamic");
838b0d29bc4SBrooks Davis
839b0d29bc4SBrooks Davis config::properties_map exp_properties;
840b0d29bc4SBrooks Davis exp_properties["static.first"] = "-3";
841b0d29bc4SBrooks Davis
842b0d29bc4SBrooks Davis const config::properties_map properties = tree.all_properties();
843b0d29bc4SBrooks Davis ATF_REQUIRE(exp_properties == properties);
844b0d29bc4SBrooks Davis }
845b0d29bc4SBrooks Davis
846b0d29bc4SBrooks Davis
847b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__inner);
ATF_TEST_CASE_BODY(all_properties__subtree__inner)848b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(all_properties__subtree__inner)
849b0d29bc4SBrooks Davis {
850b0d29bc4SBrooks Davis config::tree tree;
851b0d29bc4SBrooks Davis
852b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.b.c.first");
853b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.b.c.second");
854b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.d.first");
855b0d29bc4SBrooks Davis
856b0d29bc4SBrooks Davis tree.set< config::int_node >("root.a.b.c.first", 1);
857b0d29bc4SBrooks Davis tree.set< config::int_node >("root.a.b.c.second", 2);
858b0d29bc4SBrooks Davis tree.set< config::int_node >("root.a.d.first", 3);
859b0d29bc4SBrooks Davis
860b0d29bc4SBrooks Davis {
861b0d29bc4SBrooks Davis config::properties_map exp_properties;
862b0d29bc4SBrooks Davis exp_properties["root.a.b.c.first"] = "1";
863b0d29bc4SBrooks Davis exp_properties["root.a.b.c.second"] = "2";
864b0d29bc4SBrooks Davis exp_properties["root.a.d.first"] = "3";
865b0d29bc4SBrooks Davis ATF_REQUIRE(exp_properties == tree.all_properties("root"));
866b0d29bc4SBrooks Davis ATF_REQUIRE(exp_properties == tree.all_properties("root.a"));
867b0d29bc4SBrooks Davis }
868b0d29bc4SBrooks Davis
869b0d29bc4SBrooks Davis {
870b0d29bc4SBrooks Davis config::properties_map exp_properties;
871b0d29bc4SBrooks Davis exp_properties["root.a.b.c.first"] = "1";
872b0d29bc4SBrooks Davis exp_properties["root.a.b.c.second"] = "2";
873b0d29bc4SBrooks Davis ATF_REQUIRE(exp_properties == tree.all_properties("root.a.b"));
874b0d29bc4SBrooks Davis ATF_REQUIRE(exp_properties == tree.all_properties("root.a.b.c"));
875b0d29bc4SBrooks Davis }
876b0d29bc4SBrooks Davis
877b0d29bc4SBrooks Davis {
878b0d29bc4SBrooks Davis config::properties_map exp_properties;
879b0d29bc4SBrooks Davis exp_properties["root.a.d.first"] = "3";
880b0d29bc4SBrooks Davis ATF_REQUIRE(exp_properties == tree.all_properties("root.a.d"));
881b0d29bc4SBrooks Davis }
882b0d29bc4SBrooks Davis }
883b0d29bc4SBrooks Davis
884b0d29bc4SBrooks Davis
885b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__leaf);
ATF_TEST_CASE_BODY(all_properties__subtree__leaf)886b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(all_properties__subtree__leaf)
887b0d29bc4SBrooks Davis {
888b0d29bc4SBrooks Davis config::tree tree;
889b0d29bc4SBrooks Davis
890b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.b.c.first");
891b0d29bc4SBrooks Davis tree.set< config::int_node >("root.a.b.c.first", 1);
892b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(config::value_error, "Cannot export.*leaf",
893b0d29bc4SBrooks Davis tree.all_properties("root.a.b.c.first"));
894b0d29bc4SBrooks Davis }
895b0d29bc4SBrooks Davis
896b0d29bc4SBrooks Davis
897b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__strip_key);
ATF_TEST_CASE_BODY(all_properties__subtree__strip_key)898b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(all_properties__subtree__strip_key)
899b0d29bc4SBrooks Davis {
900b0d29bc4SBrooks Davis config::tree tree;
901b0d29bc4SBrooks Davis
902b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.b.c.first");
903b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.b.c.second");
904b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.d.first");
905b0d29bc4SBrooks Davis
906b0d29bc4SBrooks Davis tree.set< config::int_node >("root.a.b.c.first", 1);
907b0d29bc4SBrooks Davis tree.set< config::int_node >("root.a.b.c.second", 2);
908b0d29bc4SBrooks Davis tree.set< config::int_node >("root.a.d.first", 3);
909b0d29bc4SBrooks Davis
910b0d29bc4SBrooks Davis config::properties_map exp_properties;
911b0d29bc4SBrooks Davis exp_properties["b.c.first"] = "1";
912b0d29bc4SBrooks Davis exp_properties["b.c.second"] = "2";
913b0d29bc4SBrooks Davis exp_properties["d.first"] = "3";
914b0d29bc4SBrooks Davis ATF_REQUIRE(exp_properties == tree.all_properties("root.a", true));
915b0d29bc4SBrooks Davis }
916b0d29bc4SBrooks Davis
917b0d29bc4SBrooks Davis
918b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__invalid_key);
ATF_TEST_CASE_BODY(all_properties__subtree__invalid_key)919b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(all_properties__subtree__invalid_key)
920b0d29bc4SBrooks Davis {
921b0d29bc4SBrooks Davis config::tree tree;
922b0d29bc4SBrooks Davis
923b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::invalid_key_error, tree.all_properties("."));
924b0d29bc4SBrooks Davis }
925b0d29bc4SBrooks Davis
926b0d29bc4SBrooks Davis
927b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(all_properties__subtree__unknown_key);
ATF_TEST_CASE_BODY(all_properties__subtree__unknown_key)928b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(all_properties__subtree__unknown_key)
929b0d29bc4SBrooks Davis {
930b0d29bc4SBrooks Davis config::tree tree;
931b0d29bc4SBrooks Davis
932b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.b.c.first");
933b0d29bc4SBrooks Davis tree.set< config::int_node >("root.a.b.c.first", 1);
934b0d29bc4SBrooks Davis tree.define< config::int_node >("root.a.b.c.unset");
935b0d29bc4SBrooks Davis
936b0d29bc4SBrooks Davis ATF_REQUIRE_THROW(config::unknown_key_error,
937b0d29bc4SBrooks Davis tree.all_properties("root.a.b.c.first.foo"));
938b0d29bc4SBrooks Davis ATF_REQUIRE_THROW_RE(config::value_error, "Cannot export.*leaf",
939b0d29bc4SBrooks Davis tree.all_properties("root.a.b.c.unset"));
940b0d29bc4SBrooks Davis }
941b0d29bc4SBrooks Davis
942b0d29bc4SBrooks Davis
943b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__empty);
ATF_TEST_CASE_BODY(operators_eq_and_ne__empty)944b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__empty)
945b0d29bc4SBrooks Davis {
946b0d29bc4SBrooks Davis config::tree t1;
947b0d29bc4SBrooks Davis config::tree t2;
948b0d29bc4SBrooks Davis ATF_REQUIRE( t1 == t2);
949b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 != t2));
950b0d29bc4SBrooks Davis }
951b0d29bc4SBrooks Davis
952b0d29bc4SBrooks Davis
953b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__shallow_copy);
ATF_TEST_CASE_BODY(operators_eq_and_ne__shallow_copy)954b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__shallow_copy)
955b0d29bc4SBrooks Davis {
956b0d29bc4SBrooks Davis config::tree t1;
957b0d29bc4SBrooks Davis t1.define< config::int_node >("root.a.b.c.first");
958b0d29bc4SBrooks Davis t1.set< config::int_node >("root.a.b.c.first", 1);
959b0d29bc4SBrooks Davis config::tree t2 = t1;
960b0d29bc4SBrooks Davis ATF_REQUIRE( t1 == t2);
961b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 != t2));
962b0d29bc4SBrooks Davis }
963b0d29bc4SBrooks Davis
964b0d29bc4SBrooks Davis
965b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__deep_copy);
ATF_TEST_CASE_BODY(operators_eq_and_ne__deep_copy)966b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__deep_copy)
967b0d29bc4SBrooks Davis {
968b0d29bc4SBrooks Davis config::tree t1;
969b0d29bc4SBrooks Davis t1.define< config::int_node >("root.a.b.c.first");
970b0d29bc4SBrooks Davis t1.set< config::int_node >("root.a.b.c.first", 1);
971b0d29bc4SBrooks Davis config::tree t2 = t1.deep_copy();
972b0d29bc4SBrooks Davis ATF_REQUIRE( t1 == t2);
973b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 != t2));
974b0d29bc4SBrooks Davis }
975b0d29bc4SBrooks Davis
976b0d29bc4SBrooks Davis
977b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(operators_eq_and_ne__some_contents);
ATF_TEST_CASE_BODY(operators_eq_and_ne__some_contents)978b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(operators_eq_and_ne__some_contents)
979b0d29bc4SBrooks Davis {
980b0d29bc4SBrooks Davis config::tree t1, t2;
981b0d29bc4SBrooks Davis
982b0d29bc4SBrooks Davis t1.define< config::int_node >("root.a.b.c.first");
983b0d29bc4SBrooks Davis t1.set< config::int_node >("root.a.b.c.first", 1);
984b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 == t2));
985b0d29bc4SBrooks Davis ATF_REQUIRE( t1 != t2);
986b0d29bc4SBrooks Davis
987b0d29bc4SBrooks Davis t2.define< config::int_node >("root.a.b.c.first");
988b0d29bc4SBrooks Davis t2.set< config::int_node >("root.a.b.c.first", 1);
989b0d29bc4SBrooks Davis ATF_REQUIRE( t1 == t2);
990b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 != t2));
991b0d29bc4SBrooks Davis
992b0d29bc4SBrooks Davis t1.set< config::int_node >("root.a.b.c.first", 2);
993b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 == t2));
994b0d29bc4SBrooks Davis ATF_REQUIRE( t1 != t2);
995b0d29bc4SBrooks Davis
996b0d29bc4SBrooks Davis t2.set< config::int_node >("root.a.b.c.first", 2);
997b0d29bc4SBrooks Davis ATF_REQUIRE( t1 == t2);
998b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 != t2));
999b0d29bc4SBrooks Davis
1000b0d29bc4SBrooks Davis t1.define< config::string_node >("another.key");
1001b0d29bc4SBrooks Davis t1.set< config::string_node >("another.key", "some text");
1002b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 == t2));
1003b0d29bc4SBrooks Davis ATF_REQUIRE( t1 != t2);
1004b0d29bc4SBrooks Davis
1005b0d29bc4SBrooks Davis t2.define< config::string_node >("another.key");
1006b0d29bc4SBrooks Davis t2.set< config::string_node >("another.key", "some text");
1007b0d29bc4SBrooks Davis ATF_REQUIRE( t1 == t2);
1008b0d29bc4SBrooks Davis ATF_REQUIRE(!(t1 != t2));
1009b0d29bc4SBrooks Davis }
1010b0d29bc4SBrooks Davis
1011b0d29bc4SBrooks Davis
1012b0d29bc4SBrooks Davis ATF_TEST_CASE_WITHOUT_HEAD(custom_leaf__no_default_ctor);
ATF_TEST_CASE_BODY(custom_leaf__no_default_ctor)1013b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(custom_leaf__no_default_ctor)
1014b0d29bc4SBrooks Davis {
1015b0d29bc4SBrooks Davis config::tree tree;
1016b0d29bc4SBrooks Davis
1017b0d29bc4SBrooks Davis tree.define< wrapped_int_node >("test1");
1018b0d29bc4SBrooks Davis tree.define< wrapped_int_node >("test2");
1019b0d29bc4SBrooks Davis tree.set< wrapped_int_node >("test1", int_wrapper(5));
1020b0d29bc4SBrooks Davis tree.set< wrapped_int_node >("test2", int_wrapper(10));
1021b0d29bc4SBrooks Davis const int_wrapper& test1 = tree.lookup< wrapped_int_node >("test1");
1022b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(5, test1.value());
1023b0d29bc4SBrooks Davis const int_wrapper& test2 = tree.lookup< wrapped_int_node >("test2");
1024b0d29bc4SBrooks Davis ATF_REQUIRE_EQ(10, test2.value());
1025b0d29bc4SBrooks Davis }
1026b0d29bc4SBrooks Davis
1027b0d29bc4SBrooks Davis
ATF_INIT_TEST_CASES(tcs)1028b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
1029b0d29bc4SBrooks Davis {
1030b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, define_set_lookup__one_level);
1031b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, define_set_lookup__multiple_levels);
1032b0d29bc4SBrooks Davis
1033b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, deep_copy__empty);
1034b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, deep_copy__some);
1035b0d29bc4SBrooks Davis
1036b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, combine__empty);
1037b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, combine__same_layout__no_overrides);
1038b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, combine__same_layout__no_base);
1039b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, combine__same_layout__mix);
1040b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, combine__different_layout);
1041b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, combine__dynamic_wins);
1042b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, combine__inner_leaf_mismatch);
1043b0d29bc4SBrooks Davis
1044b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, lookup__invalid_key);
1045b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, lookup__unknown_key);
1046b0d29bc4SBrooks Davis
1047b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, is_set__one_level);
1048b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, is_set__multiple_levels);
1049b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, is_set__invalid_key);
1050b0d29bc4SBrooks Davis
1051b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set__invalid_key);
1052b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set__invalid_key_value);
1053b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set__unknown_key);
1054b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set__unknown_key_not_strict);
1055b0d29bc4SBrooks Davis
1056b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, push_lua__ok);
1057b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set_lua__ok);
1058b0d29bc4SBrooks Davis
1059b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, lookup_rw);
1060b0d29bc4SBrooks Davis
1061b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, lookup_string__ok);
1062b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, lookup_string__invalid_key);
1063b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, lookup_string__unknown_key);
1064b0d29bc4SBrooks Davis
1065b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set_string__ok);
1066b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set_string__invalid_key);
1067b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set_string__invalid_key_value);
1068b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set_string__unknown_key);
1069b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, set_string__unknown_key_not_strict);
1070b0d29bc4SBrooks Davis
1071b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, all_properties__none);
1072b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, all_properties__all_set);
1073b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, all_properties__some_unset);
1074b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, all_properties__subtree__inner);
1075b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, all_properties__subtree__leaf);
1076b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, all_properties__subtree__strip_key);
1077b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, all_properties__subtree__invalid_key);
1078b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, all_properties__subtree__unknown_key);
1079b0d29bc4SBrooks Davis
1080b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__empty);
1081b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__shallow_copy);
1082b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__deep_copy);
1083b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, operators_eq_and_ne__some_contents);
1084b0d29bc4SBrooks Davis
1085b0d29bc4SBrooks Davis ATF_ADD_TEST_CASE(tcs, custom_leaf__no_default_ctor);
1086b0d29bc4SBrooks Davis }
1087