/ src / crc32c / src / crc32c_round_up_unittest.cc
crc32c_round_up_unittest.cc
 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  
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  
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