From d13ca0404190c1dc31fc26ec8388e99bada97958 Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Sun, 5 Jan 2025 14:27:26 +0900 Subject: [PATCH] test: add test_find> --- tests/test_find.cpp | 104 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/tests/test_find.cpp b/tests/test_find.cpp index 2228a60..4d1ce3c 100644 --- a/tests/test_find.cpp +++ b/tests/test_find.cpp @@ -998,3 +998,107 @@ TEST_CASE("testing toml::find offset_datetime") CHECK_EQ(tm.tm_sec, 0); } } + +#ifdef TOML11_HAS_OPTIONAL +TEST_CASE("testing toml::find") +{ + using value_type = toml::value; + { + value_type v1 = toml::table{{"foo", "hoge"}}; + + const auto foo = toml::find>(v1, "foo"); + CHECK_UNARY(foo.has_value()); + CHECK_EQ(foo.value(), "hoge"); + + const auto bar = toml::find>(v1, "bar"); + CHECK_UNARY_FALSE(bar.has_value()); + + CHECK_THROWS_AS(toml::find>(v1, "foo"), toml::type_error); + } + { + value_type v1 = toml::table{{ "foo", toml::array{1,2,3,4,5} }}; + + const auto foo = toml::find>>(v1, "foo"); + CHECK_UNARY(foo.has_value()); + CHECK_EQ(foo.value().at(0), 1); + CHECK_EQ(foo.value().at(1), 2); + CHECK_EQ(foo.value().at(2), 3); + CHECK_EQ(foo.value().at(3), 4); + CHECK_EQ(foo.value().at(4), 5); + + const auto bar = toml::find>>(v1, "bar"); + CHECK_UNARY_FALSE(bar.has_value()); + + CHECK_THROWS_AS(toml::find>(v1, "foo"), toml::type_error); + } + { + value_type v1 = toml::array{1,2,3,4,5}; + + const auto foo = toml::find>(v1, 2); + CHECK_UNARY(foo.has_value()); + CHECK_EQ(foo.value(), 3); + + const auto bar = toml::find>(v1, 5); + CHECK_UNARY_FALSE(bar.has_value()); + + CHECK_THROWS_AS(toml::find>(v1, 2), toml::type_error); + } + { + value_type v1 = toml::table{ + { "foo", toml::table{ + {"bar", 3.14}, + {"baz", 2.71} + }} + }; + + const auto foobar = toml::find>(v1, "foo", "bar"); + CHECK_UNARY(foobar.has_value()); + CHECK_EQ(foobar.value(), 3.14); + + const auto foobaz = toml::find>(v1, "foo", "baz"); + CHECK_UNARY(foobaz.has_value()); + CHECK_EQ(foobaz.value(), 2.71); + + const auto fooqux = toml::find>(v1, "foo", "qux"); + CHECK_UNARY_FALSE(fooqux.has_value()); + + const auto barfoo = toml::find>(v1, "bar", "foo"); + CHECK_UNARY_FALSE(barfoo.has_value()); + + CHECK_THROWS_AS(toml::find>(v1, "foo", "bar"), toml::type_error); + CHECK_THROWS_AS(toml::find>(v1, "foo", 1), toml::type_error); + CHECK_THROWS_AS(toml::find>(v1, "foo", "bar", "baz"), toml::type_error); + } + { + value_type v1 = toml::table{ + { "foo", toml::array{ + toml::table{ + {"bar", 3.14} + }, + toml::table{ + {"bar", 2.71} + } + }} + }; + + const auto foobar = toml::find>(v1, "foo", 0, "bar"); + CHECK_UNARY(foobar.has_value()); + CHECK_EQ(foobar.value(), 3.14); + + const auto foobaz = toml::find>(v1, "foo", 1, "bar"); + CHECK_UNARY(foobaz.has_value()); + CHECK_EQ(foobaz.value(), 2.71); + + const auto barbar = toml::find>(v1, "bar", 0, "bar"); + CHECK_UNARY_FALSE(barbar.has_value()); + + const auto foo2bar = toml::find>(v1, "foo", 2, "bar"); + CHECK_UNARY_FALSE(foo2bar.has_value()); + + const auto foo0baz = toml::find>(v1, "foo", 0, "baz"); + CHECK_UNARY_FALSE(foo0baz.has_value()); + + CHECK_THROWS_AS(toml::find>(v1, "foo", "bar", "baz"), toml::type_error); + } +} +#endif