mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-12-29 06:02:07 +03:00
00ac73be57
The actual cause for the "missing bits" is currently unknown, and this test case doesn't actually start obviously breaking yet unless we start reporting errors about missing bits. However, since we are touching the BitStream implementation already, let's add the test early to make extra sure that we aren't breaking anything.
80 lines
3.7 KiB
C++
80 lines
3.7 KiB
C++
/*
|
|
* Copyright (c) 2020-2021, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibTest/TestCase.h>
|
|
|
|
#include <AK/Array.h>
|
|
#include <LibCompress/Zlib.h>
|
|
|
|
TEST_CASE(zlib_decompress_simple)
|
|
{
|
|
Array<u8, 40> const compressed {
|
|
0x78, 0x01, 0x01, 0x1D, 0x00, 0xE2, 0xFF, 0x54, 0x68, 0x69, 0x73, 0x20,
|
|
0x69, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6D, 0x70, 0x6C, 0x65, 0x20,
|
|
0x74, 0x65, 0x78, 0x74, 0x20, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x3A, 0x29,
|
|
0x99, 0x5E, 0x09, 0xE8
|
|
};
|
|
|
|
const u8 uncompressed[] = "This is a simple text file :)";
|
|
|
|
auto const decompressed = Compress::ZlibDecompressor::decompress_all(compressed);
|
|
EXPECT(decompressed.value().bytes() == (ReadonlyBytes { uncompressed, sizeof(uncompressed) - 1 }));
|
|
}
|
|
|
|
TEST_CASE(zlib_compress_simple)
|
|
{
|
|
// Note: This is just the output of our compression function from an arbitrary point in time.
|
|
// This test is intended to ensure that the decompression doesn't change unintentionally,
|
|
// it does not make any guarantees for correctness.
|
|
|
|
Array<u8, 37> const compressed {
|
|
0x78, 0x9C, 0x0B, 0xC9, 0xC8, 0x2C, 0x56, 0xC8, 0x2C, 0x56, 0x48, 0x54,
|
|
0x28, 0xCE, 0xCC, 0x2D, 0xC8, 0x49, 0x55, 0x28, 0x49, 0xAD, 0x28, 0x51,
|
|
0x48, 0xCB, 0xCC, 0x49, 0x55, 0xB0, 0xD2, 0x04, 0x00, 0x99, 0x5E, 0x09,
|
|
0xE8
|
|
};
|
|
|
|
const u8 uncompressed[] = "This is a simple text file :)";
|
|
|
|
auto const freshly_pressed = Compress::ZlibCompressor::compress_all({ uncompressed, sizeof(uncompressed) - 1 });
|
|
EXPECT(freshly_pressed.value().bytes() == compressed.span());
|
|
}
|
|
|
|
TEST_CASE(zlib_decompress_with_missing_end_bits)
|
|
{
|
|
// This test case has been extracted from compressed PNG data of `/res/icons/16x16/app-masterword.png`.
|
|
// The decompression results have been confirmed using the `zlib-flate` tool.
|
|
// Note: It is unconfirmed whether there are actually bits missing.
|
|
// However, our decompressor implementation ends up in a weird state nonetheless.
|
|
|
|
Array<u8, 72> const compressed {
|
|
0x08, 0xD7, 0x63, 0x30, 0x86, 0x00, 0x01, 0x06, 0x23, 0x25, 0x30, 0x00,
|
|
0x32, 0x42, 0x95, 0x54, 0x83, 0xD0, 0x18, 0x41, 0xA1, 0x50, 0x46, 0x28,
|
|
0x8C, 0xA1, 0x8A, 0xA1, 0x46, 0xC5, 0x35, 0x48, 0xC9, 0x05, 0x99, 0xA1,
|
|
0xA4, 0xE2, 0x02, 0x44, 0x60, 0x93, 0x5D, 0x54, 0x54, 0x9C, 0x20, 0x0C,
|
|
0x17, 0x17, 0x08, 0x43, 0xC5, 0xC9, 0x05, 0xA8, 0x4B, 0x50, 0x50, 0x50,
|
|
0xC4, 0xD1, 0x45, 0x50, 0x80, 0x01, 0x06, 0x00, 0xB6, 0x1F, 0x15, 0xEF
|
|
};
|
|
Array<u8, 144> const decompressed {
|
|
0x00, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x10, 0x00, 0x32, 0x22,
|
|
0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x00, 0x32, 0x55, 0x22, 0x25, 0x52,
|
|
0x22, 0x22, 0x10, 0x00, 0x32, 0x55, 0x22, 0x25, 0x52, 0x22, 0x22, 0x10,
|
|
0x00, 0x32, 0x55, 0x52, 0x55, 0x52, 0x22, 0x22, 0x10, 0x00, 0x32, 0x55,
|
|
0x55, 0x55, 0x52, 0x22, 0x22, 0x10, 0x00, 0x32, 0x55, 0x25, 0x25, 0x52,
|
|
0x22, 0x22, 0x10, 0x00, 0x32, 0x55, 0x22, 0x25, 0x52, 0x22, 0x22, 0x10,
|
|
0x00, 0x32, 0x55, 0x24, 0x45, 0x52, 0x22, 0x44, 0x10, 0x00, 0x32, 0x55,
|
|
0x24, 0x45, 0x52, 0x22, 0x44, 0x10, 0x00, 0x32, 0x22, 0x24, 0x44, 0x22,
|
|
0x24, 0x44, 0x10, 0x00, 0x32, 0x22, 0x22, 0x44, 0x24, 0x24, 0x42, 0x10,
|
|
0x00, 0x32, 0x22, 0x22, 0x44, 0x44, 0x44, 0x42, 0x10, 0x00, 0x32, 0x22,
|
|
0x22, 0x24, 0x42, 0x44, 0x22, 0x10, 0x00, 0x11, 0x11, 0x11, 0x14, 0x41,
|
|
0x44, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
|
};
|
|
|
|
auto const maybe_decompressed = Compress::ZlibDecompressor::decompress_all(compressed);
|
|
EXPECT(maybe_decompressed.has_value());
|
|
EXPECT_EQ(maybe_decompressed.value().span(), decompressed.span());
|
|
}
|