/** @file
  Unit tests for BaseLib's checksum capabilities.

  Copyright (c) 2023 Pedro Falcato. All rights reserved<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#include <Library/GoogleTestLib.h>
extern "C" {
  #include <Base.h>
  #include <Library/BaseLib.h>
}

// Precomputed crc32c and crc16-ansi for "hello" (without the null byte)
constexpr STATIC UINT32  mHelloCrc32c = 0x9A71BB4C;
constexpr STATIC UINT16  mHelloCrc16  = 0x34F6;

TEST (Crc32c, BasicCheck) {
  // Note: The magic numbers below are precomputed checksums
  // Check for basic operation on even and odd numbers of bytes
  EXPECT_EQ (CalculateCrc32c ("hello", 5, 0), mHelloCrc32c);
  EXPECT_EQ (
    CalculateCrc32c ("longlonglonglonglong", sizeof ("longlonglonglonglong") - 1, 0),
    0xC50F869D
    );
  EXPECT_EQ (CalculateCrc32c ("h", 1, 0), 0xB96298FC);

  // Check if a checksum with no bytes correctly yields 0
  EXPECT_EQ (CalculateCrc32c ("", 0, 0), 0U);
}

TEST (Crc32c, MultipartCheck) {
  // Test multi-part crc32c calculation. So that given a string of bytes
  // s[N], crc32c(s, N, 0) == crc32c(s[N - 1], 1, crc32c(s, N - 1, 0))
  // and all other sorts of combinations one might imagine.
  UINT32  val;

  val = CalculateCrc32c ("hel", 3, 0);
  EXPECT_EQ (CalculateCrc32c (&"hello"[3], 2, val), mHelloCrc32c);
}

TEST (Crc16, BasicCheck) {
  // Note: The magic numbers below are precomputed checksums
  // Check for basic operation on even and odd numbers of bytes
  EXPECT_EQ (CalculateCrc16Ansi ("hello", 5, CRC16ANSI_INIT), mHelloCrc16);
  EXPECT_EQ (
    CalculateCrc16Ansi ("longlonglonglonglong", sizeof ("longlonglonglonglong") - 1, CRC16ANSI_INIT),
    0xF723
    );
  EXPECT_EQ (CalculateCrc16Ansi ("h", 1, CRC16ANSI_INIT), 0xAEBE);

  // Check if a checksum with no bytes correctly yields CRC16ANSI_INIT
  EXPECT_EQ (CalculateCrc16Ansi ("", 0, CRC16ANSI_INIT), CRC16ANSI_INIT);
}

TEST (Crc16, MultipartCheck) {
  // Test multi-part crc16 calculation. So that given a string of bytes
  // s[N], crc16(s, N, 0) == crc16(s[N - 1], 1, crc16(s, N - 1, 0))
  // and all other sorts of combinations one might imagine.
  UINT16  val;

  val = CalculateCrc16Ansi ("hel", 3, CRC16ANSI_INIT);
  EXPECT_EQ (CalculateCrc16Ansi (&"hello"[3], 2, val), mHelloCrc16);
}
