Serenity Operating System
1/*
2 * Copyright (c) 2022, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <AK/String.h>
8#include <AK/Vector.h>
9#include <LibTest/TestCase.h>
10#include <LibTextCodec/Decoder.h>
11
12TEST_CASE(test_utf8_decode)
13{
14 auto decoder = TextCodec::UTF8Decoder();
15 // Bytes for U+1F600 GRINNING FACE
16 auto test_string = "\xf0\x9f\x98\x80"sv;
17
18 Vector<u32> processed_code_points;
19 MUST(decoder.process(test_string, [&](u32 code_point) {
20 return processed_code_points.try_append(code_point);
21 }));
22 EXPECT(processed_code_points.size() == 1);
23 EXPECT(processed_code_points[0] == 0x1F600);
24
25 EXPECT(MUST(decoder.to_utf8(test_string)) == test_string);
26}
27
28TEST_CASE(test_utf16be_decode)
29{
30 auto decoder = TextCodec::UTF16BEDecoder();
31 // This is the output of `python3 -c "print('säk😀'.encode('utf-16be'))"`.
32 auto test_string = "\x00s\x00\xe4\x00k\xd8=\xde\x00"sv;
33
34 Vector<u32> processed_code_points;
35 MUST(decoder.process(test_string, [&](u32 code_point) {
36 return processed_code_points.try_append(code_point);
37 }));
38 EXPECT(processed_code_points.size() == 4);
39 EXPECT(processed_code_points[0] == 0x73);
40 EXPECT(processed_code_points[1] == 0xE4);
41 EXPECT(processed_code_points[2] == 0x6B);
42 EXPECT(processed_code_points[3] == 0x1F600);
43}
44
45TEST_CASE(test_utf16le_decode)
46{
47 auto decoder = TextCodec::UTF16LEDecoder();
48 // This is the output of `python3 -c "print('säk😀'.encode('utf-16le'))"`.
49 auto test_string = "s\x00\xe4\x00k\x00=\xd8\x00\xde"sv;
50
51 Vector<u32> processed_code_points;
52 MUST(decoder.process(test_string, [&](u32 code_point) {
53 return processed_code_points.try_append(code_point);
54 }));
55 EXPECT(processed_code_points.size() == 4);
56 EXPECT(processed_code_points[0] == 0x73);
57 EXPECT(processed_code_points[1] == 0xE4);
58 EXPECT(processed_code_points[2] == 0x6B);
59 EXPECT(processed_code_points[3] == 0x1F600);
60}