16b3a42afSjmmv // Copyright 2012 Google Inc.
26b3a42afSjmmv // All rights reserved.
36b3a42afSjmmv //
46b3a42afSjmmv // Redistribution and use in source and binary forms, with or without
56b3a42afSjmmv // modification, are permitted provided that the following conditions are
66b3a42afSjmmv // met:
76b3a42afSjmmv //
86b3a42afSjmmv // * Redistributions of source code must retain the above copyright
96b3a42afSjmmv // notice, this list of conditions and the following disclaimer.
106b3a42afSjmmv // * Redistributions in binary form must reproduce the above copyright
116b3a42afSjmmv // notice, this list of conditions and the following disclaimer in the
126b3a42afSjmmv // documentation and/or other materials provided with the distribution.
136b3a42afSjmmv // * Neither the name of Google Inc. nor the names of its contributors
146b3a42afSjmmv // may be used to endorse or promote products derived from this software
156b3a42afSjmmv // without specific prior written permission.
166b3a42afSjmmv //
176b3a42afSjmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
186b3a42afSjmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
196b3a42afSjmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
206b3a42afSjmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
216b3a42afSjmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
226b3a42afSjmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
236b3a42afSjmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
246b3a42afSjmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
256b3a42afSjmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
266b3a42afSjmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
276b3a42afSjmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
286b3a42afSjmmv
296b3a42afSjmmv #include "utils/config/lua_module.hpp"
306b3a42afSjmmv
316b3a42afSjmmv #include <atf-c++.hpp>
326b3a42afSjmmv
336b3a42afSjmmv #include <lutok/exceptions.hpp>
346b3a42afSjmmv #include <lutok/operations.hpp>
356b3a42afSjmmv #include <lutok/state.ipp>
366b3a42afSjmmv
376b3a42afSjmmv #include "utils/config/tree.ipp"
386b3a42afSjmmv #include "utils/defs.hpp"
396b3a42afSjmmv
406b3a42afSjmmv namespace config = utils::config;
416b3a42afSjmmv
426b3a42afSjmmv
436b3a42afSjmmv namespace {
446b3a42afSjmmv
456b3a42afSjmmv
466b3a42afSjmmv /// Non-native type to use as a leaf node.
476b3a42afSjmmv struct custom_type {
486b3a42afSjmmv /// The value recorded in the object.
496b3a42afSjmmv int value;
506b3a42afSjmmv
516b3a42afSjmmv /// Constructs a new object.
526b3a42afSjmmv ///
536b3a42afSjmmv /// \param value_ The value to store in the object.
custom_type__anon7348df3f0111::custom_type546b3a42afSjmmv explicit custom_type(const int value_) :
556b3a42afSjmmv value(value_)
566b3a42afSjmmv {
576b3a42afSjmmv }
586b3a42afSjmmv };
596b3a42afSjmmv
606b3a42afSjmmv
616b3a42afSjmmv /// Custom implementation of a node type for testing purposes.
626b3a42afSjmmv class custom_node : public config::typed_leaf_node< custom_type > {
636b3a42afSjmmv public:
646b3a42afSjmmv /// Copies the node.
656b3a42afSjmmv ///
666b3a42afSjmmv /// \return A dynamically-allocated node.
676b3a42afSjmmv virtual base_node*
deep_copy(void) const686b3a42afSjmmv deep_copy(void) const
696b3a42afSjmmv {
70*46b85cbbSlukem std::unique_ptr< custom_node > new_node(new custom_node());
716b3a42afSjmmv new_node->_value = _value;
726b3a42afSjmmv return new_node.release();
736b3a42afSjmmv }
746b3a42afSjmmv
756b3a42afSjmmv /// Pushes the node's value onto the Lua stack.
766b3a42afSjmmv ///
776b3a42afSjmmv /// \param state The Lua state onto which to push the value.
786b3a42afSjmmv void
push_lua(lutok::state & state) const796b3a42afSjmmv push_lua(lutok::state& state) const
806b3a42afSjmmv {
816b3a42afSjmmv state.push_integer(value().value * 5);
826b3a42afSjmmv }
836b3a42afSjmmv
846b3a42afSjmmv /// Sets the value of the node from an entry in the Lua stack.
856b3a42afSjmmv ///
866b3a42afSjmmv /// \param state The Lua state from which to get the value.
876b3a42afSjmmv /// \param value_index The stack index in which the value resides.
886b3a42afSjmmv void
set_lua(lutok::state & state,const int value_index)896b3a42afSjmmv set_lua(lutok::state& state, const int value_index)
906b3a42afSjmmv {
916b3a42afSjmmv ATF_REQUIRE(state.is_number(value_index));
926b3a42afSjmmv set(custom_type(state.to_integer(value_index) * 2));
936b3a42afSjmmv }
946b3a42afSjmmv
956b3a42afSjmmv /// Sets the value of the node from a raw string representation.
966b3a42afSjmmv ///
976b3a42afSjmmv /// \post The test case is marked as failed, as this function is not
986b3a42afSjmmv /// supposed to be invoked by the lua_module code.
996b3a42afSjmmv ///
1006b3a42afSjmmv /// \param unused_raw_value The value to set the node to.
1016b3a42afSjmmv void
set_string(const std::string & UTILS_UNUSED_PARAM (raw_value))1026b3a42afSjmmv set_string(const std::string& UTILS_UNUSED_PARAM(raw_value))
1036b3a42afSjmmv {
1046b3a42afSjmmv ATF_FAIL("Should not be used");
1056b3a42afSjmmv }
1066b3a42afSjmmv
1076b3a42afSjmmv /// Converts the contents of the node to a string.
1086b3a42afSjmmv ///
1096b3a42afSjmmv /// \post The test case is marked as failed, as this function is not
1106b3a42afSjmmv /// supposed to be invoked by the lua_module code.
1116b3a42afSjmmv ///
1126b3a42afSjmmv /// \return Nothing.
1136b3a42afSjmmv std::string
to_string(void) const1146b3a42afSjmmv to_string(void) const
1156b3a42afSjmmv {
1166b3a42afSjmmv ATF_FAIL("Should not be used");
1176b3a42afSjmmv }
1186b3a42afSjmmv };
1196b3a42afSjmmv
1206b3a42afSjmmv
1216b3a42afSjmmv } // anonymous namespace
1226b3a42afSjmmv
1236b3a42afSjmmv
1246b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(top__valid_types);
ATF_TEST_CASE_BODY(top__valid_types)1256b3a42afSjmmv ATF_TEST_CASE_BODY(top__valid_types)
1266b3a42afSjmmv {
1276b3a42afSjmmv config::tree tree;
1286b3a42afSjmmv tree.define< config::bool_node >("top_boolean");
1296b3a42afSjmmv tree.define< config::int_node >("top_integer");
1306b3a42afSjmmv tree.define< config::string_node >("top_string");
1316b3a42afSjmmv
1326b3a42afSjmmv {
1336b3a42afSjmmv lutok::state state;
1346b3a42afSjmmv config::redirect(state, tree);
1356b3a42afSjmmv lutok::do_string(state,
1366b3a42afSjmmv "top_boolean = true\n"
1376b3a42afSjmmv "top_integer = 12345\n"
1386b3a42afSjmmv "top_string = 'a foo'\n");
1396b3a42afSjmmv }
1406b3a42afSjmmv
1416b3a42afSjmmv ATF_REQUIRE_EQ(true, tree.lookup< config::bool_node >("top_boolean"));
1426b3a42afSjmmv ATF_REQUIRE_EQ(12345, tree.lookup< config::int_node >("top_integer"));
1436b3a42afSjmmv ATF_REQUIRE_EQ("a foo", tree.lookup< config::string_node >("top_string"));
1446b3a42afSjmmv }
1456b3a42afSjmmv
1466b3a42afSjmmv
1476b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(top__reuse);
ATF_TEST_CASE_BODY(top__reuse)1486b3a42afSjmmv ATF_TEST_CASE_BODY(top__reuse)
1496b3a42afSjmmv {
1506b3a42afSjmmv config::tree tree;
1516b3a42afSjmmv tree.define< config::int_node >("first");
1526b3a42afSjmmv tree.define< config::int_node >("second");
1536b3a42afSjmmv
1546b3a42afSjmmv {
1556b3a42afSjmmv lutok::state state;
1566b3a42afSjmmv config::redirect(state, tree);
1576b3a42afSjmmv lutok::do_string(state, "first = 100; second = first * 2");
1586b3a42afSjmmv }
1596b3a42afSjmmv
1606b3a42afSjmmv ATF_REQUIRE_EQ(100, tree.lookup< config::int_node >("first"));
1616b3a42afSjmmv ATF_REQUIRE_EQ(200, tree.lookup< config::int_node >("second"));
1626b3a42afSjmmv }
1636b3a42afSjmmv
1646b3a42afSjmmv
1656b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(top__reset);
ATF_TEST_CASE_BODY(top__reset)1666b3a42afSjmmv ATF_TEST_CASE_BODY(top__reset)
1676b3a42afSjmmv {
1686b3a42afSjmmv config::tree tree;
1696b3a42afSjmmv tree.define< config::int_node >("first");
1706b3a42afSjmmv
1716b3a42afSjmmv {
1726b3a42afSjmmv lutok::state state;
1736b3a42afSjmmv config::redirect(state, tree);
1746b3a42afSjmmv lutok::do_string(state, "first = 100; first = 200");
1756b3a42afSjmmv }
1766b3a42afSjmmv
1776b3a42afSjmmv ATF_REQUIRE_EQ(200, tree.lookup< config::int_node >("first"));
1786b3a42afSjmmv }
1796b3a42afSjmmv
1806b3a42afSjmmv
1816b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(top__already_set_on_entry);
ATF_TEST_CASE_BODY(top__already_set_on_entry)1826b3a42afSjmmv ATF_TEST_CASE_BODY(top__already_set_on_entry)
1836b3a42afSjmmv {
1846b3a42afSjmmv config::tree tree;
1856b3a42afSjmmv tree.define< config::int_node >("first");
1866b3a42afSjmmv tree.set< config::int_node >("first", 100);
1876b3a42afSjmmv
1886b3a42afSjmmv {
1896b3a42afSjmmv lutok::state state;
1906b3a42afSjmmv config::redirect(state, tree);
1916b3a42afSjmmv lutok::do_string(state, "first = first * 15");
1926b3a42afSjmmv }
1936b3a42afSjmmv
1946b3a42afSjmmv ATF_REQUIRE_EQ(1500, tree.lookup< config::int_node >("first"));
1956b3a42afSjmmv }
1966b3a42afSjmmv
1976b3a42afSjmmv
1986b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(subtree__valid_types);
ATF_TEST_CASE_BODY(subtree__valid_types)1996b3a42afSjmmv ATF_TEST_CASE_BODY(subtree__valid_types)
2006b3a42afSjmmv {
2016b3a42afSjmmv config::tree tree;
2026b3a42afSjmmv tree.define< config::bool_node >("root.boolean");
2036b3a42afSjmmv tree.define< config::int_node >("root.a.integer");
2046b3a42afSjmmv tree.define< config::string_node >("root.string");
2056b3a42afSjmmv
2066b3a42afSjmmv {
2076b3a42afSjmmv lutok::state state;
2086b3a42afSjmmv config::redirect(state, tree);
2096b3a42afSjmmv lutok::do_string(state,
2106b3a42afSjmmv "root.boolean = true\n"
2116b3a42afSjmmv "root.a.integer = 12345\n"
2126b3a42afSjmmv "root.string = 'a foo'\n");
2136b3a42afSjmmv }
2146b3a42afSjmmv
2156b3a42afSjmmv ATF_REQUIRE_EQ(true, tree.lookup< config::bool_node >("root.boolean"));
2166b3a42afSjmmv ATF_REQUIRE_EQ(12345, tree.lookup< config::int_node >("root.a.integer"));
2176b3a42afSjmmv ATF_REQUIRE_EQ("a foo", tree.lookup< config::string_node >("root.string"));
2186b3a42afSjmmv }
2196b3a42afSjmmv
2206b3a42afSjmmv
2216b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(subtree__reuse);
ATF_TEST_CASE_BODY(subtree__reuse)2226b3a42afSjmmv ATF_TEST_CASE_BODY(subtree__reuse)
2236b3a42afSjmmv {
2246b3a42afSjmmv config::tree tree;
2256b3a42afSjmmv tree.define< config::int_node >("a.first");
2266b3a42afSjmmv tree.define< config::int_node >("a.second");
2276b3a42afSjmmv
2286b3a42afSjmmv {
2296b3a42afSjmmv lutok::state state;
2306b3a42afSjmmv config::redirect(state, tree);
2316b3a42afSjmmv lutok::do_string(state, "a.first = 100; a.second = a.first * 2");
2326b3a42afSjmmv }
2336b3a42afSjmmv
2346b3a42afSjmmv ATF_REQUIRE_EQ(100, tree.lookup< config::int_node >("a.first"));
2356b3a42afSjmmv ATF_REQUIRE_EQ(200, tree.lookup< config::int_node >("a.second"));
2366b3a42afSjmmv }
2376b3a42afSjmmv
2386b3a42afSjmmv
2396b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(subtree__reset);
ATF_TEST_CASE_BODY(subtree__reset)2406b3a42afSjmmv ATF_TEST_CASE_BODY(subtree__reset)
2416b3a42afSjmmv {
2426b3a42afSjmmv config::tree tree;
2436b3a42afSjmmv tree.define< config::int_node >("a.first");
2446b3a42afSjmmv
2456b3a42afSjmmv {
2466b3a42afSjmmv lutok::state state;
2476b3a42afSjmmv config::redirect(state, tree);
2486b3a42afSjmmv lutok::do_string(state, "a.first = 100; a.first = 200");
2496b3a42afSjmmv }
2506b3a42afSjmmv
2516b3a42afSjmmv ATF_REQUIRE_EQ(200, tree.lookup< config::int_node >("a.first"));
2526b3a42afSjmmv }
2536b3a42afSjmmv
2546b3a42afSjmmv
2556b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(subtree__already_set_on_entry);
ATF_TEST_CASE_BODY(subtree__already_set_on_entry)2566b3a42afSjmmv ATF_TEST_CASE_BODY(subtree__already_set_on_entry)
2576b3a42afSjmmv {
2586b3a42afSjmmv config::tree tree;
2596b3a42afSjmmv tree.define< config::int_node >("a.first");
2606b3a42afSjmmv tree.set< config::int_node >("a.first", 100);
2616b3a42afSjmmv
2626b3a42afSjmmv {
2636b3a42afSjmmv lutok::state state;
2646b3a42afSjmmv config::redirect(state, tree);
2656b3a42afSjmmv lutok::do_string(state, "a.first = a.first * 15");
2666b3a42afSjmmv }
2676b3a42afSjmmv
2686b3a42afSjmmv ATF_REQUIRE_EQ(1500, tree.lookup< config::int_node >("a.first"));
2696b3a42afSjmmv }
2706b3a42afSjmmv
2716b3a42afSjmmv
2726b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(subtree__override_inner);
ATF_TEST_CASE_BODY(subtree__override_inner)2736b3a42afSjmmv ATF_TEST_CASE_BODY(subtree__override_inner)
2746b3a42afSjmmv {
2756b3a42afSjmmv config::tree tree;
2766b3a42afSjmmv tree.define_dynamic("root");
2776b3a42afSjmmv
2786b3a42afSjmmv {
2796b3a42afSjmmv lutok::state state;
2806b3a42afSjmmv config::redirect(state, tree);
2816b3a42afSjmmv lutok::do_string(state, "root.test = 'a'");
2826b3a42afSjmmv ATF_REQUIRE_THROW_RE(lutok::error, "Invalid value for key 'root'",
2836b3a42afSjmmv lutok::do_string(state, "root = 'b'"));
2846b3a42afSjmmv // Ensure that the previous assignment to 'root' did not cause any
2856b3a42afSjmmv // inconsistencies in the environment that would prevent a new
2866b3a42afSjmmv // assignment from working.
2876b3a42afSjmmv lutok::do_string(state, "root.test2 = 'c'");
2886b3a42afSjmmv }
2896b3a42afSjmmv
2906b3a42afSjmmv ATF_REQUIRE_EQ("a", tree.lookup< config::string_node >("root.test"));
2916b3a42afSjmmv ATF_REQUIRE_EQ("c", tree.lookup< config::string_node >("root.test2"));
2926b3a42afSjmmv }
2936b3a42afSjmmv
2946b3a42afSjmmv
2956b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(dynamic_subtree__strings);
ATF_TEST_CASE_BODY(dynamic_subtree__strings)2966b3a42afSjmmv ATF_TEST_CASE_BODY(dynamic_subtree__strings)
2976b3a42afSjmmv {
2986b3a42afSjmmv config::tree tree;
2996b3a42afSjmmv tree.define_dynamic("root");
3006b3a42afSjmmv
3016b3a42afSjmmv lutok::state state;
3026b3a42afSjmmv config::redirect(state, tree);
3036b3a42afSjmmv lutok::do_string(state,
3046b3a42afSjmmv "root.key1 = 1234\n"
3056b3a42afSjmmv "root.a.b.key2 = 'foo bar'\n");
3066b3a42afSjmmv
3076b3a42afSjmmv ATF_REQUIRE_EQ("1234", tree.lookup< config::string_node >("root.key1"));
3086b3a42afSjmmv ATF_REQUIRE_EQ("foo bar",
3096b3a42afSjmmv tree.lookup< config::string_node >("root.a.b.key2"));
3106b3a42afSjmmv }
3116b3a42afSjmmv
3126b3a42afSjmmv
3136b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(dynamic_subtree__invalid_types);
ATF_TEST_CASE_BODY(dynamic_subtree__invalid_types)3146b3a42afSjmmv ATF_TEST_CASE_BODY(dynamic_subtree__invalid_types)
3156b3a42afSjmmv {
3166b3a42afSjmmv config::tree tree;
3176b3a42afSjmmv tree.define_dynamic("root");
3186b3a42afSjmmv
3196b3a42afSjmmv lutok::state state;
3206b3a42afSjmmv config::redirect(state, tree);
3216b3a42afSjmmv ATF_REQUIRE_THROW_RE(lutok::error,
3226b3a42afSjmmv "Invalid value for key 'root.boolean' "
3236b3a42afSjmmv "\\(Not a string\\)",
3246b3a42afSjmmv lutok::do_string(state, "root.boolean = true"));
3256b3a42afSjmmv ATF_REQUIRE_THROW_RE(lutok::error,
3266b3a42afSjmmv "Invalid value for key 'root.table' "
3276b3a42afSjmmv "\\(Not a string\\)",
3286b3a42afSjmmv lutok::do_string(state, "root.table = {}"));
3296b3a42afSjmmv ATF_REQUIRE(!tree.is_set("root.boolean"));
3306b3a42afSjmmv ATF_REQUIRE(!tree.is_set("root.table"));
3316b3a42afSjmmv }
3326b3a42afSjmmv
3336b3a42afSjmmv
3346b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(locals);
ATF_TEST_CASE_BODY(locals)3356b3a42afSjmmv ATF_TEST_CASE_BODY(locals)
3366b3a42afSjmmv {
3376b3a42afSjmmv config::tree tree;
3386b3a42afSjmmv tree.define< config::int_node >("the_key");
3396b3a42afSjmmv
3406b3a42afSjmmv {
3416b3a42afSjmmv lutok::state state;
3426b3a42afSjmmv config::redirect(state, tree);
3436b3a42afSjmmv lutok::do_string(state,
3446b3a42afSjmmv "local function generate()\n"
3456b3a42afSjmmv " return 15\n"
3466b3a42afSjmmv "end\n"
3476b3a42afSjmmv "local test_var = 20\n"
3486b3a42afSjmmv "the_key = generate() + test_var\n");
3496b3a42afSjmmv }
3506b3a42afSjmmv
3516b3a42afSjmmv ATF_REQUIRE_EQ(35, tree.lookup< config::int_node >("the_key"));
3526b3a42afSjmmv }
3536b3a42afSjmmv
3546b3a42afSjmmv
3556b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(custom_node);
ATF_TEST_CASE_BODY(custom_node)3566b3a42afSjmmv ATF_TEST_CASE_BODY(custom_node)
3576b3a42afSjmmv {
3586b3a42afSjmmv config::tree tree;
3596b3a42afSjmmv tree.define< custom_node >("key1");
3606b3a42afSjmmv tree.define< custom_node >("key2");
3616b3a42afSjmmv tree.set< custom_node >("key2", custom_type(10));
3626b3a42afSjmmv
3636b3a42afSjmmv {
3646b3a42afSjmmv lutok::state state;
3656b3a42afSjmmv config::redirect(state, tree);
3666b3a42afSjmmv lutok::do_string(state, "key1 = 512\n");
3676b3a42afSjmmv lutok::do_string(state, "key2 = key2 * 2\n");
3686b3a42afSjmmv }
3696b3a42afSjmmv
3706b3a42afSjmmv ATF_REQUIRE_EQ(1024, tree.lookup< custom_node >("key1").value);
3716b3a42afSjmmv ATF_REQUIRE_EQ(200, tree.lookup< custom_node >("key2").value);
3726b3a42afSjmmv }
3736b3a42afSjmmv
3746b3a42afSjmmv
3756b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(invalid_key);
ATF_TEST_CASE_BODY(invalid_key)3766b3a42afSjmmv ATF_TEST_CASE_BODY(invalid_key)
3776b3a42afSjmmv {
3786b3a42afSjmmv config::tree tree;
3796b3a42afSjmmv
3806b3a42afSjmmv lutok::state state;
3816b3a42afSjmmv config::redirect(state, tree);
3826b3a42afSjmmv ATF_REQUIRE_THROW_RE(lutok::error, "Empty component in key 'root.'",
3836b3a42afSjmmv lutok::do_string(state, "root['']['a'] = 12345\n"));
3846b3a42afSjmmv }
3856b3a42afSjmmv
3866b3a42afSjmmv
3876b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(unknown_key);
ATF_TEST_CASE_BODY(unknown_key)3886b3a42afSjmmv ATF_TEST_CASE_BODY(unknown_key)
3896b3a42afSjmmv {
3906b3a42afSjmmv config::tree tree;
3916b3a42afSjmmv tree.define< config::bool_node >("static.bool");
3926b3a42afSjmmv
3936b3a42afSjmmv lutok::state state;
3946b3a42afSjmmv config::redirect(state, tree);
3956b3a42afSjmmv ATF_REQUIRE_THROW_RE(lutok::error,
3966b3a42afSjmmv "Unknown configuration property 'static.int'",
3976b3a42afSjmmv lutok::do_string(state,
3986b3a42afSjmmv "static.int = 12345\n"));
3996b3a42afSjmmv }
4006b3a42afSjmmv
4016b3a42afSjmmv
4026b3a42afSjmmv ATF_TEST_CASE_WITHOUT_HEAD(value_error);
ATF_TEST_CASE_BODY(value_error)4036b3a42afSjmmv ATF_TEST_CASE_BODY(value_error)
4046b3a42afSjmmv {
4056b3a42afSjmmv config::tree tree;
4066b3a42afSjmmv tree.define< config::bool_node >("a.b");
4076b3a42afSjmmv
4086b3a42afSjmmv lutok::state state;
4096b3a42afSjmmv config::redirect(state, tree);
4106b3a42afSjmmv ATF_REQUIRE_THROW_RE(lutok::error,
4116b3a42afSjmmv "Invalid value for key 'a.b' \\(Not a boolean\\)",
4126b3a42afSjmmv lutok::do_string(state, "a.b = 12345\n"));
4136b3a42afSjmmv ATF_REQUIRE_THROW_RE(lutok::error,
4146b3a42afSjmmv "Invalid value for key 'a'",
4156b3a42afSjmmv lutok::do_string(state, "a = 1\n"));
4166b3a42afSjmmv }
4176b3a42afSjmmv
4186b3a42afSjmmv
ATF_INIT_TEST_CASES(tcs)4196b3a42afSjmmv ATF_INIT_TEST_CASES(tcs)
4206b3a42afSjmmv {
4216b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, top__valid_types);
4226b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, top__reuse);
4236b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, top__reset);
4246b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, top__already_set_on_entry);
4256b3a42afSjmmv
4266b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, subtree__valid_types);
4276b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, subtree__reuse);
4286b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, subtree__reset);
4296b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, subtree__already_set_on_entry);
4306b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, subtree__override_inner);
4316b3a42afSjmmv
4326b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, dynamic_subtree__strings);
4336b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, dynamic_subtree__invalid_types);
4346b3a42afSjmmv
4356b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, locals);
4366b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, custom_node);
4376b3a42afSjmmv
4386b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, invalid_key);
4396b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, unknown_key);
4406b3a42afSjmmv ATF_ADD_TEST_CASE(tcs, value_error);
4416b3a42afSjmmv }
442