1 // Copyright 2017 The CRC32C Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
4
5 #include "./crc32c_round_up.h"
6
7 #include <cstddef>
8 #include <cstdint>
9
10 #include "gtest/gtest.h"
11
12 namespace crc32c {
13
TEST(CRC32CRoundUpTest,RoundUpUintptr)14 TEST(CRC32CRoundUpTest, RoundUpUintptr) {
15 uintptr_t zero = 0;
16
17 ASSERT_EQ(zero, RoundUp<1>(zero));
18 ASSERT_EQ(1U, RoundUp<1>(1U));
19 ASSERT_EQ(2U, RoundUp<1>(2U));
20 ASSERT_EQ(3U, RoundUp<1>(3U));
21 ASSERT_EQ(~static_cast<uintptr_t>(0), RoundUp<1>(~static_cast<uintptr_t>(0)));
22 ASSERT_EQ(~static_cast<uintptr_t>(1), RoundUp<1>(~static_cast<uintptr_t>(1)));
23 ASSERT_EQ(~static_cast<uintptr_t>(2), RoundUp<1>(~static_cast<uintptr_t>(2)));
24 ASSERT_EQ(~static_cast<uintptr_t>(3), RoundUp<1>(~static_cast<uintptr_t>(3)));
25
26 ASSERT_EQ(zero, RoundUp<2>(zero));
27 ASSERT_EQ(2U, RoundUp<2>(1U));
28 ASSERT_EQ(2U, RoundUp<2>(2U));
29 ASSERT_EQ(4U, RoundUp<2>(3U));
30 ASSERT_EQ(4U, RoundUp<2>(4U));
31 ASSERT_EQ(6U, RoundUp<2>(5U));
32 ASSERT_EQ(6U, RoundUp<2>(6U));
33 ASSERT_EQ(8U, RoundUp<2>(7U));
34 ASSERT_EQ(8U, RoundUp<2>(8U));
35 ASSERT_EQ(~static_cast<uintptr_t>(1), RoundUp<2>(~static_cast<uintptr_t>(1)));
36 ASSERT_EQ(~static_cast<uintptr_t>(1), RoundUp<2>(~static_cast<uintptr_t>(2)));
37 ASSERT_EQ(~static_cast<uintptr_t>(3), RoundUp<2>(~static_cast<uintptr_t>(3)));
38 ASSERT_EQ(~static_cast<uintptr_t>(3), RoundUp<2>(~static_cast<uintptr_t>(4)));
39
40 ASSERT_EQ(zero, RoundUp<4>(zero));
41 ASSERT_EQ(4U, RoundUp<4>(1U));
42 ASSERT_EQ(4U, RoundUp<4>(2U));
43 ASSERT_EQ(4U, RoundUp<4>(3U));
44 ASSERT_EQ(4U, RoundUp<4>(4U));
45 ASSERT_EQ(8U, RoundUp<4>(5U));
46 ASSERT_EQ(8U, RoundUp<4>(6U));
47 ASSERT_EQ(8U, RoundUp<4>(7U));
48 ASSERT_EQ(8U, RoundUp<4>(8U));
49 ASSERT_EQ(~static_cast<uintptr_t>(3), RoundUp<4>(~static_cast<uintptr_t>(3)));
50 ASSERT_EQ(~static_cast<uintptr_t>(3), RoundUp<4>(~static_cast<uintptr_t>(4)));
51 ASSERT_EQ(~static_cast<uintptr_t>(3), RoundUp<4>(~static_cast<uintptr_t>(5)));
52 ASSERT_EQ(~static_cast<uintptr_t>(3), RoundUp<4>(~static_cast<uintptr_t>(6)));
53 ASSERT_EQ(~static_cast<uintptr_t>(7), RoundUp<4>(~static_cast<uintptr_t>(7)));
54 ASSERT_EQ(~static_cast<uintptr_t>(7), RoundUp<4>(~static_cast<uintptr_t>(8)));
55 ASSERT_EQ(~static_cast<uintptr_t>(7), RoundUp<4>(~static_cast<uintptr_t>(9)));
56 }
57
TEST(CRC32CRoundUpTest,RoundUpPointer)58 TEST(CRC32CRoundUpTest, RoundUpPointer) {
59 uintptr_t zero = 0, three = 3, four = 4, seven = 7, eight = 8;
60
61 const uint8_t* zero_ptr = reinterpret_cast<const uint8_t*>(zero);
62 const uint8_t* three_ptr = reinterpret_cast<const uint8_t*>(three);
63 const uint8_t* four_ptr = reinterpret_cast<const uint8_t*>(four);
64 const uint8_t* seven_ptr = reinterpret_cast<const uint8_t*>(seven);
65 const uint8_t* eight_ptr = reinterpret_cast<uint8_t*>(eight);
66
67 ASSERT_EQ(zero_ptr, RoundUp<1>(zero_ptr));
68 ASSERT_EQ(zero_ptr, RoundUp<4>(zero_ptr));
69 ASSERT_EQ(zero_ptr, RoundUp<8>(zero_ptr));
70
71 ASSERT_EQ(three_ptr, RoundUp<1>(three_ptr));
72 ASSERT_EQ(four_ptr, RoundUp<4>(three_ptr));
73 ASSERT_EQ(eight_ptr, RoundUp<8>(three_ptr));
74
75 ASSERT_EQ(four_ptr, RoundUp<1>(four_ptr));
76 ASSERT_EQ(four_ptr, RoundUp<4>(four_ptr));
77 ASSERT_EQ(eight_ptr, RoundUp<8>(four_ptr));
78
79 ASSERT_EQ(seven_ptr, RoundUp<1>(seven_ptr));
80 ASSERT_EQ(eight_ptr, RoundUp<4>(seven_ptr));
81 ASSERT_EQ(eight_ptr, RoundUp<8>(four_ptr));
82 }
83
84 } // namespace crc32c
85