diff options
| author | Lexi Winter <lexi@le-fay.org> | 2025-07-01 17:07:04 +0100 |
|---|---|---|
| committer | Lexi Winter <lexi@le-fay.org> | 2025-07-01 17:07:04 +0100 |
| commit | 2e2d1bd3b6c7776b77c33b94f30ead89367a71e6 (patch) | |
| tree | 54d37ffadf8e677938d9b7a28e4e9b71be1e75c1 /nihil.ucl/tests/string.cc | |
| parent | 36427c0966faa7aecd586b397ed9b845f18172f5 (diff) | |
| download | nihil-2e2d1bd3b6c7776b77c33b94f30ead89367a71e6.tar.gz nihil-2e2d1bd3b6c7776b77c33b94f30ead89367a71e6.tar.bz2 | |
add nihil.std
Diffstat (limited to 'nihil.ucl/tests/string.cc')
| -rw-r--r-- | nihil.ucl/tests/string.cc | 415 |
1 files changed, 0 insertions, 415 deletions
diff --git a/nihil.ucl/tests/string.cc b/nihil.ucl/tests/string.cc deleted file mode 100644 index 6409b8d..0000000 --- a/nihil.ucl/tests/string.cc +++ /dev/null @@ -1,415 +0,0 @@ -/* - * This source code is released into the public domain. - */ - -#include <concepts> -#include <list> -#include <sstream> -#include <string> -#include <vector> - -#include <catch2/catch_test_macros.hpp> -#include <ucl.h> - -import nihil.ucl; - -TEST_CASE("ucl: string: invariants", "[ucl]") -{ - using namespace nihil::ucl; - - static_assert(std::same_as<std::string_view, string::contained_type>); - REQUIRE(string::ucl_type == object_type::string); - REQUIRE(static_cast<::ucl_type>(string::ucl_type) == UCL_STRING); - - static_assert(std::destructible<string>); - static_assert(std::default_initializable<string>); - static_assert(std::move_constructible<string>); - static_assert(std::copy_constructible<string>); - static_assert(std::equality_comparable<string>); - static_assert(std::totally_ordered<string>); - static_assert(std::swappable<string>); - - static_assert(std::ranges::contiguous_range<string>); - static_assert(std::same_as<char, std::ranges::range_value_t<string>>); -} - -TEST_CASE("ucl: string: literal", "[ucl]") -{ - SECTION("with namespace nihil::ucl::literals") { - using namespace nihil::ucl::literals; - - auto s = "testing"_ucl; - REQUIRE(s.type() == nihil::ucl::object_type::string); - REQUIRE(s == "testing"); - } - - SECTION("with namespace nihil::literals") { - using namespace nihil::literals; - - auto s = "testing"_ucl; - REQUIRE(s.type() == nihil::ucl::object_type::string); - REQUIRE(s == "testing"); - } -} - -TEST_CASE("ucl: string: construct", "[ucl]") -{ - using namespace nihil::ucl; - using namespace std::literals; - - SECTION("empty string") { - auto str = string(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == ""); - } - - SECTION("with integer-like value") { - auto str = "42"_ucl; - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "42"); - } - - SECTION("with boolean-like value") { - auto str = "true"_ucl; - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "true"); - } - - SECTION("from string literal") { - auto str = string("testing"); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from std::string") { - auto str = string("testing"s); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from std::string_view") { - auto str = string("testing"sv); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from contiguous range") { - auto s = std::vector{'t', 'e', 's', 't', 'i', 'n', 'g'}; - auto str = string(s); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from non-contiguous range") { - auto s = std::list{'t', 'e', 's', 't', 'i', 'n', 'g'}; - auto str = string(s); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from contiguous iterator pair") { - auto s = std::vector{'t', 'e', 's', 't', 'i', 'n', 'g'}; - auto str = string(s.begin(), s.end()); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from non-contiguous iterator pair") { - auto s = std::list{'t', 'e', 's', 't', 'i', 'n', 'g'}; - auto str = string(s.begin(), s.end()); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } -} - -TEST_CASE("ucl: string: construct from UCL object", "[ucl]") -{ - using namespace nihil::ucl; - - SECTION("ref, correct type") { - auto uobj = ::ucl_object_fromstring("testing"); - - auto s = string(ref, uobj); - REQUIRE(s == "testing"); - - ::ucl_object_unref(uobj); - } - - SECTION("noref, correct type") { - auto uobj = ::ucl_object_fromstring("testing"); - - auto s = string(noref, uobj); - REQUIRE(s == "testing"); - } - - SECTION("ref, wrong type") { - auto uobj = ::ucl_object_frombool(true); - - REQUIRE_THROWS_AS(string(ref, uobj), type_mismatch); - - ::ucl_object_unref(uobj); - } - - SECTION("noref, wrong type") { - auto uobj = ::ucl_object_frombool(true); - - REQUIRE_THROWS_AS(string(noref, uobj), type_mismatch); - - ::ucl_object_unref(uobj); - } -} - -TEST_CASE("ucl: string: make_string", "[ucl]") -{ - using namespace nihil::ucl; - using namespace std::literals; - - SECTION("empty string") { - auto str = make_string().value(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == ""); - } - - SECTION("from string literal") { - auto str = make_string("testing").value(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from std::string") { - auto str = make_string("testing"s).value(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from std::string_view") { - auto str = make_string("testing"sv).value(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from contiguous range") { - auto s = std::vector{'t', 'e', 's', 't', 'i', 'n', 'g'}; - auto str = make_string(s).value(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from non-contiguous range") { - auto s = std::list{'t', 'e', 's', 't', 'i', 'n', 'g'}; - auto str = make_string(s).value(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from contiguous iterator pair") { - auto s = std::vector{'t', 'e', 's', 't', 'i', 'n', 'g'}; - auto str = make_string(s.begin(), s.end()).value(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } - - SECTION("from non-contiguous iterator pair") { - auto s = std::list{'t', 'e', 's', 't', 'i', 'n', 'g'}; - auto str = make_string(s.begin(), s.end()).value(); - REQUIRE(str.type() == object_type::string); - REQUIRE(str == "testing"); - } -} - -TEST_CASE("ucl: string: swap", "[ucl]") -{ - // do not add using namespace nihil::ucl - - auto s1 = nihil::ucl::string("one"); - auto s2 = nihil::ucl::string("two"); - - swap(s1, s2); - - REQUIRE(s1 == "two"); - REQUIRE(s2 == "one"); -} - -TEST_CASE("ucl: string: value()", "[ucl]") -{ - using namespace nihil::ucl; - - auto s = string("te\"st"); - REQUIRE(s.value() == "te\"st"); -} - -TEST_CASE("ucl: string: key()", "[ucl]") -{ - using namespace nihil::ucl; - - auto err = parse("a_string = \"test\""); - REQUIRE(err); - - auto obj = *err; - REQUIRE(object_cast<string>(obj["a_string"])->key() == "a_string"); - - auto s = string("test"); - REQUIRE(s.key() == ""); -} - -TEST_CASE("ucl: string: size", "[ucl]") -{ - using namespace nihil::ucl; - - REQUIRE(string().size() == 0); - REQUIRE(string("test").size() == 4); -} - -TEST_CASE("ucl: string: empty", "[ucl]") -{ - using namespace nihil::ucl; - - REQUIRE(string().empty() == true); - REQUIRE(string("test").empty() == false); -} - -TEST_CASE("ucl: string: iterate", "[ucl]") -{ - using namespace nihil::ucl; - - auto str = "test"_ucl; - - SECTION("as iterator pair") { - auto begin = str.begin(); - static_assert(std::contiguous_iterator<decltype(begin)>); - - auto end = str.end(); - static_assert(std::sentinel_for<decltype(end), - decltype(begin)>); - - REQUIRE(*begin == 't'); - ++begin; - REQUIRE(*begin == 'e'); - ++begin; - REQUIRE(*begin == 's'); - ++begin; - REQUIRE(*begin == 't'); - ++begin; - - REQUIRE(begin == end); - } - - SECTION("as range") { - auto s = std::string(std::from_range, str); - REQUIRE(s == "test"); - } -} - -TEST_CASE("ucl: string: comparison", "[ucl]") -{ - using namespace nihil::ucl; - - auto str = "testing"_ucl; - - SECTION("operator==") { - REQUIRE(str == "testing"_ucl); - REQUIRE(str == std::string_view("testing")); - REQUIRE(str == std::string("testing")); - REQUIRE(str == "testing"); - } - - SECTION("operator!=") { - REQUIRE(str != "test"_ucl); - REQUIRE(str != std::string_view("test")); - REQUIRE(str != std::string("test")); - REQUIRE(str != "test"); - } - - SECTION("operator<") { - REQUIRE(str < "zzz"_ucl); - REQUIRE(str < std::string_view("zzz")); - REQUIRE(str < std::string("zzz")); - REQUIRE(str < "zzz"); - } - - SECTION("operator>") { - REQUIRE(str > "aaa"_ucl); - REQUIRE(str > std::string_view("aaa")); - REQUIRE(str > std::string("aaa")); - REQUIRE(str > "aaa"); - } -} - -TEST_CASE("ucl: string: parse", "[ucl]") -{ - using namespace nihil::ucl; - - auto obj = parse("value = \"te\\\"st\"").value(); - - auto v = obj["value"]; - REQUIRE(v.key() == "value"); - REQUIRE(object_cast<nihil::ucl::string>(v).value() == "te\"st"); -} - -TEST_CASE("ucl: string: emit", "[ucl]") -{ - using namespace nihil::ucl; - - auto ucl = parse("str = \"te\\\"st\";").value(); - - auto output = std::string(); - emit(ucl, emitter::configuration, std::back_inserter(output)); - - REQUIRE(output == "str = \"te\\\"st\";\n"); -} - -TEST_CASE("ucl: string: format", "[ucl]") -{ - using namespace nihil::ucl; - using namespace std::literals; - - auto constexpr test_string = "te\"st"sv; - - SECTION("bare string") { - auto str = std::format("{}", string(test_string)); - REQUIRE(str == test_string); - } - - SECTION("parsed string") { - auto obj = parse("string = \"te\\\"st\";").value(); - auto s = object_cast<string>(obj["string"]).value(); - - auto str = std::format("{}", s); - REQUIRE(str == test_string); - } - - SECTION("with format string") { - auto str = std::format("{: >10}", string(test_string)); - REQUIRE(str == " te\"st"); - } -} - -TEST_CASE("ucl: string: print to ostream", "[ucl]") -{ - using namespace nihil::ucl; - using namespace std::literals; - - auto constexpr test_string = "te\"st"sv; - - SECTION("bare string") { - auto strm = std::ostringstream(); - strm << string(test_string); - - REQUIRE(strm.str() == test_string); - } - - SECTION("parsed string") { - auto obj = parse("string = \"te\\\"st\";").value(); - auto s = object_cast<string>(obj["string"]).value(); - - auto strm = std::ostringstream(); - strm << s; - - REQUIRE(strm.str() == test_string); - } - - SECTION("with format string") { - auto str = std::format("{: >10}", string(test_string)); - REQUIRE(str == " te\"st"); - } -} |
