Tests/LibTextCodec: Do not refer to concrete encoders/decoders

Which allows for their removal from the header file once the
implementation is ported to rust.
This commit is contained in:
Shannon Booth 2026-06-19 23:47:01 +02:00 committed by Andreas Kling
parent c982385ffe
commit 73ec316214
2 changed files with 20 additions and 23 deletions

View file

@ -33,16 +33,13 @@ static Vector<u32> process_code_points(TextCodec::Decoder& decoder, StringView i
TEST_CASE(test_utf8_decode)
{
auto decoder = TextCodec::UTF8Decoder();
auto& decoder = decoder_for("UTF-8"sv);
// Bytes for U+1F600 GRINNING FACE
auto test_string = "\xf0\x9f\x98\x80"sv;
EXPECT(decoder.validate(test_string));
Vector<u32> processed_code_points;
MUST(decoder.process(test_string, [&](u32 code_point) {
return processed_code_points.try_append(code_point);
}));
auto processed_code_points = process_code_points(decoder, test_string);
EXPECT(processed_code_points.size() == 1);
EXPECT(processed_code_points[0] == 0x1F600);
@ -51,7 +48,7 @@ TEST_CASE(test_utf8_decode)
TEST_CASE(test_utf8_process_code_points)
{
auto decoder = TextCodec::UTF8Decoder();
auto& decoder = decoder_for("UTF-8"sv);
auto test_string = "A\xf0\x9f\x98\x80"sv;
EXPECT_EQ(process_code_points(decoder, test_string), (Vector<u32> { 0x41, 0x1F600 }));
@ -59,7 +56,7 @@ TEST_CASE(test_utf8_process_code_points)
TEST_CASE(test_utf8_process_code_points_replaces_surrogates)
{
auto decoder = TextCodec::UTF8Decoder();
auto& decoder = decoder_for("UTF-8"sv);
auto utf8_encoded_surrogate_bytes = Vector<u8> { 0xed, 0xa0, 0x80 };
auto utf8_encoded_surrogate = StringView(bytes(utf8_encoded_surrogate_bytes));
@ -70,7 +67,7 @@ TEST_CASE(test_utf8_process_code_points_replaces_surrogates)
TEST_CASE(test_utf8_process_code_points_replaces_truncated_tail_as_single_error)
{
auto decoder = TextCodec::UTF8Decoder();
auto& decoder = decoder_for("UTF-8"sv);
auto truncated_tail_bytes = Vector<u8> { 0xf0, 0x9f, 0x98 };
auto truncated_tail = StringView(bytes(truncated_tail_bytes));
@ -81,7 +78,7 @@ TEST_CASE(test_utf8_process_code_points_replaces_truncated_tail_as_single_error)
TEST_CASE(test_utf8_process_code_points_replaces_overlong_sequences)
{
auto decoder = TextCodec::UTF8Decoder();
auto& decoder = decoder_for("UTF-8"sv);
auto overlong_null_bytes = Vector<u8> { 0xc0, 0x80 };
auto overlong_null = StringView(bytes(overlong_null_bytes));
@ -92,7 +89,7 @@ TEST_CASE(test_utf8_process_code_points_replaces_overlong_sequences)
TEST_CASE(test_utf8_process_code_points_restores_invalid_second_byte)
{
auto decoder = TextCodec::UTF8Decoder();
auto& decoder = decoder_for("UTF-8"sv);
auto overlong_three_byte_sequence_bytes = Vector<u8> { 0xe0, 0x80, 0x80 };
auto overlong_three_byte_sequence = StringView(bytes(overlong_three_byte_sequence_bytes));
auto out_of_range_four_byte_sequence_bytes = Vector<u8> { 0xf4, 0x90, 0x80, 0x80 };
@ -109,7 +106,7 @@ TEST_CASE(test_utf8_process_code_points_restores_invalid_second_byte)
TEST_CASE(test_utf16be_decode)
{
auto decoder = TextCodec::UTF16BEDecoder();
auto& decoder = decoder_for("UTF-16BE"sv);
// This is the output of `python3 -c "print('säk😀'.encode('utf-16be'))"`.
auto test_string = "\x00s\x00\xe4\x00k\xd8=\xde\x00"sv;
@ -120,7 +117,7 @@ TEST_CASE(test_utf16be_decode)
TEST_CASE(test_utf16be_process_code_points)
{
auto decoder = TextCodec::UTF16BEDecoder();
auto& decoder = decoder_for("UTF-16BE"sv);
EXPECT_EQ(process_code_points(decoder, StringView(bytes({ 0xfe, 0xff, 0x00, 'A', 0xd8, 0x3d, 0xde, 0x00 }))), (Vector<u32> { 0x41, 0x1F600 }));
EXPECT_EQ(process_code_points(decoder, StringView(bytes({ 0xd8, 0x3d, 0x00, 'A', 0xde, 0x00 }))), (Vector<u32> { 0xfffd, 0x41, 0xfffd }));
@ -241,7 +238,7 @@ TEST_CASE(test_streaming_decoder_shift_jis_tail)
TEST_CASE(test_utf16le_decode)
{
auto decoder = TextCodec::UTF16LEDecoder();
auto& decoder = decoder_for("UTF-16LE"sv);
// This is the output of `python3 -c "print('säk😀'.encode('utf-16le'))"`.
auto test_string = "s\x00\xe4\x00k\x00=\xd8\x00\xde"sv;
@ -252,7 +249,7 @@ TEST_CASE(test_utf16le_decode)
TEST_CASE(test_utf16le_process_code_points)
{
auto decoder = TextCodec::UTF16LEDecoder();
auto& decoder = decoder_for("UTF-16LE"sv);
EXPECT_EQ(process_code_points(decoder, StringView(bytes({ 0xff, 0xfe, 'A', 0x00, 0x3d, 0xd8, 0x00, 0xde }))), (Vector<u32> { 0x41, 0x1F600 }));
EXPECT_EQ(process_code_points(decoder, StringView(bytes({ 0x3d, 0xd8, 'A', 0x00, 0x00, 0xde }))), (Vector<u32> { 0xfffd, 0x41, 0xfffd }));

View file

@ -9,7 +9,7 @@
TEST_CASE(test_utf8_encode)
{
TextCodec::UTF8Encoder encoder;
auto& encoder = TextCodec::encoder_for_exact_name("UTF-8"sv).value();
// Unicode character U+1F600 GRINNING FACE
auto test_string = "\U0001F600"sv;
@ -27,7 +27,7 @@ TEST_CASE(test_utf8_encode)
TEST_CASE(test_euc_jp_encoder)
{
TextCodec::EUCJPEncoder encoder;
auto& encoder = TextCodec::encoder_for_exact_name("EUC-JP"sv).value();
// U+A5 Yen Sign
// U+3088 Hiragana Letter Yo
// U+30C4 Katakana Letter Tu
@ -48,7 +48,7 @@ TEST_CASE(test_euc_jp_encoder)
TEST_CASE(test_iso_2022_jp_encoder)
{
TextCodec::ISO2022JPEncoder encoder;
auto& encoder = TextCodec::encoder_for_exact_name("ISO-2022-JP"sv).value();
// U+A5 Yen Sign
// U+3088 Hiragana Letter Yo
// U+30C4 Katakana Letter Tu
@ -78,7 +78,7 @@ TEST_CASE(test_iso_2022_jp_encoder)
TEST_CASE(test_shift_jis_encoder)
{
TextCodec::ShiftJISEncoder encoder;
auto& encoder = TextCodec::encoder_for_exact_name("Shift_JIS"sv).value();
// U+A5 Yen Sign
// U+3088 Hiragana Letter Yo
// U+30C4 Katakana Letter Tu
@ -99,7 +99,7 @@ TEST_CASE(test_shift_jis_encoder)
TEST_CASE(test_euc_kr_encoder)
{
TextCodec::EUCKREncoder encoder;
auto& encoder = TextCodec::encoder_for_exact_name("EUC-KR"sv).value();
// U+B29F Hangul Syllable Neulh
// U+7C97 CJK Unified Ideograph-7C97
auto test_string = "\U0000B29F\U00007C97"sv;
@ -118,7 +118,7 @@ TEST_CASE(test_euc_kr_encoder)
TEST_CASE(test_big5_encoder)
{
TextCodec::Big5Encoder encoder;
auto& encoder = TextCodec::encoder_for_exact_name("Big5"sv).value();
// U+A7 Section Sign
// U+70D7 CJK Unified Ideograph-70D7
auto test_string = "\U000000A7\U000070D7"sv;
@ -137,7 +137,7 @@ TEST_CASE(test_big5_encoder)
TEST_CASE(test_gb18030_encoder)
{
TextCodec::GB18030Encoder encoder;
auto& encoder = TextCodec::encoder_for_exact_name("gb18030"sv).value();
// U+20AC Euro Sign
// U+E4C5 Private Use Area
auto test_string = "\U000020AC\U0000E4C5"sv;
@ -156,10 +156,10 @@ TEST_CASE(test_gb18030_encoder)
TEST_CASE(test_windows1252_encoder)
{
auto encoder = TextCodec::encoder_for_exact_name("windows-1252"sv);
auto& encoder = TextCodec::encoder_for_exact_name("windows-1252"sv).value();
auto test_string = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏfoo€"sv;
Vector<u8> processed_bytes;
MUST(encoder.value().process(
MUST(encoder.process(
Utf8View(test_string),
[&](u8 byte) { dbgln("{}", processed_bytes.size()); return processed_bytes.try_append(byte); },
[&](u32) -> ErrorOr<void> { EXPECT(false); return {}; }));