aboutsummaryrefslogtreecommitdiffstats
path: root/nihil.ucl/tests/string.cc
diff options
context:
space:
mode:
authorLexi Winter <lexi@le-fay.org>2025-06-22 18:18:44 +0100
committerLexi Winter <lexi@le-fay.org>2025-06-22 18:18:44 +0100
commit639b270eed81f7c2627d810057d188e2e8ee67f9 (patch)
tree7b8f7628b799dba307f06cf813583d42bdc1838a /nihil.ucl/tests/string.cc
parent09b7a494bd5de24f380095003fb7da4939de43e5 (diff)
downloadnihil-639b270eed81f7c2627d810057d188e2e8ee67f9.tar.gz
nihil-639b270eed81f7c2627d810057d188e2e8ee67f9.tar.bz2
nihil.ucl: improve construction and comparison
Diffstat (limited to 'nihil.ucl/tests/string.cc')
-rw-r--r--nihil.ucl/tests/string.cc96
1 files changed, 93 insertions, 3 deletions
diff --git a/nihil.ucl/tests/string.cc b/nihil.ucl/tests/string.cc
index 4385dbb..b702b51 100644
--- a/nihil.ucl/tests/string.cc
+++ b/nihil.ucl/tests/string.cc
@@ -2,16 +2,106 @@
* This source code is released into the public domain.
*/
+#include <list>
#include <string>
+#include <vector>
#include <catch2/catch_test_macros.hpp>
+#include <ucl.h>
import nihil.ucl;
-TEST_CASE("ucl: string: construct", "[ucl]")
+TEST_CASE("ucl: string: invariants", "[ucl]")
{
- auto obj = nihil::ucl::string("testing");
- REQUIRE(object_cast<nihil::ucl::string>(obj).value() == "testing");
+ using namespace nihil::ucl;
+
+ static_assert(std::same_as<std::string_view, string::value_type>);
+ REQUIRE(string::ucl_type == object_type::string);
+ REQUIRE(static_cast<::ucl_type>(string::ucl_type) == UCL_STRING);
+}
+
+TEST_CASE("ucl: string: default construct", "[ucl]")
+{
+ auto str = nihil::ucl::string();
+ REQUIRE(str == "");
+}
+
+TEST_CASE("ucl: string: construct from string literal", "[ucl]")
+{
+ auto str = nihil::ucl::string("testing");
+ REQUIRE(str == "testing");
+}
+
+TEST_CASE("ucl: string: construct from std::string", "[ucl]")
+{
+ auto str = nihil::ucl::string(std::string("testing"));
+ REQUIRE(str == "testing");
+}
+
+TEST_CASE("ucl: string: construct from std::string_view", "[ucl]")
+{
+ auto str = nihil::ucl::string(std::string_view("testing"));
+ REQUIRE(str == "testing");
+}
+
+TEST_CASE("ucl: string: construct from contiguous range", "[ucl]")
+{
+ auto s = std::vector{'t', 'e', 's', 't', 'i', 'n', 'g'};
+ auto str = nihil::ucl::string(std::from_range, s);
+ REQUIRE(str == "testing");
+}
+
+TEST_CASE("ucl: string: construct from non-contiguous range", "[ucl]")
+{
+ auto s = std::list{'t', 'e', 's', 't', 'i', 'n', 'g'};
+ auto str = nihil::ucl::string(std::from_range, s);
+ REQUIRE(str == "testing");
+}
+
+TEST_CASE("ucl: string: construct from contiguous iterator", "[ucl]")
+{
+ auto s = std::vector{'t', 'e', 's', 't', 'i', 'n', 'g'};
+ auto str = nihil::ucl::string(std::ranges::begin(s),
+ std::ranges::end(s));
+ REQUIRE(str == "testing");
+}
+
+TEST_CASE("ucl: string: construct from non-contiguous iterator", "[ucl]")
+{
+ auto s = std::list{'t', 'e', 's', 't', 'i', 'n', 'g'};
+ auto str = nihil::ucl::string(std::ranges::begin(s),
+ std::ranges::end(s));
+ REQUIRE(str == "testing");
+}
+
+TEST_CASE("ucl: string: operator==", "[ucl]")
+{
+ auto str = nihil::ucl::string("testing");
+
+ REQUIRE(str == nihil::ucl::string("testing"));
+ REQUIRE(str == std::string_view("testing"));
+ REQUIRE(str == std::string("testing"));
+ REQUIRE(str == "testing");
+
+ REQUIRE(str != nihil::ucl::string("test"));
+ REQUIRE(str != std::string_view("test"));
+ REQUIRE(str != std::string("test"));
+ REQUIRE(str != "test");
+}
+
+TEST_CASE("ucl: string: operator<=>", "[ucl]")
+{
+ auto str = nihil::ucl::string("testing");
+
+ REQUIRE(str < nihil::ucl::string("zzz"));
+ REQUIRE(str < std::string_view("zzz"));
+ REQUIRE(str < std::string("zzz"));
+ REQUIRE(str < "zzz");
+
+ REQUIRE(str > nihil::ucl::string("aaa"));
+ REQUIRE(str > std::string_view("aaa"));
+ REQUIRE(str > std::string("aaa"));
+ REQUIRE(str > "aaa");
}
TEST_CASE("ucl: string: parse", "[ucl]")