xref: /netbsd-src/external/bsd/kyua-cli/dist/utils/config/lua_module_test.cpp (revision 46b85cbbd3d745f264b248ec8702f62b162c7789)
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