blob: 2004d6784e71e87549d5d325b8d6f2b343942d9e [file]
#include "hex_utils.hpp"
#include <algorithm>
#include <cctype>
#include <cstdint>
#include <limits>
#include <string>
#include <vector>
#include <gmock/gmock.h> // IWYU pragma: keep
#include <gtest/gtest.h> // IWYU pragma: keep
// IWYU pragma: no_include "gtest/gtest_pred_impl.h"
// IWYU pragma: no_include <gtest/gtest-message.h>
// IWYU pragma: no_include <gtest/gtest-test-part.h>
// IWYU pragma: no_include "gtest/gtest_pred_impl.h"
namespace {
using ::testing::IsEmpty;
TEST(IntToHexString, ReturnsCorrectHexForUint64) {
EXPECT_EQ(intToHexString(0xFFFFFFFFFFFFFFFFULL, 16), "FFFFFFFFFFFFFFFF");
EXPECT_EQ(intToHexString(0, 4), "0000");
EXPECT_EQ(intToHexString(0, 8), "00000000");
EXPECT_EQ(intToHexString(0, 12), "000000000000");
EXPECT_EQ(intToHexString(0, 16), "0000000000000000");
// uint64_t sized ints
EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 4), "F00D");
EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 8), "BAD4F00D");
EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 12), "BEEFBAD4F00D");
EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 16), "DEADBEEFBAD4F00D");
// uint16_t sized ints
EXPECT_EQ(intToHexString(0xBEEF, 1), "F");
EXPECT_EQ(intToHexString(0xBEEF, 2), "EF");
EXPECT_EQ(intToHexString(0xBEEF, 3), "EEF");
EXPECT_EQ(intToHexString(0xBEEF, 4), "BEEF");
}
TEST(BytesToHexString, OnSuccess) {
EXPECT_EQ(bytesToHexString({0x1a, 0x2b}), "1A2B");
}
TEST(BytesToHexDump, ZeroLength) { EXPECT_EQ(bytesToHexDump({}), ""); }
TEST(BytesToHexDump, MultipleLines) {
std::vector<uint8_t> bytes;
for (int i = 0; i < 20; ++i) {
bytes.push_back(static_cast<uint8_t>('A' + i));
}
std::string expected =
"0000: 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 | "
"ABCDEFGHIJKLMNOP |\n"
"0010: 51 52 53 54 | QRST |\n";
EXPECT_EQ(bytesToHexDump(bytes), expected);
}
TEST(BytesToHexDump, LargeLength) {
std::vector<uint8_t> bytes(512, 'A');
std::string result = bytesToHexDump(bytes);
EXPECT_EQ(result.length(), 32 * 78); // 32 lines, 78 chars each
EXPECT_EQ(std::count(result.begin(), result.end(), '\n'), 32);
}
TEST(BytesToHexDump, ActualHexValues) {
std::vector<uint8_t> bytes = {0x00, 0x01, 0x02, 0xAB, 0xFF, 'A', 'B', 'C'};
std::string expected =
"0000: 00 01 02 AB FF 41 42 43 | .....ABC "
"|\n";
EXPECT_EQ(bytesToHexDump(bytes), expected);
}
TEST(HexCharToNibble, ReturnsCorrectNibbleForEveryHexChar) {
for (char c = 0; c < std::numeric_limits<char>::max(); ++c) {
uint8_t expected = 16;
if (isdigit(c) != 0) {
expected = static_cast<uint8_t>(c - '0');
} else if (c >= 'A' && c <= 'F') {
expected = static_cast<uint8_t>(c - 'A' + 10);
} else if (c >= 'a' && c <= 'f') {
expected = static_cast<uint8_t>(c - 'a' + 10);
}
EXPECT_EQ(hexCharToNibble(c), expected);
}
}
TEST(HexStringToBytes, Success) {
std::vector<uint8_t> hexBytes = {0x01, 0x23, 0x45, 0x67,
0x89, 0xAB, 0xCD, 0xEF};
EXPECT_EQ(hexStringToBytes("0123456789ABCDEF"), hexBytes);
EXPECT_THAT(hexStringToBytes(""), IsEmpty());
}
TEST(HexStringToBytes, Failure) {
EXPECT_THAT(hexStringToBytes("Hello"), IsEmpty());
EXPECT_THAT(hexStringToBytes("`"), IsEmpty());
EXPECT_THAT(hexStringToBytes("012"), IsEmpty());
}
} // namespace