1 #include "utils/hex_utils.hpp"
2 
3 #include <cctype>
4 #include <cstdint>
5 #include <limits>
6 #include <vector>
7 
8 #include <gmock/gmock.h> // IWYU pragma: keep
9 #include <gtest/gtest.h> // IWYU pragma: keep
10 
11 // IWYU pragma: no_include "gtest/gtest_pred_impl.h"
12 // IWYU pragma: no_include <gtest/gtest-message.h>
13 // IWYU pragma: no_include <gtest/gtest-test-part.h>
14 // IWYU pragma: no_include "gtest/gtest_pred_impl.h"
15 
16 namespace
17 {
18 
19 using ::testing::IsEmpty;
20 
TEST(IntToHexString,ReturnsCorrectHexForUint64)21 TEST(IntToHexString, ReturnsCorrectHexForUint64)
22 {
23     EXPECT_EQ(intToHexString(0xFFFFFFFFFFFFFFFFULL, 16), "FFFFFFFFFFFFFFFF");
24 
25     EXPECT_EQ(intToHexString(0, 4), "0000");
26     EXPECT_EQ(intToHexString(0, 8), "00000000");
27     EXPECT_EQ(intToHexString(0, 12), "000000000000");
28     EXPECT_EQ(intToHexString(0, 16), "0000000000000000");
29 
30     // uint64_t sized ints
31     EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 4), "F00D");
32     EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 8), "BAD4F00D");
33     EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 12), "BEEFBAD4F00D");
34     EXPECT_EQ(intToHexString(0xDEADBEEFBAD4F00DULL, 16), "DEADBEEFBAD4F00D");
35 
36     // uint16_t sized ints
37     EXPECT_EQ(intToHexString(0xBEEF, 1), "F");
38     EXPECT_EQ(intToHexString(0xBEEF, 2), "EF");
39     EXPECT_EQ(intToHexString(0xBEEF, 3), "EEF");
40     EXPECT_EQ(intToHexString(0xBEEF, 4), "BEEF");
41 }
42 
TEST(BytesToHexString,OnSuccess)43 TEST(BytesToHexString, OnSuccess)
44 {
45     EXPECT_EQ(bytesToHexString({0x1a, 0x2b}), "1A2B");
46 }
47 
TEST(HexCharToNibble,ReturnsCorrectNibbleForEveryHexChar)48 TEST(HexCharToNibble, ReturnsCorrectNibbleForEveryHexChar)
49 {
50     for (char c = 0; c < std::numeric_limits<char>::max(); ++c)
51     {
52         uint8_t expected = 16;
53         if (isdigit(c) != 0)
54         {
55             expected = static_cast<uint8_t>(c) - '0';
56         }
57         else if (c >= 'A' && c <= 'F')
58         {
59             expected = static_cast<uint8_t>(c - 'A') + 10U;
60         }
61         else if (c >= 'a' && c <= 'f')
62         {
63             expected = static_cast<uint8_t>(c - 'a') + 10U;
64         }
65 
66         EXPECT_EQ(hexCharToNibble(c), expected);
67     }
68 }
69 
TEST(HexStringToBytes,Success)70 TEST(HexStringToBytes, Success)
71 {
72     std::vector<uint8_t> hexBytes = {0x01, 0x23, 0x45, 0x67,
73                                      0x89, 0xAB, 0xCD, 0xEF};
74     EXPECT_EQ(hexStringToBytes("0123456789ABCDEF"), hexBytes);
75     EXPECT_THAT(hexStringToBytes(""), IsEmpty());
76 }
77 
TEST(HexStringToBytes,Failure)78 TEST(HexStringToBytes, Failure)
79 {
80     EXPECT_THAT(hexStringToBytes("Hello"), IsEmpty());
81     EXPECT_THAT(hexStringToBytes("`"), IsEmpty());
82     EXPECT_THAT(hexStringToBytes("012"), IsEmpty());
83 }
84 
85 } // namespace
86