checksum_test.cpp (6644B)
1 // This file is part of Blend2D project <https://blend2d.com> 2 // 3 // See blend2d.h or LICENSE.md for license and copyright information 4 // SPDX-License-Identifier: Zlib 5 6 #include "../api-build_test_p.h" 7 #if defined(BL_TEST) 8 9 #include "../array.h" 10 #include "../compression/checksum_p.h" 11 12 namespace bl::Compression::Checksum::Tests { 13 14 // bl::Compression - CheckSum - CRC32 - Tests 15 // ========================================== 16 17 static constexpr uint32_t kCheckSumInputSize = 1024u * 256u; 18 static constexpr uint32_t kCheckSumLargeInputSize = 1024u * 1024u * 4u; 19 20 static void fill_array_for_checksum(BLArray<uint8_t>& arr, size_t n) noexcept { 21 for (uint32_t i = 0; i < n; i++) { 22 EXPECT_SUCCESS(arr.append(uint8_t((i * 17) & 0xFFu))); 23 } 24 } 25 26 static void fill_array_with_same_value(BLArray<uint8_t>& arr, uint8_t b, size_t n) noexcept { 27 for (uint32_t i = 0; i < n; i++) { 28 EXPECT_SUCCESS(arr.append(b)); 29 } 30 } 31 32 UNIT(compression_checksum_adler32, BL_TEST_GROUP_COMPRESSION_CHECKSUMS) { 33 const uint8_t* lowercase_letters = reinterpret_cast<const uint8_t*>("abcdefghijklmnopqrstuvwxyz"); 34 35 EXPECT_EQ(adler32(nullptr , 0), 0x00000001u); 36 EXPECT_EQ(adler32(lowercase_letters, 1), 0x00620062u); 37 EXPECT_EQ(adler32(lowercase_letters, 2), 0x012600C4u); 38 EXPECT_EQ(adler32(lowercase_letters, 3), 0x024D0127u); 39 EXPECT_EQ(adler32(lowercase_letters, 4), 0x03D8018Bu); 40 EXPECT_EQ(adler32(lowercase_letters, 5), 0x05C801F0u); 41 EXPECT_EQ(adler32(lowercase_letters, 6), 0x081E0256u); 42 EXPECT_EQ(adler32(lowercase_letters, 7), 0x0ADB02BDu); 43 EXPECT_EQ(adler32(lowercase_letters, 8), 0x0E000325u); 44 EXPECT_EQ(adler32(lowercase_letters, 9), 0x118E038Eu); 45 EXPECT_EQ(adler32(lowercase_letters, 10), 0x158603F8u); 46 EXPECT_EQ(adler32(lowercase_letters, 11), 0x19E90463u); 47 EXPECT_EQ(adler32(lowercase_letters, 12), 0x1EB804CFu); 48 EXPECT_EQ(adler32(lowercase_letters, 13), 0x23F4053Cu); 49 EXPECT_EQ(adler32(lowercase_letters, 14), 0x299E05AAu); 50 EXPECT_EQ(adler32(lowercase_letters, 15), 0x2FB70619u); 51 EXPECT_EQ(adler32(lowercase_letters, 16), 0x36400689u); 52 EXPECT_EQ(adler32(lowercase_letters, 17), 0x3D3A06FAu); 53 EXPECT_EQ(adler32(lowercase_letters, 18), 0x44A6076Cu); 54 EXPECT_EQ(adler32(lowercase_letters, 19), 0x4C8507DFu); 55 EXPECT_EQ(adler32(lowercase_letters, 20), 0x54D80853u); 56 EXPECT_EQ(adler32(lowercase_letters, 21), 0x5DA008C8u); 57 EXPECT_EQ(adler32(lowercase_letters, 22), 0x66DE093Eu); 58 EXPECT_EQ(adler32(lowercase_letters, 23), 0x709309B5u); 59 EXPECT_EQ(adler32(lowercase_letters, 24), 0x7AC00A2Du); 60 EXPECT_EQ(adler32(lowercase_letters, 25), 0x85660AA6u); 61 EXPECT_EQ(adler32(lowercase_letters, 26), 0x90860B20u); 62 63 BLArray<uint8_t> input; 64 fill_array_for_checksum(input, kCheckSumInputSize); 65 66 for (uint32_t i = 1; i < kCheckSumInputSize; i += (i >> 10) + 1u) { 67 uint32_t checksum = adler32(input.data(), i); 68 uint32_t expected = adler32_update_ref(kAdler32Initial, input.data(), i); 69 70 EXPECT_EQ(checksum, expected).message( 71 "ADLER32 checksum of %u random bytes doesn't match (checksum=0x%08X expected=0x%08X", i, checksum, expected); 72 } 73 74 input.clear(); 75 fill_array_with_same_value(input, 0xFFu, kCheckSumInputSize); 76 77 for (uint32_t i = 1; i < kCheckSumInputSize; i += (i >> 10) + 1u) { 78 uint32_t checksum = adler32(input.data(), i); 79 uint32_t expected = adler32_update_ref(kAdler32Initial, input.data(), i); 80 81 EXPECT_EQ(checksum, expected).message( 82 "ADLER32 checksum of %u '0xFF' bytes doesn't match (checksum=0x%08X expected=0x%08X", i, checksum, expected); 83 } 84 85 input.clear(); 86 fill_array_with_same_value(input, 0xFFu, kCheckSumLargeInputSize); 87 88 { 89 uint32_t checksum = adler32(input.data(), kCheckSumLargeInputSize); 90 uint32_t expected = adler32_update_ref(kAdler32Initial, input.data(), kCheckSumLargeInputSize); 91 92 EXPECT_EQ(checksum, expected).message( 93 "ADLER32 checksum of %u '0xFF' bytes doesn't match (checksum=0x%08X expected=0x%08X", kCheckSumLargeInputSize, checksum, expected); 94 } 95 } 96 97 UNIT(compression_checksum_crc32, BL_TEST_GROUP_COMPRESSION_CHECKSUMS) { 98 const uint8_t* lowercase_letters = reinterpret_cast<const uint8_t*>("abcdefghijklmnopqrstuvwxyz"); 99 100 EXPECT_EQ(crc32(nullptr , 0), 0x00000000u); 101 EXPECT_EQ(crc32(lowercase_letters, 1), 0xE8B7BE43u); 102 EXPECT_EQ(crc32(lowercase_letters, 2), 0x9E83486Du); 103 EXPECT_EQ(crc32(lowercase_letters, 3), 0x352441C2u); 104 EXPECT_EQ(crc32(lowercase_letters, 4), 0xED82CD11u); 105 EXPECT_EQ(crc32(lowercase_letters, 5), 0x8587D865u); 106 EXPECT_EQ(crc32(lowercase_letters, 6), 0x4B8E39EFu); 107 EXPECT_EQ(crc32(lowercase_letters, 7), 0x312A6AA6u); 108 EXPECT_EQ(crc32(lowercase_letters, 8), 0xAEEF2A50u); 109 EXPECT_EQ(crc32(lowercase_letters, 9), 0x8DA988AFu); 110 EXPECT_EQ(crc32(lowercase_letters, 10), 0x3981703Au); 111 EXPECT_EQ(crc32(lowercase_letters, 11), 0xCE570F9Fu); 112 EXPECT_EQ(crc32(lowercase_letters, 12), 0xF6781B24u); 113 EXPECT_EQ(crc32(lowercase_letters, 13), 0xDDF46EA2u); 114 EXPECT_EQ(crc32(lowercase_letters, 14), 0x400D9578u); 115 EXPECT_EQ(crc32(lowercase_letters, 15), 0x519167DFu); 116 EXPECT_EQ(crc32(lowercase_letters, 16), 0x943AC093u); 117 EXPECT_EQ(crc32(lowercase_letters, 17), 0x9C925619u); 118 EXPECT_EQ(crc32(lowercase_letters, 18), 0x08FEC50Bu); 119 EXPECT_EQ(crc32(lowercase_letters, 19), 0x8CD4E846u); 120 EXPECT_EQ(crc32(lowercase_letters, 20), 0x1A596AE5u); 121 EXPECT_EQ(crc32(lowercase_letters, 21), 0x221725A3u); 122 EXPECT_EQ(crc32(lowercase_letters, 22), 0x2499DEF3u); 123 EXPECT_EQ(crc32(lowercase_letters, 23), 0x38F3316Au); 124 EXPECT_EQ(crc32(lowercase_letters, 24), 0x21836DF4u); 125 EXPECT_EQ(crc32(lowercase_letters, 25), 0x412A937Du); 126 EXPECT_EQ(crc32(lowercase_letters, 26), 0x4C2750BDu); 127 128 BLArray<uint8_t> input; 129 fill_array_for_checksum(input, kCheckSumInputSize); 130 131 for (uint32_t i = 1; i < kCheckSumInputSize; i += (i >> 10) + 1u) { 132 uint32_t checksum = crc32(input.data(), i); 133 uint32_t expected = crc32_finalize(crc32_update_ref(kCrc32Initial, input.data(), i)); 134 135 EXPECT_EQ(checksum, expected).message( 136 "CRC32 checksum of %u random bytes doesn't match (checksum=0x%08X expected=0x%08X", i, checksum, expected); 137 } 138 139 input.clear(); 140 fill_array_for_checksum(input, kCheckSumLargeInputSize); 141 142 { 143 uint32_t checksum = crc32(input.data(), kCheckSumLargeInputSize); 144 uint32_t expected = crc32_finalize(crc32_update_ref(kCrc32Initial, input.data(), kCheckSumLargeInputSize)); 145 146 EXPECT_EQ(checksum, expected).message( 147 "CRC32 checksum of %u random bytes doesn't match (checksum=0x%08X expected=0x%08X", kCheckSumLargeInputSize, checksum, expected); 148 } 149 } 150 151 } // {bl::Compression::Checksum::Tests} 152 153 #endif // BL_TEST