1 // Copyright 2016 The Fuchsia Authors
2 //
3 // Use of this source code is governed by a MIT-style
4 // license that can be found in the LICENSE file or at
5 // https://opensource.org/licenses/MIT
6 
7 #include <lib/unittest/unittest.h>
8 #include <limits.h>
9 #include <pow2.h>
10 
pow2_test(void)11 static bool pow2_test(void) {
12     const size_t num_uint_bits = sizeof(uint) * CHAR_BIT;
13     const size_t num_ulong_bits = sizeof(ulong) * CHAR_BIT;
14 
15     BEGIN_TEST;
16     EXPECT_EQ(0u, log2_uint_floor(0), "");
17     EXPECT_EQ(0u, log2_uint_floor(1), "");
18     EXPECT_EQ(1u, log2_uint_floor(2), "");
19     EXPECT_EQ(1u, log2_uint_floor(3), "");
20     EXPECT_EQ(2u, log2_uint_floor(4), "");
21     EXPECT_EQ(num_uint_bits - 2, log2_uint_floor(UINT_MAX >> 1), "");
22     EXPECT_EQ(num_uint_bits - 1, log2_uint_floor((UINT_MAX >> 1) + 1), "");
23     EXPECT_EQ(num_uint_bits - 1, log2_uint_floor(UINT_MAX), "");
24 
25     EXPECT_EQ(0u, log2_uint_ceil(0), "");
26     EXPECT_EQ(0u, log2_uint_ceil(1), "");
27     EXPECT_EQ(1u, log2_uint_ceil(2), "");
28     EXPECT_EQ(2u, log2_uint_ceil(3), "");
29     EXPECT_EQ(2u, log2_uint_ceil(4), "");
30     EXPECT_EQ(3u, log2_uint_ceil(5), "");
31     EXPECT_EQ(num_uint_bits - 1, log2_uint_ceil(UINT_MAX >> 1), "");
32     EXPECT_EQ(num_uint_bits - 1, log2_uint_ceil((UINT_MAX >> 1) + 1), "");
33     EXPECT_EQ(num_uint_bits, log2_uint_ceil((UINT_MAX >> 1) + 2), "");
34     EXPECT_EQ(num_uint_bits, log2_uint_ceil(UINT_MAX), "");
35 
36     EXPECT_EQ(0u, log2_ulong_floor(0), "");
37     EXPECT_EQ(0u, log2_ulong_floor(1), "");
38     EXPECT_EQ(1u, log2_ulong_floor(2), "");
39     EXPECT_EQ(1u, log2_ulong_floor(3), "");
40     EXPECT_EQ(2u, log2_ulong_floor(4), "");
41     EXPECT_EQ(num_ulong_bits - 2, log2_ulong_floor(ULONG_MAX >> 1), "");
42     EXPECT_EQ(num_ulong_bits - 1, log2_ulong_floor((ULONG_MAX >> 1) + 1), "");
43     EXPECT_EQ(num_ulong_bits - 1, log2_ulong_floor(ULONG_MAX), "");
44 
45     EXPECT_EQ(0u, log2_ulong_ceil(0), "");
46     EXPECT_EQ(0u, log2_ulong_ceil(1), "");
47     EXPECT_EQ(1u, log2_ulong_ceil(2), "");
48     EXPECT_EQ(2u, log2_ulong_ceil(3), "");
49     EXPECT_EQ(2u, log2_ulong_ceil(4), "");
50     EXPECT_EQ(3u, log2_ulong_ceil(5), "");
51     EXPECT_EQ(num_ulong_bits - 1, log2_ulong_ceil(ULONG_MAX >> 1), "");
52     EXPECT_EQ(num_ulong_bits - 1, log2_ulong_ceil((ULONG_MAX >> 1) + 1), "");
53     EXPECT_EQ(num_ulong_bits, log2_ulong_ceil((ULONG_MAX >> 1) + 2), "");
54     EXPECT_EQ(num_ulong_bits, log2_ulong_ceil(ULONG_MAX), "");
55 
56     EXPECT_TRUE(ispow2(0), "");
57     for (size_t i = 0; i < num_uint_bits; ++i) {
58         EXPECT_TRUE(ispow2(1u << i), "");
59     }
60     EXPECT_FALSE(ispow2(3), "");
61     EXPECT_FALSE(ispow2(5), "");
62     EXPECT_FALSE(ispow2(6), "");
63     EXPECT_FALSE(ispow2(7), "");
64     EXPECT_FALSE(ispow2(UINT_MAX), "");
65 
66     EXPECT_EQ(0u, round_up_pow2_u32(0), "");
67     EXPECT_EQ(1u, round_up_pow2_u32(1), "");
68     EXPECT_EQ(2u, round_up_pow2_u32(2), "");
69     EXPECT_EQ(4u, round_up_pow2_u32(3), "");
70     EXPECT_EQ(8u, round_up_pow2_u32(5), "");
71     EXPECT_EQ(8u, round_up_pow2_u32(7), "");
72     EXPECT_EQ(1u << 31, round_up_pow2_u32(1u << 31), "");
73     EXPECT_EQ(0u, round_up_pow2_u32((1u << 31) + 1), "");
74     EXPECT_EQ(0u, round_up_pow2_u32(UINT_MAX), "");
75     END_TEST;
76 }
77 
78 UNITTEST_START_TESTCASE(pow2_tests)
79 UNITTEST("pow2 lib tests", pow2_test)
80 UNITTEST_END_TESTCASE(pow2_tests, "pow2", "pow2 lib tests");
81