#include "cru/base/String.h" #include "cru/base/StringUtil.h" #include using cru::Index; using cru::k_invalid_code_point; TEST_CASE("StringUtil Utf8NextCodePoint", "[string]") { using cru::Utf8NextCodePoint; std::string_view text = "aπ你🤣!"; Index current = 0; REQUIRE(Utf8NextCodePoint(text.data(), text.size(), current, ¤t) == 0x0061); REQUIRE(Utf8NextCodePoint(text.data(), text.size(), current, ¤t) == 0x03C0); REQUIRE(Utf8NextCodePoint(text.data(), text.size(), current, ¤t) == 0x4F60); REQUIRE(Utf8NextCodePoint(text.data(), text.size(), current, ¤t) == 0x1F923); REQUIRE(Utf8NextCodePoint(text.data(), text.size(), current, ¤t) == 0x0021); REQUIRE(Utf8NextCodePoint(text.data(), text.size(), current, ¤t) == k_invalid_code_point); REQUIRE(current == static_cast(text.size())); } TEST_CASE("StringUtil Utf16NextCodePoint", "[string]") { using cru::Utf16NextCodePoint; std::u16string_view text = u"aπ你🤣!"; Index current = 0; REQUIRE(Utf16NextCodePoint(text.data(), text.size(), current, ¤t) == 0x0061); REQUIRE(Utf16NextCodePoint(text.data(), text.size(), current, ¤t) == 0x03C0); REQUIRE(Utf16NextCodePoint(text.data(), text.size(), current, ¤t) == 0x4F60); REQUIRE(Utf16NextCodePoint(text.data(), text.size(), current, ¤t) == 0x1F923); REQUIRE(Utf16NextCodePoint(text.data(), text.size(), current, ¤t) == 0x0021); REQUIRE(Utf16NextCodePoint(text.data(), text.size(), current, ¤t) == k_invalid_code_point); REQUIRE(current == static_cast(text.size())); } TEST_CASE("StringUtil Utf16PreviousCodePoint", "[string]") { using cru::Utf16PreviousCodePoint; std::u16string_view text = u"aπ你🤣!"; Index current = text.size(); REQUIRE(Utf16PreviousCodePoint(text.data(), text.size(), current, ¤t) == 0x0021); REQUIRE(Utf16PreviousCodePoint(text.data(), text.size(), current, ¤t) == 0x1F923); REQUIRE(Utf16PreviousCodePoint(text.data(), text.size(), current, ¤t) == 0x4F60); REQUIRE(Utf16PreviousCodePoint(text.data(), text.size(), current, ¤t) == 0x03C0); REQUIRE(Utf16PreviousCodePoint(text.data(), text.size(), current, ¤t) == 0x0061); REQUIRE(Utf16PreviousCodePoint(text.data(), text.size(), current, ¤t) == k_invalid_code_point); REQUIRE(current == 0); } TEST_CASE("StringUtil Utf8CodePointIterator", "[string]") { using cru::Utf8CodePointIterator; std::string_view text = "aπ你🤣!"; std::vector code_points; for (auto cp : Utf8CodePointIterator(text.data(), text.size())) { code_points.push_back(cp); } std::vector expected_code_points{0x0061, 0x03C0, 0x4F60, 0x1F923, 0x0021}; REQUIRE(code_points == expected_code_points); } TEST_CASE("StringUtil Utf16CodePointIterator", "[string]") { using cru::Utf16CodePointIterator; std::u16string_view text = u"aπ你🤣!"; std::vector code_points; for (auto cp : Utf16CodePointIterator(text.data(), text.size())) { code_points.push_back(cp); } std::vector expected_code_points{0x0061, 0x03C0, 0x4F60, 0x1F923, 0x0021}; REQUIRE(code_points == expected_code_points); } // TEST(WinString, IndexUtf8ToUtf16) { // using cru::platform::win::IndexUtf8ToUtf16; // std::string_view utf8_string = "aπ你🤣!"; // std::wstring_view utf16_string = L"aπ你🤣!"; // REQUIRE(IndexUtf8ToUtf16(utf8_string, 0, utf16_string), 0); // REQUIRE(IndexUtf8ToUtf16(utf8_string, 1, utf16_string), 1); // REQUIRE(IndexUtf8ToUtf16(utf8_string, 3, utf16_string), 2); // REQUIRE(IndexUtf8ToUtf16(utf8_string, 6, utf16_string), 3); // REQUIRE(IndexUtf8ToUtf16(utf8_string, 10, utf16_string), 5); // REQUIRE(IndexUtf8ToUtf16(utf8_string, 11, utf16_string), 6); // } // TEST(WinString, IndexUtf16ToUtf8) { // using cru::platform::win::IndexUtf16ToUtf8; // std::string_view utf8_string = "aπ你🤣!"; // std::wstring_view utf16_string = L"aπ你🤣!"; // REQUIRE(IndexUtf16ToUtf8(utf16_string, 0, utf8_string), 0); // REQUIRE(IndexUtf16ToUtf8(utf16_string, 1, utf8_string), 1); // REQUIRE(IndexUtf16ToUtf8(utf16_string, 2, utf8_string), 3); // REQUIRE(IndexUtf16ToUtf8(utf16_string, 3, utf8_string), 6); // REQUIRE(IndexUtf16ToUtf8(utf16_string, 5, utf8_string), 10); // REQUIRE(IndexUtf16ToUtf8(utf16_string, 6, utf8_string), 11); // }