|
@@ -360,18 +360,37 @@ TEST_CASE("[String] Substr") {
|
|
|
|
|
|
TEST_CASE("[String] Find") {
|
|
|
String s = "Pretty Woman Woman";
|
|
|
- CHECK(s.find("tty") == 3);
|
|
|
- CHECK(s.find("Wo", 9) == 13);
|
|
|
- CHECK(s.find("Revenge of the Monster Truck") == -1);
|
|
|
- CHECK(s.rfind("man") == 15);
|
|
|
+ MULTICHECK_STRING_EQ(s, find, "tty", 3);
|
|
|
+ MULTICHECK_STRING_EQ(s, find, "Revenge of the Monster Truck", -1);
|
|
|
+ MULTICHECK_STRING_INT_EQ(s, find, "Wo", 9, 13);
|
|
|
+ MULTICHECK_STRING_EQ(s, find, "", -1);
|
|
|
+ MULTICHECK_STRING_EQ(s, find, "Pretty Woman Woman", 0);
|
|
|
+ MULTICHECK_STRING_EQ(s, find, "WOMAN", -1);
|
|
|
+ MULTICHECK_STRING_INT_EQ(s, find, "", 9, -1);
|
|
|
+
|
|
|
+ MULTICHECK_STRING_EQ(s, rfind, "", -1);
|
|
|
+ MULTICHECK_STRING_EQ(s, rfind, "foo", -1);
|
|
|
+ MULTICHECK_STRING_EQ(s, rfind, "Pretty Woman Woman", 0);
|
|
|
+ MULTICHECK_STRING_EQ(s, rfind, "man", 15);
|
|
|
+ MULTICHECK_STRING_EQ(s, rfind, "WOMAN", -1);
|
|
|
+ MULTICHECK_STRING_INT_EQ(s, rfind, "", 15, -1);
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[String] Find no case") {
|
|
|
String s = "Pretty Whale Whale";
|
|
|
- CHECK(s.findn("WHA") == 7);
|
|
|
- CHECK(s.findn("WHA", 9) == 13);
|
|
|
- CHECK(s.findn("Revenge of the Monster SawFish") == -1);
|
|
|
- CHECK(s.rfindn("WHA") == 13);
|
|
|
+ MULTICHECK_STRING_EQ(s, findn, "WHA", 7);
|
|
|
+ MULTICHECK_STRING_INT_EQ(s, findn, "WHA", 9, 13);
|
|
|
+ MULTICHECK_STRING_EQ(s, findn, "Revenge of the Monster SawFish", -1);
|
|
|
+ MULTICHECK_STRING_EQ(s, findn, "", -1);
|
|
|
+ MULTICHECK_STRING_EQ(s, findn, "wha", 7);
|
|
|
+ MULTICHECK_STRING_EQ(s, findn, "Wha", 7);
|
|
|
+ MULTICHECK_STRING_INT_EQ(s, findn, "", 3, -1);
|
|
|
+
|
|
|
+ MULTICHECK_STRING_EQ(s, rfindn, "WHA", 13);
|
|
|
+ MULTICHECK_STRING_EQ(s, rfindn, "", -1);
|
|
|
+ MULTICHECK_STRING_EQ(s, rfindn, "wha", 13);
|
|
|
+ MULTICHECK_STRING_EQ(s, rfindn, "Wha", 13);
|
|
|
+ MULTICHECK_STRING_INT_EQ(s, rfindn, "", 13, -1);
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[String] Find MK") {
|
|
@@ -392,11 +411,9 @@ TEST_CASE("[String] Find MK") {
|
|
|
|
|
|
TEST_CASE("[String] Find and replace") {
|
|
|
String s = "Happy Birthday, Anna!";
|
|
|
- s = s.replace("Birthday", "Halloween");
|
|
|
- CHECK(s == "Happy Halloween, Anna!");
|
|
|
-
|
|
|
- s = s.replace_first("H", "W");
|
|
|
- CHECK(s == "Wappy Halloween, Anna!");
|
|
|
+ MULTICHECK_STRING_STRING_EQ(s, replace, "Birthday", "Halloween", "Happy Halloween, Anna!");
|
|
|
+ MULTICHECK_STRING_STRING_EQ(s, replace_first, "y", "Y", "HappY Birthday, Anna!");
|
|
|
+ MULTICHECK_STRING_STRING_EQ(s, replacen, "Y", "Y", "HappY BirthdaY, Anna!");
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[String] Insertion") {
|
|
@@ -557,51 +574,76 @@ TEST_CASE("[String] String to float") {
|
|
|
|
|
|
TEST_CASE("[String] Slicing") {
|
|
|
String s = "Mars,Jupiter,Saturn,Uranus";
|
|
|
-
|
|
|
const char *slices[4] = { "Mars", "Jupiter", "Saturn", "Uranus" };
|
|
|
- for (int i = 0; i < s.get_slice_count(","); i++) {
|
|
|
- CHECK(s.get_slice(",", i) == slices[i]);
|
|
|
- }
|
|
|
+ MULTICHECK_GET_SLICE(s, ",", slices);
|
|
|
+}
|
|
|
+
|
|
|
+TEST_CASE("[String] Begins with") {
|
|
|
+ // Test cases for true:
|
|
|
+ MULTICHECK_STRING_EQ(String("res://foobar"), begins_with, "res://", true);
|
|
|
+ MULTICHECK_STRING_EQ(String("abc"), begins_with, "abc", true);
|
|
|
+ MULTICHECK_STRING_EQ(String("abc"), begins_with, "", true);
|
|
|
+ MULTICHECK_STRING_EQ(String(""), begins_with, "", true);
|
|
|
+
|
|
|
+ // Test cases for false:
|
|
|
+ MULTICHECK_STRING_EQ(String("res"), begins_with, "res://", false);
|
|
|
+ MULTICHECK_STRING_EQ(String("abcdef"), begins_with, "foo", false);
|
|
|
+ MULTICHECK_STRING_EQ(String("abc"), begins_with, "ax", false);
|
|
|
+ MULTICHECK_STRING_EQ(String(""), begins_with, "abc", false);
|
|
|
+
|
|
|
+ // Test "const char *" version also with nullptr.
|
|
|
+ String s("foo");
|
|
|
+ bool state = s.begins_with(nullptr) == false;
|
|
|
+ CHECK_MESSAGE(state, "nullptr check failed");
|
|
|
+
|
|
|
+ String empty("");
|
|
|
+ state = empty.begins_with(nullptr) == false;
|
|
|
+ CHECK_MESSAGE(state, "nullptr check with empty string failed");
|
|
|
+}
|
|
|
+
|
|
|
+TEST_CASE("[String] Ends with") {
|
|
|
+ // Test cases for true:
|
|
|
+ MULTICHECK_STRING_EQ(String("res://foobar"), ends_with, "foobar", true);
|
|
|
+ MULTICHECK_STRING_EQ(String("abc"), ends_with, "abc", true);
|
|
|
+ MULTICHECK_STRING_EQ(String("abc"), ends_with, "", true);
|
|
|
+ MULTICHECK_STRING_EQ(String(""), ends_with, "", true);
|
|
|
+
|
|
|
+ // Test cases for false:
|
|
|
+ MULTICHECK_STRING_EQ(String("res"), ends_with, "res://", false);
|
|
|
+ MULTICHECK_STRING_EQ(String("abcdef"), ends_with, "foo", false);
|
|
|
+ MULTICHECK_STRING_EQ(String("abc"), ends_with, "ax", false);
|
|
|
+ MULTICHECK_STRING_EQ(String(""), ends_with, "abc", false);
|
|
|
+
|
|
|
+ // Test "const char *" version also with nullptr.
|
|
|
+ String s("foo");
|
|
|
+ bool state = s.ends_with(nullptr) == false;
|
|
|
+ CHECK_MESSAGE(state, "nullptr check failed");
|
|
|
+
|
|
|
+ String empty("");
|
|
|
+ state = empty.ends_with(nullptr) == false;
|
|
|
+ CHECK_MESSAGE(state, "nullptr check with empty string failed");
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[String] Splitting") {
|
|
|
String s = "Mars,Jupiter,Saturn,Uranus";
|
|
|
- Vector<String> l;
|
|
|
-
|
|
|
const char *slices_l[3] = { "Mars", "Jupiter", "Saturn,Uranus" };
|
|
|
- const char *slices_r[3] = { "Mars,Jupiter", "Saturn", "Uranus" };
|
|
|
- const char *slices_3[4] = { "t", "e", "s", "t" };
|
|
|
-
|
|
|
- l = s.split(",", true, 2);
|
|
|
- CHECK(l.size() == 3);
|
|
|
- for (int i = 0; i < l.size(); i++) {
|
|
|
- CHECK(l[i] == slices_l[i]);
|
|
|
- }
|
|
|
+ MULTICHECK_SPLIT(s, split, ",", true, 2, slices_l, 3);
|
|
|
|
|
|
- l = s.rsplit(",", true, 2);
|
|
|
- CHECK(l.size() == 3);
|
|
|
- for (int i = 0; i < l.size(); i++) {
|
|
|
- CHECK(l[i] == slices_r[i]);
|
|
|
- }
|
|
|
+ const char *slices_r[3] = { "Mars,Jupiter", "Saturn", "Uranus" };
|
|
|
+ MULTICHECK_SPLIT(s, rsplit, ",", true, 2, slices_r, 3);
|
|
|
|
|
|
s = "test";
|
|
|
- l = s.split();
|
|
|
- CHECK(l.size() == 4);
|
|
|
- for (int i = 0; i < l.size(); i++) {
|
|
|
- CHECK(l[i] == slices_3[i]);
|
|
|
- }
|
|
|
+ const char *slices_3[4] = { "t", "e", "s", "t" };
|
|
|
+ MULTICHECK_SPLIT(s, split, "", true, 0, slices_3, 4);
|
|
|
|
|
|
s = "";
|
|
|
- l = s.split();
|
|
|
- CHECK(l.size() == 1);
|
|
|
- CHECK(l[0] == "");
|
|
|
-
|
|
|
- l = s.split("", false);
|
|
|
- CHECK(l.size() == 0);
|
|
|
+ const char *slices_4[1] = { "" };
|
|
|
+ MULTICHECK_SPLIT(s, split, "", true, 0, slices_4, 1);
|
|
|
+ MULTICHECK_SPLIT(s, split, "", false, 0, slices_4, 0);
|
|
|
|
|
|
s = "Mars Jupiter Saturn Uranus";
|
|
|
const char *slices_s[4] = { "Mars", "Jupiter", "Saturn", "Uranus" };
|
|
|
- l = s.split_spaces();
|
|
|
+ Vector<String> l = s.split_spaces();
|
|
|
for (int i = 0; i < l.size(); i++) {
|
|
|
CHECK(l[i] == slices_s[i]);
|
|
|
}
|
|
@@ -644,69 +686,6 @@ TEST_CASE("[String] Splitting") {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-struct test_27_data {
|
|
|
- char const *data;
|
|
|
- char const *part;
|
|
|
- bool expected;
|
|
|
-};
|
|
|
-
|
|
|
-TEST_CASE("[String] Begins with") {
|
|
|
- test_27_data tc[] = {
|
|
|
- // Test cases for true:
|
|
|
- { "res://foobar", "res://", true },
|
|
|
- { "abc", "abc", true },
|
|
|
- { "abc", "", true },
|
|
|
- { "", "", true },
|
|
|
- // Test cases for false:
|
|
|
- { "res", "res://", false },
|
|
|
- { "abcdef", "foo", false },
|
|
|
- { "abc", "ax", false },
|
|
|
- { "", "abc", false }
|
|
|
- };
|
|
|
- size_t count = sizeof(tc) / sizeof(tc[0]);
|
|
|
- bool state = true;
|
|
|
- for (size_t i = 0; i < count; ++i) {
|
|
|
- String s = tc[i].data;
|
|
|
- state = s.begins_with(tc[i].part) == tc[i].expected;
|
|
|
- CHECK_MESSAGE(state, "first check failed at: ", i);
|
|
|
-
|
|
|
- String sb = tc[i].part;
|
|
|
- state = s.begins_with(sb) == tc[i].expected;
|
|
|
- CHECK_MESSAGE(state, "second check failed at: ", i);
|
|
|
- }
|
|
|
-
|
|
|
- // Test "const char *" version also with nullptr.
|
|
|
- String s("foo");
|
|
|
- state = s.begins_with(nullptr) == false;
|
|
|
- CHECK_MESSAGE(state, "nullptr check failed");
|
|
|
-
|
|
|
- String empty("");
|
|
|
- state = empty.begins_with(nullptr) == false;
|
|
|
- CHECK_MESSAGE(state, "nullptr check with empty string failed");
|
|
|
-}
|
|
|
-
|
|
|
-TEST_CASE("[String] Ends with") {
|
|
|
- test_27_data tc[] = {
|
|
|
- // test cases for true:
|
|
|
- { "res://foobar", "foobar", true },
|
|
|
- { "abc", "abc", true },
|
|
|
- { "abc", "", true },
|
|
|
- { "", "", true },
|
|
|
- // test cases for false:
|
|
|
- { "res", "res://", false },
|
|
|
- { "", "abc", false },
|
|
|
- { "abcdef", "foo", false },
|
|
|
- { "abc", "xc", false }
|
|
|
- };
|
|
|
- size_t count = sizeof(tc) / sizeof(tc[0]);
|
|
|
- for (size_t i = 0; i < count; ++i) {
|
|
|
- String s = tc[i].data;
|
|
|
- String sb = tc[i].part;
|
|
|
- bool state = s.ends_with(sb) == tc[i].expected;
|
|
|
- CHECK_MESSAGE(state, "check failed at: ", i);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
TEST_CASE("[String] format") {
|
|
|
const String value_format = "red=\"$red\" green=\"$green\" blue=\"$blue\" alpha=\"$alpha\"";
|
|
|
|
|
@@ -1498,39 +1477,62 @@ TEST_CASE("[String] Cyrillic to_lower()") {
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[String] Count and countn functionality") {
|
|
|
-#define COUNT_TEST(x) \
|
|
|
- { \
|
|
|
- bool success = x; \
|
|
|
- state = state && success; \
|
|
|
- }
|
|
|
+ String s = String("");
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "Test", 0);
|
|
|
|
|
|
- bool state = true;
|
|
|
+ s = "Test";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "", 0);
|
|
|
|
|
|
- COUNT_TEST(String("").count("Test") == 0);
|
|
|
- COUNT_TEST(String("Test").count("") == 0);
|
|
|
- COUNT_TEST(String("Test").count("test") == 0);
|
|
|
- COUNT_TEST(String("Test").count("TEST") == 0);
|
|
|
- COUNT_TEST(String("TEST").count("TEST") == 1);
|
|
|
- COUNT_TEST(String("Test").count("Test") == 1);
|
|
|
- COUNT_TEST(String("aTest").count("Test") == 1);
|
|
|
- COUNT_TEST(String("Testa").count("Test") == 1);
|
|
|
- COUNT_TEST(String("TestTestTest").count("Test") == 3);
|
|
|
- COUNT_TEST(String("TestTestTest").count("TestTest") == 1);
|
|
|
- COUNT_TEST(String("TestGodotTestGodotTestGodot").count("Test") == 3);
|
|
|
-
|
|
|
- COUNT_TEST(String("TestTestTestTest").count("Test", 4, 8) == 1);
|
|
|
- COUNT_TEST(String("TestTestTestTest").count("Test", 4, 12) == 2);
|
|
|
- COUNT_TEST(String("TestTestTestTest").count("Test", 4, 16) == 3);
|
|
|
- COUNT_TEST(String("TestTestTestTest").count("Test", 4) == 3);
|
|
|
-
|
|
|
- COUNT_TEST(String("Test").countn("test") == 1);
|
|
|
- COUNT_TEST(String("Test").countn("TEST") == 1);
|
|
|
- COUNT_TEST(String("testTest-Testatest").countn("tEst") == 4);
|
|
|
- COUNT_TEST(String("testTest-TeStatest").countn("tEsT", 4, 16) == 2);
|
|
|
+ s = "Test";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "test", 0);
|
|
|
|
|
|
- CHECK(state);
|
|
|
+ s = "Test";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "TEST", 0);
|
|
|
+
|
|
|
+ s = "TEST";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "TEST", 1);
|
|
|
+
|
|
|
+ s = "Test";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "Test", 1);
|
|
|
+
|
|
|
+ s = "aTest";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "Test", 1);
|
|
|
+
|
|
|
+ s = "Testa";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "Test", 1);
|
|
|
+
|
|
|
+ s = "TestTestTest";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "Test", 3);
|
|
|
+
|
|
|
+ s = "TestTestTest";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "TestTest", 1);
|
|
|
+
|
|
|
+ s = "TestGodotTestGodotTestGodot";
|
|
|
+ MULTICHECK_STRING_EQ(s, count, "Test", 3);
|
|
|
+
|
|
|
+ s = "TestTestTestTest";
|
|
|
+ MULTICHECK_STRING_INT_INT_EQ(s, count, "Test", 4, 8, 1);
|
|
|
+
|
|
|
+ s = "TestTestTestTest";
|
|
|
+ MULTICHECK_STRING_INT_INT_EQ(s, count, "Test", 4, 12, 2);
|
|
|
+
|
|
|
+ s = "TestTestTestTest";
|
|
|
+ MULTICHECK_STRING_INT_INT_EQ(s, count, "Test", 4, 16, 3);
|
|
|
+
|
|
|
+ s = "TestTestTestTest";
|
|
|
+ MULTICHECK_STRING_INT_EQ(s, count, "Test", 4, 3);
|
|
|
+
|
|
|
+ s = "Test";
|
|
|
+ MULTICHECK_STRING_EQ(s, countn, "test", 1);
|
|
|
+
|
|
|
+ s = "Test";
|
|
|
+ MULTICHECK_STRING_EQ(s, countn, "TEST", 1);
|
|
|
+
|
|
|
+ s = "testTest-Testatest";
|
|
|
+ MULTICHECK_STRING_EQ(s, countn, "tEst", 4);
|
|
|
|
|
|
-#undef COUNT_TEST
|
|
|
+ s = "testTest-TeStatest";
|
|
|
+ MULTICHECK_STRING_INT_INT_EQ(s, countn, "tEsT", 4, 16, 2);
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[String] Bigrams") {
|
|
@@ -1703,9 +1705,19 @@ TEST_CASE("[String] Strip edges") {
|
|
|
|
|
|
TEST_CASE("[String] Trim") {
|
|
|
String s = "aaaTestbbb";
|
|
|
- CHECK(s.trim_prefix("aaa") == "Testbbb");
|
|
|
- CHECK(s.trim_suffix("bbb") == "aaaTest");
|
|
|
- CHECK(s.trim_suffix("Test") == s);
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_prefix, "aaa", "Testbbb");
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_prefix, "Test", s);
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_prefix, "", s);
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_prefix, "aaaTestbbb", "");
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_prefix, "bbb", s);
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_prefix, "AAA", s);
|
|
|
+
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_suffix, "bbb", "aaaTest");
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_suffix, "Test", s);
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_suffix, "", s);
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_suffix, "aaaTestbbb", "");
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_suffix, "aaa", s);
|
|
|
+ MULTICHECK_STRING_EQ(s, trim_suffix, "BBB", s);
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[String] Right/Left") {
|