Serenity Operating System
at master 49 lines 1.8 kB view raw
1/* 2 * Copyright (c) 2021, Luke Wilde <lukew@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <AK/CharacterTypes.h> 8#include <LibIMAP/QuotedPrintable.h> 9#include <LibTest/TestCase.h> 10 11TEST_CASE(test_decode) 12{ 13 auto decode_equal = [](StringView input, StringView expected) { 14 auto decoded = MUST(IMAP::decode_quoted_printable(input)); 15 EXPECT(decoded.bytes() == expected.bytes()); 16 }; 17 18 auto decode_equal_byte_buffer = [](StringView input, StringView expected) { 19 auto decoded = MUST(IMAP::decode_quoted_printable(input)); 20 EXPECT(decoded.bytes() == expected.bytes()); 21 }; 22 23 decode_equal("hello world"sv, "hello world"sv); 24 decode_equal("=3D"sv, "="sv); 25 decode_equal("hello=\r\n world"sv, "hello world"sv); 26 decode_equal("=68=65=6C=6C=6F=20=\r\n=77=6F=72=6C=64"sv, "hello world"sv); 27 28 // Doesn't mistake hex sequences without a preceding '=' as an escape sequence. 29 decode_equal("4A=4B=4C4D"sv, "4AKL4D"sv); 30 31 // Allows lowercase escape sequences. 32 decode_equal("=4a=4b=4c=4d=4e=4f"sv, "JKLMNO"sv); 33 34 // Bytes for U+1F41E LADY BEETLE 35 decode_equal_byte_buffer("=F0=9F=90=9E"sv, "\xF0\x9F\x90\x9E"sv); 36 37 // Illegal characters. If these aren't escaped, they are simply ignored. 38 // Illegal characters are: 39 // - ASCII control bytes that aren't tab, carriage return or new line 40 // - Any byte above 0x7E 41 StringBuilder illegal_character_builder; 42 for (u16 byte = 0; byte <= 0xFF; ++byte) { 43 if (byte > 0x7E || (is_ascii_control(byte) && byte != '\t' && byte != '\r' && byte != '\n')) 44 illegal_character_builder.append(byte); 45 } 46 47 auto illegal_character_decode = MUST(IMAP::decode_quoted_printable(illegal_character_builder.to_deprecated_string())); 48 EXPECT(illegal_character_decode.is_empty()); 49}