odin-blend2d

Odin bindings to Blend2D
Log | Files | Refs | README | LICENSE

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