From e8d535e485204514fdb7b7e7de80102dd8a3e466 Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Fri, 21 Jun 2019 14:26:49 +0900 Subject: [PATCH] test: add tests for constructors with comments --- tests/test_comments.cpp | 364 +++++++++++++++++++++++++++++++++++----- 1 file changed, 325 insertions(+), 39 deletions(-) diff --git a/tests/test_comments.cpp b/tests/test_comments.cpp index bf4b200..f528a63 100644 --- a/tests/test_comments.cpp +++ b/tests/test_comments.cpp @@ -23,10 +23,10 @@ BOOST_AUTO_TEST_CASE(test_comment_before) const auto& a = toml::find(v, "a"); const auto& b = toml::find(v, "b"); - BOOST_CHECK_EQUAL(a.comments().size(), 1u); - BOOST_CHECK_EQUAL(a.comments().front(), u8" comment for a."); - BOOST_CHECK_EQUAL(b.comments().size(), 1u); - BOOST_CHECK_EQUAL(b.comments().front(), u8" comment for b."); + BOOST_TEST(a.comments().size() == 1u); + BOOST_TEST(a.comments().front() == u8" comment for a."); + BOOST_TEST(b.comments().size() == 1u); + BOOST_TEST(b.comments().front() == u8" comment for b."); } { const std::string file = u8R"( @@ -44,18 +44,17 @@ BOOST_AUTO_TEST_CASE(test_comment_before) const auto& a = toml::find(v, "a"); const auto& b = toml::find(v, "b"); - BOOST_CHECK_EQUAL(a.comments().size(), 2u); - BOOST_CHECK_EQUAL(a.comments().front(), u8" comment for a."); - BOOST_CHECK_EQUAL(a.comments().back(), u8" another comment for a."); - BOOST_CHECK_EQUAL(b.comments().size(), 2u); - BOOST_CHECK_EQUAL(b.comments().front(), u8" comment for b."); - BOOST_CHECK_EQUAL(b.comments().back(), u8" also comment for b."); + BOOST_TEST(a.comments().size() == 2u); + BOOST_TEST(a.comments().front() == u8" comment for a."); + BOOST_TEST(a.comments().back() == u8" another comment for a."); + BOOST_TEST(b.comments().size() == 2u); + BOOST_TEST(b.comments().front() == u8" comment for b."); + BOOST_TEST(b.comments().back() == u8" also comment for b."); } } BOOST_AUTO_TEST_CASE(test_comment_inline) { - using namespace toml::literals::toml_literals; { const std::string file = u8R"( a = 42 # comment for a. @@ -68,10 +67,10 @@ BOOST_AUTO_TEST_CASE(test_comment_inline) const auto& a = toml::find(v, "a"); const auto& b = toml::find(v, "b"); - BOOST_CHECK_EQUAL(a.comments().size(), 1u); - BOOST_CHECK_EQUAL(a.comments().front(), u8" comment for a."); - BOOST_CHECK_EQUAL(b.comments().size(), 1u); - BOOST_CHECK_EQUAL(b.comments().front(), u8" comment for b."); + BOOST_TEST(a.comments().size() == 1u); + BOOST_TEST(a.comments().front() == u8" comment for a."); + BOOST_TEST(b.comments().size() == 1u); + BOOST_TEST(b.comments().front() == u8" comment for b."); } { const std::string file = u8R"( @@ -90,19 +89,17 @@ BOOST_AUTO_TEST_CASE(test_comment_inline) const auto& b = toml::find(v, "b"); const auto& b0 = b.as_array().at(0); - BOOST_CHECK_EQUAL(a.comments().size(), 1u); - BOOST_CHECK_EQUAL(a.comments().front(), u8" comment for a."); - BOOST_CHECK_EQUAL(b.comments().size(), 1u); - BOOST_CHECK_EQUAL(b.comments().front(), u8" this is a comment for b."); - BOOST_CHECK_EQUAL(b0.comments().size(), 1u); - BOOST_CHECK_EQUAL(b0.comments().front(), - u8" this is not a comment for b, but \"bar\""); + BOOST_TEST(a.comments().size() == 1u); + BOOST_TEST(a.comments().front() == u8" comment for a."); + BOOST_TEST(b.comments().size() == 1u); + BOOST_TEST(b.comments().front() == u8" this is a comment for b."); + BOOST_TEST(b0.comments().size() == 1u); + BOOST_TEST(b0.comments().front() == u8" this is not a comment for b, but \"bar\""); } } BOOST_AUTO_TEST_CASE(test_comment_both) { - using namespace toml::literals::toml_literals; { const std::string file = u8R"( # comment for a. @@ -124,20 +121,20 @@ BOOST_AUTO_TEST_CASE(test_comment_both) const auto& c = toml::find(v, "c"); const auto& c0 = c.as_array().at(0); - BOOST_CHECK_EQUAL(a.comments().size(), 2u); - BOOST_CHECK_EQUAL(a.comments().front(), u8" comment for a."); - BOOST_CHECK_EQUAL(a.comments().back(), u8" inline comment for a."); - BOOST_CHECK_EQUAL(b.comments().size(), 2u); - BOOST_CHECK_EQUAL(b.comments().front(), u8" comment for b."); - BOOST_CHECK_EQUAL(b.comments().back(), u8" inline comment for b."); + BOOST_TEST(a.comments().size() == 2u); + BOOST_TEST(a.comments().front() == u8" comment for a."); + BOOST_TEST(a.comments().back() == u8" inline comment for a."); + BOOST_TEST(b.comments().size() == 2u); + BOOST_TEST(b.comments().front() == u8" comment for b."); + BOOST_TEST(b.comments().back() == u8" inline comment for b."); - BOOST_CHECK_EQUAL(c.comments().size(), 2u); - BOOST_CHECK_EQUAL(c.comments().front(), u8" comment for c."); - BOOST_CHECK_EQUAL(c.comments().back(), u8" another comment for c."); + BOOST_TEST(c.comments().size() == 2u); + BOOST_TEST(c.comments().front() == u8" comment for c."); + BOOST_TEST(c.comments().back() == u8" another comment for c."); - BOOST_CHECK_EQUAL(c0.comments().size(), 2u); - BOOST_CHECK_EQUAL(c0.comments().front(), u8" comment for the first element."); - BOOST_CHECK_EQUAL(c0.comments().back(), u8" this also."); + BOOST_TEST(c0.comments().size() == 2u); + BOOST_TEST(c0.comments().front() == u8" comment for the first element."); + BOOST_TEST(c0.comments().back() == u8" this also."); } } @@ -163,9 +160,298 @@ BOOST_AUTO_TEST_CASE(test_discard_comment) const auto& c = toml::find(v, "c"); const auto& c0 = c.as_array().at(0); - BOOST_CHECK(a.comments().empty()); - BOOST_CHECK(b.comments().empty()); - BOOST_CHECK(c.comments().empty()); - BOOST_CHECK(c0.comments().empty()); + BOOST_TEST(a.comments().empty()); + BOOST_TEST(b.comments().empty()); + BOOST_TEST(c.comments().empty()); + BOOST_TEST(c0.comments().empty()); } +BOOST_AUTO_TEST_CASE(test_construct_value_with_comments) +{ + using value_type = toml::basic_value; + { + const value_type v(true, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_boolean()); + BOOST_TEST(v.as_boolean() == true); + } + { + const value_type v(42, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_integer()); + BOOST_TEST(v.as_integer() == 42); + } + { + const value_type v(3.14, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_floating()); + BOOST_TEST(v.as_floating() == 3.14); + } + { + const value_type v(toml::string("str"), {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_string()); + BOOST_TEST(v.as_string() == "str"); + } + { + const value_type v(std::string("str"), {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_string()); + BOOST_TEST(v.as_string() == "str"); + } + { + const value_type v(std::string("str"), toml::string_t::literal, + {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_string()); + BOOST_TEST(v.as_string() == "str"); + } + { + const value_type v("str", {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_string()); + BOOST_TEST(v.as_string() == "str"); + } + { + const value_type v("str", toml::string_t::literal, + {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_string()); + BOOST_TEST(v.as_string() == "str"); + } +#if __cplusplus >= 201703L + { + using namespace std::literals::string_view_literals; + const value_type v("str"sv, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_string()); + BOOST_TEST(v.as_string() == "str"); + } + { + using namespace std::literals::string_view_literals; + const value_type v("str"sv, toml::string_t::literal, + {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_string()); + BOOST_TEST(v.as_string() == "str"); + } +#endif + const toml::local_date ld{2019, toml::month_t::Apr, 1}; + const toml::local_time lt{12, 30, 45}; + const toml::local_datetime ldt{ld, lt}; + const toml::offset_datetime odt{ld, lt, toml::time_offset{9, 0}}; + { + const value_type v(ld, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_local_date()); + BOOST_TEST(v.as_local_date() == ld); + } + { + const value_type v(lt, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_local_time()); + BOOST_TEST(v.as_local_time() == lt); + } + { + const toml::local_time three_hours{3,0,0}; + const value_type v(std::chrono::hours(3), {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_local_time()); + BOOST_TEST(v.as_local_time() == three_hours); + } + { + const value_type v(ldt, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_local_datetime()); + BOOST_TEST(v.as_local_datetime() == ldt); + } + { + const value_type v(odt, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_offset_datetime()); + BOOST_TEST(v.as_offset_datetime() == odt); + } + { + const auto systp = static_cast(odt); + const value_type v(systp, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_offset_datetime()); + BOOST_TEST(v.as_offset_datetime() == odt); + } + { + const typename value_type::array_type a{1,2,3,4,5}; + const value_type v(a, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_array()); + BOOST_TEST(v.as_array().at(0).is_integer()); + BOOST_TEST(v.as_array().at(1).is_integer()); + BOOST_TEST(v.as_array().at(2).is_integer()); + BOOST_TEST(v.as_array().at(3).is_integer()); + BOOST_TEST(v.as_array().at(4).is_integer()); + BOOST_TEST(v.as_array().at(0).as_integer() == 1); + BOOST_TEST(v.as_array().at(1).as_integer() == 2); + BOOST_TEST(v.as_array().at(2).as_integer() == 3); + BOOST_TEST(v.as_array().at(3).as_integer() == 4); + BOOST_TEST(v.as_array().at(4).as_integer() == 5); + } + { + const std::initializer_list a = {1,2,3,4,5}; + const value_type v(a, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_array()); + BOOST_TEST(v.as_array().at(0).is_integer()); + BOOST_TEST(v.as_array().at(1).is_integer()); + BOOST_TEST(v.as_array().at(2).is_integer()); + BOOST_TEST(v.as_array().at(3).is_integer()); + BOOST_TEST(v.as_array().at(4).is_integer()); + BOOST_TEST(v.as_array().at(0).as_integer() == 1); + BOOST_TEST(v.as_array().at(1).as_integer() == 2); + BOOST_TEST(v.as_array().at(2).as_integer() == 3); + BOOST_TEST(v.as_array().at(3).as_integer() == 4); + BOOST_TEST(v.as_array().at(4).as_integer() == 5); + } + { + const std::vector a = {1,2,3,4,5}; + const value_type v(a, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_array()); + BOOST_TEST(v.as_array().at(0).is_integer()); + BOOST_TEST(v.as_array().at(1).is_integer()); + BOOST_TEST(v.as_array().at(2).is_integer()); + BOOST_TEST(v.as_array().at(3).is_integer()); + BOOST_TEST(v.as_array().at(4).is_integer()); + BOOST_TEST(v.as_array().at(0).as_integer() == 1); + BOOST_TEST(v.as_array().at(1).as_integer() == 2); + BOOST_TEST(v.as_array().at(2).as_integer() == 3); + BOOST_TEST(v.as_array().at(3).as_integer() == 4); + BOOST_TEST(v.as_array().at(4).as_integer() == 5); + } + { + const typename value_type::table_type t{ + {"key1", 42}, {"key2", "foobar"} + }; + const value_type v(t, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_table()); + BOOST_TEST(v.as_table().at("key1").is_integer()); + BOOST_TEST(v.as_table().at("key1").as_integer() == 42); + BOOST_TEST(v.as_table().at("key2").is_string()); + BOOST_TEST(v.as_table().at("key2").as_string() == "foobar"); + } + { + const std::initializer_list> t{ + {"key1", 42}, {"key2", "foobar"} + }; + const value_type v(t, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_table()); + BOOST_TEST(v.as_table().at("key1").is_integer()); + BOOST_TEST(v.as_table().at("key1").as_integer() == 42); + BOOST_TEST(v.as_table().at("key2").is_string()); + BOOST_TEST(v.as_table().at("key2").as_string() == "foobar"); + } + { + const std::map t{ + {"key1", 42}, {"key2", "foobar"} + }; + const value_type v(t, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_table()); + BOOST_TEST(v.as_table().at("key1").is_integer()); + BOOST_TEST(v.as_table().at("key1").as_integer() == 42); + BOOST_TEST(v.as_table().at("key2").is_string()); + BOOST_TEST(v.as_table().at("key2").as_string() == "foobar"); + } +} + +BOOST_AUTO_TEST_CASE(test_overwrite_comments) +{ + using value_type = toml::basic_value; + { + const value_type v(42, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_integer()); + BOOST_TEST(v.as_integer() == 42); + + const value_type u(v, {"comment3", "comment4"}); + BOOST_TEST(u.comments().size() == 2); + BOOST_TEST(u.comments().at(0) == "comment3"); + BOOST_TEST(u.comments().at(1) == "comment4"); + BOOST_TEST(u.is_integer()); + BOOST_TEST(u.as_integer() == 42); + } + { + const value_type v(42, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_integer()); + BOOST_TEST(v.as_integer() == 42); + + const value_type u(v); + BOOST_TEST(u.comments().size() == 2); + BOOST_TEST(u.comments().at(0) == "comment1"); + BOOST_TEST(u.comments().at(1) == "comment2"); + BOOST_TEST(u.is_integer()); + BOOST_TEST(u.as_integer() == 42); + } + { + const value_type v(42, {"comment1", "comment2"}); + BOOST_TEST(v.comments().size() == 2); + BOOST_TEST(v.comments().at(0) == "comment1"); + BOOST_TEST(v.comments().at(1) == "comment2"); + BOOST_TEST(v.is_integer()); + BOOST_TEST(v.as_integer() == 42); + + const value_type u(v, {}); + BOOST_TEST(u.comments().size() == 0); + BOOST_TEST(u.is_integer()); + BOOST_TEST(u.as_integer() == 42); + } +}