diff --git a/tests/test_extended_conversions.cpp b/tests/test_extended_conversions.cpp index fd5d88d..8db1d02 100644 --- a/tests/test_extended_conversions.cpp +++ b/tests/test_extended_conversions.cpp @@ -54,63 +54,236 @@ struct into }; } // toml +// --------------------------------------------------------------------------- + +namespace extlib2 +{ +struct foo +{ + int a; + std::string b; +}; +struct bar +{ + int a; + std::string b; + + template class M, template class A> + void from_toml(const toml::basic_value& v) + { + this->a = toml::find(v, "a"); + this->b = toml::find(v, "b"); + return ; + } + + toml::table into_toml() const + { + return toml::table{{"a", this->a}, {"b", this->b}}; + } +}; +} // extlib2 + +namespace toml +{ +template<> +struct from +{ + template class M, template class A> + static extlib2::foo from_toml(const toml::basic_value& v) + { + return extlib2::foo{toml::find(v, "a"), toml::find(v, "b")}; + } +}; + +template<> +struct into +{ + static toml::table into_toml(const extlib2::foo& f) + { + return toml::table{{"a", f.a}, {"b", f.b}}; + } +}; +} // toml + +// --------------------------------------------------------------------------- BOOST_AUTO_TEST_CASE(test_conversion_by_member_methods) { - const toml::value v{{"a", 42}, {"b", "baz"}}; + { + const toml::value v{{"a", 42}, {"b", "baz"}}; - const auto foo = toml::get(v); - BOOST_CHECK_EQUAL(foo.a, 42); - BOOST_CHECK_EQUAL(foo.b, "baz"); + const auto foo = toml::get(v); + BOOST_CHECK_EQUAL(foo.a, 42); + BOOST_CHECK_EQUAL(foo.b, "baz"); - const toml::value v2(foo); + const toml::value v2(foo); - BOOST_CHECK_EQUAL(v, v2); + BOOST_CHECK_EQUAL(v, v2); + } + + { + const toml::value v{{"a", 42}, {"b", "baz"}}; + + const auto foo = toml::get(v); + BOOST_CHECK_EQUAL(foo.a, 42); + BOOST_CHECK_EQUAL(foo.b, "baz"); + + const toml::value v2(foo); + + BOOST_CHECK_EQUAL(v, v2); + } + + { + const toml::basic_value + v{{"a", 42}, {"b", "baz"}}; + + const auto foo = toml::get(v); + BOOST_CHECK_EQUAL(foo.a, 42); + BOOST_CHECK_EQUAL(foo.b, "baz"); + + const toml::value v2(foo); + + BOOST_CHECK_EQUAL(v, v2); + } } BOOST_AUTO_TEST_CASE(test_conversion_by_specialization) { - const toml::value v{{"a", 42}, {"b", "baz"}}; + { + const toml::value v{{"a", 42}, {"b", "baz"}}; - const auto bar = toml::get(v); - BOOST_CHECK_EQUAL(bar.a, 42); - BOOST_CHECK_EQUAL(bar.b, "baz"); + const auto bar = toml::get(v); + BOOST_CHECK_EQUAL(bar.a, 42); + BOOST_CHECK_EQUAL(bar.b, "baz"); - const toml::value v2(bar); + const toml::value v2(bar); - BOOST_CHECK_EQUAL(v, v2); + BOOST_CHECK_EQUAL(v, v2); + } + { + const toml::value v{{"a", 42}, {"b", "baz"}}; + + const auto bar = toml::get(v); + BOOST_CHECK_EQUAL(bar.a, 42); + BOOST_CHECK_EQUAL(bar.b, "baz"); + + const toml::value v2(bar); + + BOOST_CHECK_EQUAL(v, v2); + } + { + const toml::basic_value + v{{"a", 42}, {"b", "baz"}}; + + const auto bar = toml::get(v); + BOOST_CHECK_EQUAL(bar.a, 42); + BOOST_CHECK_EQUAL(bar.b, "baz"); + + const toml::value v2(bar); + + BOOST_CHECK_EQUAL(v, v2); + } } BOOST_AUTO_TEST_CASE(test_recursive_conversion) { - const toml::value v{ - toml::table{{"a", 42}, {"b", "baz"}}, - toml::table{{"a", 43}, {"b", "qux"}}, - toml::table{{"a", 44}, {"b", "quux"}}, - toml::table{{"a", 45}, {"b", "foobar"}}, - }; + { + const toml::value v{ + toml::table{{"a", 42}, {"b", "baz"}}, + toml::table{{"a", 43}, {"b", "qux"}}, + toml::table{{"a", 44}, {"b", "quux"}}, + toml::table{{"a", 45}, {"b", "foobar"}}, + }; - const auto foos = toml::get>(v); - BOOST_CHECK_EQUAL(foos.size() , 4ul); - BOOST_CHECK_EQUAL(foos.at(0).a , 42); - BOOST_CHECK_EQUAL(foos.at(1).a , 43); - BOOST_CHECK_EQUAL(foos.at(2).a , 44); - BOOST_CHECK_EQUAL(foos.at(3).a , 45); + const auto foos = toml::get>(v); + BOOST_CHECK_EQUAL(foos.size() , 4ul); + BOOST_CHECK_EQUAL(foos.at(0).a , 42); + BOOST_CHECK_EQUAL(foos.at(1).a , 43); + BOOST_CHECK_EQUAL(foos.at(2).a , 44); + BOOST_CHECK_EQUAL(foos.at(3).a , 45); - BOOST_CHECK_EQUAL(foos.at(0).b , "baz"); - BOOST_CHECK_EQUAL(foos.at(1).b , "qux"); - BOOST_CHECK_EQUAL(foos.at(2).b , "quux"); - BOOST_CHECK_EQUAL(foos.at(3).b , "foobar"); + BOOST_CHECK_EQUAL(foos.at(0).b , "baz"); + BOOST_CHECK_EQUAL(foos.at(1).b , "qux"); + BOOST_CHECK_EQUAL(foos.at(2).b , "quux"); + BOOST_CHECK_EQUAL(foos.at(3).b , "foobar"); - const auto bars = toml::get>(v); - BOOST_CHECK_EQUAL(bars.size() , 4ul); - BOOST_CHECK_EQUAL(bars.at(0).a , 42); - BOOST_CHECK_EQUAL(bars.at(1).a , 43); - BOOST_CHECK_EQUAL(bars.at(2).a , 44); - BOOST_CHECK_EQUAL(bars.at(3).a , 45); + const auto bars = toml::get>(v); + BOOST_CHECK_EQUAL(bars.size() , 4ul); + BOOST_CHECK_EQUAL(bars.at(0).a , 42); + BOOST_CHECK_EQUAL(bars.at(1).a , 43); + BOOST_CHECK_EQUAL(bars.at(2).a , 44); + BOOST_CHECK_EQUAL(bars.at(3).a , 45); - BOOST_CHECK_EQUAL(bars.at(0).b , "baz"); - BOOST_CHECK_EQUAL(bars.at(1).b , "qux"); - BOOST_CHECK_EQUAL(bars.at(2).b , "quux"); - BOOST_CHECK_EQUAL(bars.at(3).b , "foobar"); + BOOST_CHECK_EQUAL(bars.at(0).b , "baz"); + BOOST_CHECK_EQUAL(bars.at(1).b , "qux"); + BOOST_CHECK_EQUAL(bars.at(2).b , "quux"); + BOOST_CHECK_EQUAL(bars.at(3).b , "foobar"); + } + { + const toml::value v{ + toml::table{{"a", 42}, {"b", "baz"}}, + toml::table{{"a", 43}, {"b", "qux"}}, + toml::table{{"a", 44}, {"b", "quux"}}, + toml::table{{"a", 45}, {"b", "foobar"}}, + }; + + const auto foos = toml::get>(v); + BOOST_CHECK_EQUAL(foos.size() , 4ul); + BOOST_CHECK_EQUAL(foos.at(0).a , 42); + BOOST_CHECK_EQUAL(foos.at(1).a , 43); + BOOST_CHECK_EQUAL(foos.at(2).a , 44); + BOOST_CHECK_EQUAL(foos.at(3).a , 45); + + BOOST_CHECK_EQUAL(foos.at(0).b , "baz"); + BOOST_CHECK_EQUAL(foos.at(1).b , "qux"); + BOOST_CHECK_EQUAL(foos.at(2).b , "quux"); + BOOST_CHECK_EQUAL(foos.at(3).b , "foobar"); + + const auto bars = toml::get>(v); + BOOST_CHECK_EQUAL(bars.size() , 4ul); + BOOST_CHECK_EQUAL(bars.at(0).a , 42); + BOOST_CHECK_EQUAL(bars.at(1).a , 43); + BOOST_CHECK_EQUAL(bars.at(2).a , 44); + BOOST_CHECK_EQUAL(bars.at(3).a , 45); + + BOOST_CHECK_EQUAL(bars.at(0).b , "baz"); + BOOST_CHECK_EQUAL(bars.at(1).b , "qux"); + BOOST_CHECK_EQUAL(bars.at(2).b , "quux"); + BOOST_CHECK_EQUAL(bars.at(3).b , "foobar"); + } + + { + const toml::basic_value + v{ + toml::table{{"a", 42}, {"b", "baz"}}, + toml::table{{"a", 43}, {"b", "qux"}}, + toml::table{{"a", 44}, {"b", "quux"}}, + toml::table{{"a", 45}, {"b", "foobar"}}, + }; + + const auto foos = toml::get>(v); + BOOST_CHECK_EQUAL(foos.size() , 4ul); + BOOST_CHECK_EQUAL(foos.at(0).a , 42); + BOOST_CHECK_EQUAL(foos.at(1).a , 43); + BOOST_CHECK_EQUAL(foos.at(2).a , 44); + BOOST_CHECK_EQUAL(foos.at(3).a , 45); + + BOOST_CHECK_EQUAL(foos.at(0).b , "baz"); + BOOST_CHECK_EQUAL(foos.at(1).b , "qux"); + BOOST_CHECK_EQUAL(foos.at(2).b , "quux"); + BOOST_CHECK_EQUAL(foos.at(3).b , "foobar"); + + const auto bars = toml::get>(v); + BOOST_CHECK_EQUAL(bars.size() , 4ul); + BOOST_CHECK_EQUAL(bars.at(0).a , 42); + BOOST_CHECK_EQUAL(bars.at(1).a , 43); + BOOST_CHECK_EQUAL(bars.at(2).a , 44); + BOOST_CHECK_EQUAL(bars.at(3).a , 45); + + BOOST_CHECK_EQUAL(bars.at(0).b , "baz"); + BOOST_CHECK_EQUAL(bars.at(1).b , "qux"); + BOOST_CHECK_EQUAL(bars.at(2).b , "quux"); + BOOST_CHECK_EQUAL(bars.at(3).b , "foobar"); + } } +