aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd/kstd/string.test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/kstd/kstd/string.test.cpp')
-rw-r--r--libs/kstd/kstd/string.test.cpp831
1 files changed, 831 insertions, 0 deletions
diff --git a/libs/kstd/kstd/string.test.cpp b/libs/kstd/kstd/string.test.cpp
index 19345e09..e11877e5 100644
--- a/libs/kstd/kstd/string.test.cpp
+++ b/libs/kstd/kstd/string.test.cpp
@@ -8,9 +8,11 @@
#include <algorithm>
#include <cstring>
#include <forward_list>
+#include <functional>
#include <iterator>
#include <memory>
#include <sstream>
+#include <string>
#include <string_view>
#include <type_traits>
#include <utility>
@@ -1952,6 +1954,112 @@ SCENARIO("String modifiers", "[string]")
REQUIRE(s.data() != old_data);
}
}
+
+ WHEN("resizing to a greater size within the capacity")
+ {
+ s.resize(10);
+
+ THEN("the capacity stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("the size increases")
+ {
+ CHECK(s.size() > old_size);
+ REQUIRE(s.size() == 10);
+ }
+
+ THEN("the string get filled with null characters")
+ {
+ REQUIRE(kstd::string::traits_type::compare(s.data(), "abcd\0\0\0\0\0\0", s.size() + 1) == 0);
+ }
+ }
+
+ WHEN("resizing to a greater size with a given character within the capacity")
+ {
+ s.resize(10, 'x');
+
+ THEN("the capacity stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("the size increases")
+ {
+ CHECK(s.size() > old_size);
+ REQUIRE(s.size() == 10);
+ }
+
+ THEN("the string get filled with the given character")
+ {
+ REQUIRE(kstd::string::traits_type::compare(s.data(), "abcdxxxxxx", s.size() + 1) == 0);
+ }
+ }
+
+ WHEN("resizing to a greater size outside the capacity")
+ {
+ s.resize(20);
+
+ THEN("the capacity increases")
+ {
+ REQUIRE(s.capacity() > old_capacity);
+ }
+
+ THEN("the size increases")
+ {
+ CHECK(s.size() > old_size);
+ REQUIRE(s.size() == 20);
+ }
+
+ THEN("the string get filled with null characters")
+ {
+ REQUIRE(kstd::string::traits_type::compare(s.data(), "abcd\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", s.size() + 1) ==
+ 0);
+ }
+ }
+
+ WHEN("resizing to a greater size with a given character within the capacity")
+ {
+ s.resize(20, 'x');
+
+ THEN("the capacity increases")
+ {
+ REQUIRE(s.capacity() > old_capacity);
+ }
+
+ THEN("the size increases")
+ {
+ CHECK(s.size() > old_size);
+ REQUIRE(s.size() == 20);
+ }
+
+ THEN("the string get filled with the given character")
+ {
+ REQUIRE(kstd::string::traits_type::compare(s.data(), "abcdxxxxxxxxxxxxxxxx", s.size() + 1) == 0);
+ }
+ }
+
+ WHEN("resizing to a lesser size")
+ {
+ s.resize(2);
+
+ THEN("the capacity stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("the size decreases")
+ {
+ CHECK(s.size() < old_size);
+ REQUIRE(s.size() == 2);
+ }
+
+ THEN("the string get filled with the given character")
+ {
+ REQUIRE(kstd::string::traits_type::compare(s.data(), "ab\0", s.size() + 1) == 0);
+ }
+ }
}
GIVEN("A long string")
@@ -2035,6 +2143,69 @@ SCENARIO("String modifiers", "[string]")
REQUIRE(s.data() != old_data);
}
}
+
+ WHEN("resizing to a greater size")
+ {
+ s.resize(22); // NOLINT
+
+ THEN("the capacity increases")
+ {
+ REQUIRE(s.capacity() > old_capacity);
+ }
+
+ THEN("the size increases")
+ {
+ CHECK(s.size() > old_size);
+ REQUIRE(s.size() == 22);
+ }
+
+ THEN("the string get filled with null characters")
+ {
+ REQUIRE(kstd::string::traits_type::compare(s.data(), "abcdefghijABCDEFGHIJ\0\0", s.size() + 1) == 0);
+ }
+ }
+
+ WHEN("resizing to a greater size with a given character within the capacity")
+ {
+ s.resize(22, 'x'); // NOLINT
+
+ THEN("the capacity increases")
+ {
+ REQUIRE(s.capacity() > old_capacity);
+ }
+
+ THEN("the size increases")
+ {
+ CHECK(s.size() > old_size);
+ REQUIRE(s.size() == 22);
+ }
+
+ THEN("the string get filled with the given character")
+ {
+ REQUIRE(kstd::string::traits_type::compare(s.data(), "abcdefghijABCDEFGHIJxx", s.size() + 1) == 0);
+ }
+ }
+
+ WHEN("resizing to a lesser size")
+ {
+ s.resize(2);
+
+ THEN("the capacity stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("the size decreases")
+ {
+ CHECK(s.size() < old_size);
+ REQUIRE(s.size() == 2);
+ }
+
+ THEN("the string get filled with the given character")
+ {
+ REQUIRE(kstd::string::traits_type::compare(s.data(), "ab\0", s.size() + 1) == 0);
+ }
+ }
}
GIVEN("Two strings")
@@ -2152,6 +2323,310 @@ SCENARIO("String modifiers", "[string]")
}
}
+SCENARIO("String insertion", "[string]")
+{
+ GIVEN("A short string")
+ {
+ auto s = kstd::string{"abcd"};
+ auto old_capacity = s.capacity();
+ auto old_size = s.size();
+
+ WHEN("inserting five copies of a character at the beginning")
+ {
+ s.insert(0, 5, 'A');
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("The string is equal to the old string with the new characters prepended")
+ {
+ REQUIRE(s == kstd::string{"AAAAAabcd"});
+ }
+ }
+
+ WHEN("inserting five copies of a character in the middle")
+ {
+ s.insert(2, 5, 'A');
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("The string is equal to the old string with the new characters inserted")
+ {
+ REQUIRE(s == kstd::string{"abAAAAAcd"});
+ }
+ }
+
+ WHEN("inserting five copies of a character at the end")
+ {
+ s.insert(4, 5, 'A');
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("The string is equal to the old string with the new characters appended")
+ {
+ REQUIRE(s == kstd::string{"abcdAAAAA"});
+ }
+ }
+
+ WHEN("inserting five copies of a character behind the end")
+ {
+ THEN("an OS panic is triggered")
+ {
+ REQUIRE_THROWS_AS(s.insert(5, 5, 'A'), kstd::tests::os_panic);
+ }
+ }
+
+ WHEN("inserting 20 copies of a character")
+ {
+ s.insert(2, 20, 'A');
+
+ THEN("the capacity of the string grows")
+ {
+ REQUIRE(s.capacity() > old_capacity);
+ }
+
+ THEN("the string is equal t o the old string with the new characters inserted")
+ {
+ REQUIRE(s == kstd::string{"abAAAAAAAAAAAAAAAAAAAAcd"});
+ }
+ }
+
+ WHEN("inserting a C-style string of length 5 at the beginning")
+ {
+ s.insert(0, "AAAAA");
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("The string is equal to the old string with the new characters prepended")
+ {
+ REQUIRE(s == kstd::string{"AAAAAabcd"});
+ }
+ }
+
+ WHEN("inserting a C-style string of length 5 in the middle")
+ {
+ s.insert(2, "AAAAA");
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("The string is equal to the old string with the new characters inserted")
+ {
+ REQUIRE(s == kstd::string{"abAAAAAcd"});
+ }
+ }
+
+ WHEN("inserting a C-style string of length 5 at the end")
+ {
+ s.insert(4, "AAAAA");
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string stays the same")
+ {
+ REQUIRE(s.capacity() == old_capacity);
+ }
+
+ THEN("The string is equal to the old string with the new characters appended")
+ {
+ REQUIRE(s == kstd::string{"abcdAAAAA"});
+ }
+ }
+
+ WHEN("inserting a C-style string of length 5 behind the end")
+ {
+ THEN("an OS panic is triggered")
+ {
+ REQUIRE_THROWS_AS(s.insert(5, "AAAAA"), kstd::tests::os_panic);
+ }
+ }
+ }
+
+ GIVEN("A long string")
+ {
+ auto s = kstd::string{"abcdefghijABCDEFGHIJ"};
+ auto old_capacity = s.capacity();
+ auto old_size = s.size();
+
+ WHEN("inserting five copies of a character at the beginning")
+ {
+ s.insert(0, 5, 'A');
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string increases")
+ {
+ REQUIRE(s.capacity() >= old_capacity + 5);
+ }
+
+ THEN("The string is equal to the old string with the new characters prepended")
+ {
+ REQUIRE(s == kstd::string{"AAAAAabcdefghijABCDEFGHIJ"});
+ }
+ }
+
+ WHEN("inserting five copies of a character in the middle")
+ {
+ s.insert(10, 5, 'A');
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string increases")
+ {
+ REQUIRE(s.capacity() >= old_capacity + 5);
+ }
+
+ THEN("The string is equal to the old string with the new characters inserted")
+ {
+ REQUIRE(s == kstd::string{"abcdefghijAAAAAABCDEFGHIJ"});
+ }
+ }
+
+ WHEN("inserting five copies of a character at the end")
+ {
+ s.insert(20, 5, 'A');
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string increases")
+ {
+ REQUIRE(s.capacity() >= old_capacity + 5);
+ }
+
+ THEN("The string is equal to the old string with the new characters appended")
+ {
+ REQUIRE(s == kstd::string{"abcdefghijABCDEFGHIJAAAAA"});
+ }
+ }
+
+ WHEN("inserting five copies of a character behind the end")
+ {
+ THEN("an OS panic is triggered")
+ {
+ REQUIRE_THROWS_AS(s.insert(21, 5, 'A'), kstd::tests::os_panic);
+ }
+ }
+
+ WHEN("inserting a C-style string of length 5 at the beginning")
+ {
+ s.insert(0, "AAAAA");
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string increases")
+ {
+ REQUIRE(s.capacity() >= old_capacity + 5);
+ }
+
+ THEN("The string is equal to the old string with the new characters prepended")
+ {
+ REQUIRE(s == kstd::string{"AAAAAabcdefghijABCDEFGHIJ"});
+ }
+ }
+
+ WHEN("inserting a C-style string of length 5 in the middle")
+ {
+ s.insert(10, "AAAAA");
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the string increases")
+ {
+ REQUIRE(s.capacity() >= old_capacity + 5);
+ }
+
+ THEN("The string is equal to the old string with the new characters inserted")
+ {
+ REQUIRE(s == kstd::string{"abcdefghijAAAAAABCDEFGHIJ"});
+ }
+ }
+
+ WHEN("inserting a C-style string of length 5 at the end")
+ {
+ s.insert(20, "AAAAA");
+
+ THEN("the size of the string is increased by 5")
+ {
+ REQUIRE(s.size() == old_size + 5);
+ }
+
+ THEN("The capacity of the increases")
+ {
+ REQUIRE(s.capacity() >= old_capacity + 5);
+ }
+
+ THEN("The string is equal to the old string with the new characters appended")
+ {
+ REQUIRE(s == kstd::string{"abcdefghijABCDEFGHIJAAAAA"});
+ }
+ }
+
+ WHEN("inserting a C-style string of length 5 behind the end")
+ {
+ THEN("an OS panic is triggered")
+ {
+ REQUIRE_THROWS_AS(s.insert(21, "AAAAA"), kstd::tests::os_panic);
+ }
+ }
+ }
+}
+
SCENARIO("String concatenation", "[string]")
{
GIVEN("Two strings")
@@ -2229,6 +2704,311 @@ SCENARIO("String conversion and comparison", "[string]")
REQUIRE_FALSE(view != str);
}
}
+
+ GIVEN("The string 'abc'")
+ {
+ auto s1 = kstd::string{"abc"};
+
+ WHEN("comparing with the string 'def'")
+ {
+ auto result = s1.compare(kstd::string{"def"});
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing with the string 'abb'")
+ {
+ auto result = s1.compare(kstd::string{"abb"});
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing with the string 'abc'")
+ {
+ auto result = s1.compare(kstd::string{"abc"});
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the string 'def'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"def"});
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the string 'abb'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"abb"});
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the string 'cc'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"bc"});
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the string 'ef'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"ef"});
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the string 'bb'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"bb"});
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the string 'bc'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"bc"});
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the substring [1,2] of 'def'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"def"}, 1, 2);
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the substring [1,2] of 'abb'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"abb"}, 1, 2);
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the substring [1,2] of 'abc'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"abc"}, 1, 2);
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the substring [1,2] of 'def'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"def"}, 1, 2);
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the substring [1,2] of 'abb'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"abb"}, 1, 2);
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the substring [1,2] of 'abc'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"abc"}, 1, 2);
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the substring [1,npos] of 'def'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"def"}, 1, kstd::string::npos);
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the substring [1,npos] of 'abb'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"abb"}, 1, kstd::string::npos);
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the substring [1,npos] of 'abc'")
+ {
+ auto result = s1.compare(1, 2, kstd::string{"abc"}, 1, kstd::string::npos);
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the substring [1,npos] of 'def'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"def"}, 1, kstd::string::npos);
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the substring [1,npos] of 'abb'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"abb"}, 1, kstd::string::npos);
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the substring [1,npos] of 'abc'")
+ {
+ auto result = s1.compare(1, kstd::string::npos, kstd::string{"abc"}, 1, kstd::string::npos);
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing with the C-style string 'def'")
+ {
+ auto result = s1.compare("def");
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing with the C-style string 'abb'")
+ {
+ auto result = s1.compare("abb");
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing with the C-style string 'abc'")
+ {
+ auto result = s1.compare("abc");
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the C-style string 'def'")
+ {
+ auto result = s1.compare(1, 2, "def");
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the C-style string 'abb'")
+ {
+ auto result = s1.compare(1, 2, "abb");
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing substring [1,2] with the C-style string 'bc'")
+ {
+ auto result = s1.compare(1, 2, "bc");
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the C-style string 'def'")
+ {
+ auto result = s1.compare(1, 2, "ef");
+
+ THEN("the result is negative")
+ {
+ REQUIRE(result < 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the C-style string 'abb'")
+ {
+ auto result = s1.compare(1, 2, "abb");
+
+ THEN("the result is positive")
+ {
+ REQUIRE(result > 0);
+ }
+ }
+
+ WHEN("comparing substring [1,npos] with the C-style string 'bc'")
+ {
+ auto result = s1.compare(1, 2, "bc");
+
+ THEN("the result is zero")
+ {
+ REQUIRE(result == 0);
+ }
+ }
+ }
}
SCENARIO("String iteration", "[string]")
@@ -2333,3 +3113,54 @@ SCENARIO("String iteration", "[string]")
}
}
}
+
+SCENARIO("String STL integration", "[string]")
+{
+ GIVEN("An empty string")
+ {
+ auto s = kstd::string{""};
+
+ WHEN("hashing the string")
+ {
+ auto hash_result = std::hash<kstd::string>{}(s);
+
+ THEN("the result is equal to hashing an empty std::string")
+ {
+ REQUIRE(hash_result == std::hash<std::string>{}(""));
+ }
+ }
+ }
+
+ GIVEN("A non-empty string")
+ {
+ auto s = kstd::string{"abcd"};
+
+ WHEN("hashing the string")
+ {
+ auto hash_result = std::hash<kstd::string>{}(s);
+
+ THEN("the result is equal to hashing the same std::string")
+ {
+ REQUIRE(hash_result == std::hash<std::string>{}("abcd"));
+ }
+ }
+ }
+}
+
+SCENARIO("String user-defined literals")
+{
+ GIVEN("the user defined literals are in scope")
+ {
+ using namespace kstd::string_literals;
+
+ WHEN("creating a string using the _s literal suffix")
+ {
+ auto s = "abcd"_s;
+
+ THEN("the result is equal to the string created with the same literal")
+ {
+ REQUIRE(s == kstd::string{"abcd"});
+ }
+ }
+ }
+}