Revamp sf::String tests

This commit is contained in:
Chris Thrasher 2025-02-03 11:45:40 -07:00
parent 505fe43d5a
commit 4c632e5775

View File

@ -197,6 +197,7 @@ TEST_CASE("[System] sf::U8StringCharTraits")
TEST_CASE("[System] sf::String")
{
using namespace std::string_literals;
using namespace std::string_view_literals;
SECTION("Type traits")
{
@ -242,7 +243,6 @@ TEST_CASE("[System] sf::String")
SECTION("ANSI C string constructor")
{
SECTION("Nullptr")
{
const sf::String string = static_cast<char*>(nullptr);
CHECK(std::string(string).empty());
@ -256,18 +256,16 @@ TEST_CASE("[System] sf::String")
CHECK(string.isEmpty());
CHECK(string.getData() != nullptr);
}
SECTION("Non-empty string")
{
const sf::String string = "def";
CHECK(std::string(string) == "def"s);
CHECK(std::wstring(string) == L"def"s);
CHECK(string.toAnsiString() == "def"s);
CHECK(string.toWideString() == L"def"s);
CHECK(string.toUtf8() == sf::U8String{'d', 'e', 'f'});
CHECK(string.toUtf16() == u"def"s);
CHECK(string.toUtf32() == U"def"s);
CHECK(string.getSize() == 3);
const sf::String string = "Escargot";
CHECK(std::string(string) == "Escargot"s);
CHECK(std::wstring(string) == L"Escargot"s);
CHECK(string.toAnsiString() == "Escargot"s);
CHECK(string.toWideString() == L"Escargot"s);
CHECK(string.toUtf8() == sf::U8String{'E', 's', 'c', 'a', 'r', 'g', 'o', 't'});
CHECK(string.toUtf16() == u"Escargot"s);
CHECK(string.toUtf32() == U"Escargot"s);
CHECK(string.getSize() == 8);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
@ -275,37 +273,51 @@ TEST_CASE("[System] sf::String")
SECTION("ANSI string constructor")
{
const sf::String string = "ghi"s;
CHECK(std::string(string) == "ghi"s);
CHECK(std::wstring(string) == L"ghi"s);
CHECK(string.toAnsiString() == "ghi"s);
CHECK(string.toWideString() == L"ghi"s);
CHECK(string.toUtf8() == sf::U8String{'g', 'h', 'i'});
CHECK(string.toUtf16() == u"ghi"s);
CHECK(string.toUtf32() == U"ghi"s);
CHECK(string.getSize() == 3);
const sf::String string = "Csiga"s;
CHECK(std::string(string) == "Csiga"s);
CHECK(std::wstring(string) == L"Csiga"s);
CHECK(string.toAnsiString() == "Csiga"s);
CHECK(string.toWideString() == L"Csiga"s);
CHECK(string.toUtf8() == sf::U8String{'C', 's', 'i', 'g', 'a'});
CHECK(string.toUtf16() == u"Csiga"s);
CHECK(string.toUtf32() == U"Csiga"s);
CHECK(string.getSize() == 5);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
SECTION("Wide character constructor")
{
const sf::String string = L'\xFA';
CHECK(std::string(string) == select("\xFA"s, "\0"s));
CHECK(std::wstring(string) == L"\xFA"s);
CHECK(string.toAnsiString() == select("\xFA"s, "\0"s));
CHECK(string.toWideString() == L"\xFA"s);
CHECK(string.toUtf8() == sf::U8String{0xC3, 0xBA});
CHECK(string.toUtf16() == u"\xFA"s);
CHECK(string.toUtf32() == U"\xFA"s);
CHECK(string.getSize() == 1);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
{
const sf::String string = L'ú';
CHECK(std::string(string) == select("\xFA"s, "\0"s));
CHECK(std::wstring(string) == L"ú"s);
CHECK(string.toAnsiString() == select("\xFA"s, "\0"s));
CHECK(string.toWideString() == L"ú"s);
CHECK(string.toUtf8() == sf::U8String{0xC3, 0xBA});
CHECK(string.toUtf16() == u"ú"s);
CHECK(string.toUtf32() == U"ú"s);
CHECK(string.getSize() == 1);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
{
const sf::String string = L'Ǻ';
CHECK(std::string(string) == "\0"s);
CHECK(std::wstring(string) == L"Ǻ"s);
CHECK(string.toAnsiString() == "\0"s);
CHECK(string.toWideString() == L"Ǻ"s);
CHECK(string.toUtf8() == sf::U8String{0xC7, 0xBA});
CHECK(string.toUtf16() == u"Ǻ"s);
CHECK(string.toUtf32() == U"Ǻ"s);
CHECK(string.getSize() == 1);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
}
SECTION("Wide C string constructor")
{
SECTION("Nullptr")
{
const sf::String string = static_cast<wchar_t*>(nullptr);
CHECK(std::string(string).empty());
@ -319,18 +331,17 @@ TEST_CASE("[System] sf::String")
CHECK(string.isEmpty());
CHECK(string.getData() != nullptr);
}
SECTION("Non-empty string")
{
const sf::String string = L"j\xFAl";
CHECK(std::string(string) == select("j\xFAl"s, "j\0l"s));
CHECK(std::wstring(string) == L"j\xFAl"s);
CHECK(string.toAnsiString() == select("j\xFAl"s, "j\0l"s));
CHECK(string.toWideString() == L"j\xFAl"s);
CHECK(string.toUtf8() == sf::U8String{'j', 0xC3, 0xBA, 'l'});
CHECK(string.toUtf16() == u"j\xFAl"s);
CHECK(string.toUtf32() == U"j\xFAl"s);
CHECK(string.getSize() == 3);
const sf::String string = L"Улитка";
CHECK(std::string(string) == "\0\0\0\0\0\0"s);
CHECK(std::wstring(string) == L"Улитка"s);
CHECK(string.toAnsiString() == "\0\0\0\0\0\0"s);
CHECK(string.toWideString() == L"Улитка"s);
CHECK(string.toUtf8() ==
sf::U8String{0xD0, 0xA3, 0xD0, 0xBB, 0xD0, 0xB8, 0xD1, 0x82, 0xD0, 0xBA, 0xD0, 0xB0});
CHECK(string.toUtf16() == u"Улитка"s);
CHECK(string.toUtf32() == U"Улитка"s);
CHECK(string.getSize() == 6);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
@ -338,15 +349,15 @@ TEST_CASE("[System] sf::String")
SECTION("Wide string constructor")
{
const sf::String string = L"mno\xFA"s;
CHECK(std::string(string) == select("mno\xFA"s, "mno\0"s));
CHECK(std::wstring(string) == L"mno\xFA"s);
CHECK(string.toAnsiString() == select("mno\xFA"s, "mno\0"s));
CHECK(string.toWideString() == L"mno\xFA"s);
CHECK(string.toUtf8() == sf::U8String{'m', 'n', 'o', 0xC3, 0XBA});
CHECK(string.toUtf16() == u"mno\xFA"s);
CHECK(string.toUtf32() == U"mno\xFA"s);
CHECK(string.getSize() == 4);
const sf::String string = L"Полжав"s;
CHECK(std::string(string) == "\0\0\0\0\0\0"s);
CHECK(std::wstring(string) == L"Полжав"s);
CHECK(string.toAnsiString() == "\0\0\0\0\0\0"s);
CHECK(string.toWideString() == L"Полжав"s);
CHECK(string.toUtf8() == sf::U8String{0xD0, 0x9F, 0xD0, 0xBE, 0xD0, 0xBB, 0xD0, 0xB6, 0xD0, 0xB0, 0xD0, 0xB2});
CHECK(string.toUtf16() == u"Полжав"s);
CHECK(string.toUtf32() == U"Полжав"s);
CHECK(string.getSize() == 6);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
@ -368,7 +379,6 @@ TEST_CASE("[System] sf::String")
SECTION("UTF-32 C string constructor")
{
SECTION("Nullptr")
{
const sf::String string = static_cast<char32_t*>(nullptr);
CHECK(std::string(string).empty());
@ -382,18 +392,30 @@ TEST_CASE("[System] sf::String")
CHECK(string.isEmpty());
CHECK(string.getData() != nullptr);
}
SECTION("Non-empty string")
{
const sf::String string = U"🐌rs";
CHECK(std::string(string) == "\0rs"s);
CHECK(std::wstring(string) == select(L"rs"s, L"🐌rs"s));
CHECK(string.toAnsiString() == "\0rs"s);
CHECK(string.toWideString() == select(L"rs"s, L"🐌rs"s));
CHECK(string.toUtf8() == sf::U8String{0xF0, 0x9F, 0x90, 0x8C, 'r', 's'});
CHECK(string.toUtf16() == u"🐌rs"s);
CHECK(string.toUtf32() == U"🐌rs"s);
CHECK(string.getSize() == 3);
const sf::String string = U"カタツムリ";
CHECK(std::string(string) == "\0\0\0\0\0"s);
CHECK(std::wstring(string) == L"カタツムリ"s);
CHECK(string.toAnsiString() == "\0\0\0\0\0"s);
CHECK(string.toWideString() == L"カタツムリ"s);
CHECK(string.toUtf8() ==
sf::U8String{0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0x84, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0xAA});
CHECK(string.toUtf16() == u"カタツムリ"s);
CHECK(string.toUtf32() == U"カタツムリ"s);
CHECK(string.getSize() == 5);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
{
const sf::String string = U"🐌🐚";
CHECK(std::string(string) == "\0\0"s);
CHECK(std::wstring(string) == select(L""s, L"🐌🐚"s));
CHECK(string.toAnsiString() == "\0\0"s);
CHECK(string.toWideString() == select(L""s, L"🐌🐚"s));
CHECK(string.toUtf8() == sf::U8String{0xF0, 0x9F, 0x90, 0x8C, 0xF0, 0x9F, 0x90, 0x9A});
CHECK(string.toUtf16() == u"🐌🐚"s);
CHECK(string.toUtf32() == U"🐌🐚"s);
CHECK(string.getSize() == 2);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
@ -401,15 +423,15 @@ TEST_CASE("[System] sf::String")
SECTION("UTF-32 string constructor")
{
const sf::String string = U"tuv🐌"s;
CHECK(std::string(string) == "tuv\0"s);
CHECK(std::wstring(string) == select(L"tuv"s, L"tuv🐌"s));
CHECK(string.toAnsiString() == "tuv\0"s);
CHECK(string.toWideString() == select(L"tuv"s, L"tuv🐌"s));
CHECK(string.toUtf8() == sf::U8String{'t', 'u', 'v', 0xF0, 0x9F, 0x90, 0x8C});
CHECK(string.toUtf16() == u"tuv🐌"s);
CHECK(string.toUtf32() == U"tuv🐌"s);
CHECK(string.getSize() == 4);
const sf::String string = U"گھونگا"s;
CHECK(std::string(string) == "\0\0\0\0\0\0"s);
CHECK(std::wstring(string) == L"گھونگا"s);
CHECK(string.toAnsiString() == "\0\0\0\0\0\0"s);
CHECK(string.toWideString() == L"گھونگا"s);
CHECK(string.toUtf8() == sf::U8String{0xDA, 0xAF, 0xDA, 0xBE, 0xD9, 0x88, 0xD9, 0x86, 0xDA, 0xAF, 0xD8, 0xA7});
CHECK(string.toUtf16() == u"گھونگا"s);
CHECK(string.toUtf32() == U"گھونگا"s);
CHECK(string.getSize() == 6);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
@ -417,7 +439,12 @@ TEST_CASE("[System] sf::String")
SECTION("fromUtf8()")
{
SECTION("Nominal")
{
constexpr std::array<std::uint8_t, 1> characters{251};
const sf::String string = sf::String::fromUtf8(characters.begin(), characters.end());
CHECK(string.getSize() == 1);
CHECK(string[0] == 0);
}
{
constexpr std::array<std::uint8_t, 4> characters{'w', 'x', 'y', 'z'};
const sf::String string = sf::String::fromUtf8(characters.begin(), characters.end());
@ -432,45 +459,85 @@ TEST_CASE("[System] sf::String")
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
SECTION("Insufficient input")
{
constexpr std::array<std::uint8_t, 1> characters{251};
constexpr std::array<std::uint8_t, 4> characters{0xF0, 0x9F, 0x90, 0x8C};
const sf::String string = sf::String::fromUtf8(characters.begin(), characters.end());
constexpr char32_t defaultReplacementCharacter = 0;
CHECK(std::string(string) == "\0"s);
CHECK(std::wstring(string) == select(L""s, L"🐌"s));
CHECK(string.toAnsiString() == "\0"s);
CHECK(string.toWideString() == select(L""s, L"🐌"s));
CHECK(string.toUtf8() == sf::U8String{0xF0, 0x9F, 0x90, 0x8C});
CHECK(string.toUtf16() == u"🐌"s);
CHECK(string.toUtf32() == U"🐌"s);
CHECK(string.getSize() == 1);
CHECK(string[0] == defaultReplacementCharacter);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
}
SECTION("fromUtf16()")
{
constexpr std::array<char16_t, 4> characters{0xF1, 'x', 'y', 'z'};
const sf::String string = sf::String::fromUtf16(characters.begin(), characters.end());
CHECK(std::string(string) == select("\xF1xyz"s, "\0xyz"s));
CHECK(std::wstring(string) == L"\xF1xyz"s);
CHECK(string.toAnsiString() == select("\xF1xyz"s, "\0xyz"s));
CHECK(string.toWideString() == L"\xF1xyz"s);
CHECK(string.toUtf8() == sf::U8String{0xC3, 0xB1, 'x', 'y', 'z'});
CHECK(string.toUtf16() == u"\xF1xyz"s);
CHECK(string.toUtf32() == U"\xF1xyz"s);
CHECK(string.getSize() == 4);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
{
constexpr std::u16string_view characters = u"SFML!"sv;
const sf::String string = sf::String::fromUtf16(characters.begin(), characters.end());
CHECK(std::string(string) == "SFML!"s);
CHECK(std::wstring(string) == L"SFML!"s);
CHECK(string.toAnsiString() == "SFML!"s);
CHECK(string.toWideString() == L"SFML!"s);
CHECK(string.toUtf8() == sf::U8String{'S', 'F', 'M', 'L', '!'});
CHECK(string.toUtf16() == u"SFML!"s);
CHECK(string.toUtf32() == U"SFML!"s);
CHECK(string.getSize() == 5);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
{
constexpr std::u16string_view characters = u"piñata"sv;
const sf::String string = sf::String::fromUtf16(characters.begin(), characters.end());
CHECK(std::string(string) == select("pi\xF1"
"ata"s,
"pi\0ata"s));
CHECK(std::wstring(string) == L"piñata"s);
CHECK(string.toAnsiString() == select("pi\xF1"
"ata"s,
"pi\0ata"s));
CHECK(string.toWideString() == L"piñata"s);
CHECK(string.toUtf8() == sf::U8String{'p', 'i', 0xC3, 0xB1, 'a', 't', 'a'});
CHECK(string.toUtf16() == u"piñata"s);
CHECK(string.toUtf32() == U"piñata"s);
CHECK(string.getSize() == 6);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
{
constexpr std::u16string_view characters = u"달팽이"sv;
const sf::String string = sf::String::fromUtf16(characters.begin(), characters.end());
CHECK(std::string(string) == "\0\0\0"s);
CHECK(std::wstring(string) == L"달팽이"s);
CHECK(string.toAnsiString() == "\0\0\0"s);
CHECK(string.toWideString() == L"달팽이"s);
CHECK(string.toUtf8() == sf::U8String{0xEB, 0x8B, 0xAC, 0xED, 0x8C, 0xBD, 0xEC, 0x9D, 0xB4});
CHECK(string.toUtf16() == u"달팽이"s);
CHECK(string.toUtf32() == U"달팽이"s);
CHECK(string.getSize() == 3);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
}
SECTION("fromUtf32()")
{
constexpr std::array<char32_t, 4> characters{'w', U'🐌', 'y', 'z'};
const sf::String string = sf::String::fromUtf32(characters.begin(), characters.end());
CHECK(std::string(string) == "w\0yz"s);
CHECK(std::wstring(string) == select(L"wyz"s, L"w🐌yz"s));
CHECK(string.toAnsiString() == "w\0yz"s);
CHECK(string.toWideString() == select(L"wyz"s, L"w🐌yz"s));
CHECK(string.toUtf8() == sf::U8String{'w', 0xF0, 0x9F, 0x90, 0x8C, 'y', 'z'});
CHECK(string.toUtf16() == u"w🐌yz"s);
CHECK(string.toUtf32() == U"w🐌yz"s);
CHECK(string.getSize() == 4);
constexpr std::u32string_view characters = U"👍+👎=🤷"sv;
const sf::String string = sf::String::fromUtf32(characters.begin(), characters.end());
CHECK(std::string(string) == "\0+\0=\0"s);
CHECK(std::wstring(string) == select(L"+="s, L"👍+👎=🤷"s));
CHECK(string.toAnsiString() == "\0+\0=\0"s);
CHECK(string.toWideString() == select(L"+="s, L"👍+👎=🤷"s));
CHECK(string.toUtf8() ==
sf::U8String{0xF0, 0x9F, 0x91, 0x8D, '+', 0xF0, 0x9F, 0x91, 0x8E, '=', 0xF0, 0x9F, 0xA4, 0xB7});
CHECK(string.toUtf16() == u"👍+👎=🤷"s);
CHECK(string.toUtf32() == U"👍+👎=🤷"s);
CHECK(string.getSize() == 5);
CHECK(!string.isEmpty());
CHECK(string.getData() != nullptr);
}
@ -479,7 +546,7 @@ TEST_CASE("[System] sf::String")
{
sf::String string("you'll never guess what happens when you call clear()");
string.clear();
CHECK(string == sf::String());
CHECK(string.isEmpty());
CHECK(string.getSize() == 0);
}