1 | //===-- Unittests for a64l ------------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "src/stdlib/a64l.h" |
10 | #include "test/UnitTest/Test.h" |
11 | |
12 | TEST(LlvmLibcA64lTest, EmptyString) { ASSERT_EQ(LIBC_NAMESPACE::a64l("" ), 0l); } |
13 | TEST(LlvmLibcA64lTest, FullString) { |
14 | ASSERT_EQ(LIBC_NAMESPACE::a64l("AbC12/" ), 1141696972l); |
15 | } |
16 | |
17 | constexpr char B64_CHARS[64] = { |
18 | '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', |
19 | 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', |
20 | 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', |
21 | 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', |
22 | 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', |
23 | }; |
24 | |
25 | TEST(LlvmLibcA64lTest, OneCharacter) { |
26 | char example_str[2] = {'\0', '\0'}; |
27 | |
28 | for (size_t i = 0; i < 64; ++i) { |
29 | example_str[0] = B64_CHARS[i]; |
30 | ASSERT_EQ(LIBC_NAMESPACE::a64l(example_str), static_cast<long>(i)); |
31 | } |
32 | } |
33 | |
34 | TEST(LlvmLibcA64lTest, TwoCharacters) { |
35 | char example_str[3] = {'\0', '\0', '\0'}; |
36 | |
37 | for (size_t first = 0; first < 64; ++first) { |
38 | example_str[0] = B64_CHARS[first]; |
39 | for (size_t second = 0; second < 64; ++second) { |
40 | example_str[1] = B64_CHARS[second]; |
41 | |
42 | ASSERT_EQ(LIBC_NAMESPACE::a64l(example_str), |
43 | static_cast<long>(first + (second * 64))); |
44 | } |
45 | } |
46 | } |
47 | |
48 | TEST(LlvmLibcA64lTest, FiveSameCharacters) { |
49 | // Technically the last digit can be parsed to give the last two bits. Not |
50 | // handling that here. |
51 | char example_str[6] = { |
52 | '\0', '\0', '\0', '\0', '\0', '\0', |
53 | }; |
54 | |
55 | // set every 6th bit |
56 | const long BASE_NUM = 0b1000001000001000001000001; |
57 | |
58 | for (size_t char_val = 0; char_val < 64; ++char_val) { |
59 | for (size_t i = 0; i < 5; ++i) |
60 | example_str[i] = B64_CHARS[char_val]; |
61 | |
62 | const long expected_result = BASE_NUM * char_val; |
63 | |
64 | ASSERT_EQ(LIBC_NAMESPACE::a64l(example_str), expected_result); |
65 | } |
66 | } |
67 | |
68 | TEST(LlvmLibcA64lTest, OneOfSixCharacters) { |
69 | char example_str[7] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0'}; |
70 | |
71 | for (size_t cur_char = 0; cur_char < 6; ++cur_char) { |
72 | // clear the string, set all the chars to b64(0) |
73 | for (size_t i = 0; i < 6; ++i) |
74 | example_str[i] = B64_CHARS[0]; |
75 | |
76 | for (size_t char_val = 0; char_val < 64; ++char_val) { |
77 | example_str[cur_char] = B64_CHARS[char_val]; |
78 | |
79 | // Need to limit to 32 bits, since that's what the standard says the |
80 | // function does. |
81 | const long expected_result = |
82 | static_cast<int32_t>(char_val << (6 * cur_char)); |
83 | |
84 | ASSERT_EQ(LIBC_NAMESPACE::a64l(example_str), expected_result); |
85 | } |
86 | } |
87 | } |
88 | |