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