| // Copyright 2016 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #include <lib/unittest/unittest.h> |
| #include <limits.h> |
| #include <pow2.h> |
| |
| static bool pow2_test(void) { |
| const size_t num_uint_bits = sizeof(uint) * CHAR_BIT; |
| const size_t num_ulong_bits = sizeof(ulong) * CHAR_BIT; |
| |
| BEGIN_TEST; |
| EXPECT_EQ(0u, log2_uint_floor(0)); |
| EXPECT_EQ(0u, log2_uint_floor(1)); |
| EXPECT_EQ(1u, log2_uint_floor(2)); |
| EXPECT_EQ(1u, log2_uint_floor(3)); |
| EXPECT_EQ(2u, log2_uint_floor(4)); |
| EXPECT_EQ(num_uint_bits - 2, log2_uint_floor(UINT_MAX >> 1)); |
| EXPECT_EQ(num_uint_bits - 1, log2_uint_floor((UINT_MAX >> 1) + 1)); |
| EXPECT_EQ(num_uint_bits - 1, log2_uint_floor(UINT_MAX)); |
| |
| EXPECT_EQ(0u, log2_uint_ceil(0)); |
| EXPECT_EQ(0u, log2_uint_ceil(1)); |
| EXPECT_EQ(1u, log2_uint_ceil(2)); |
| EXPECT_EQ(2u, log2_uint_ceil(3)); |
| EXPECT_EQ(2u, log2_uint_ceil(4)); |
| EXPECT_EQ(3u, log2_uint_ceil(5)); |
| EXPECT_EQ(num_uint_bits - 1, log2_uint_ceil(UINT_MAX >> 1)); |
| EXPECT_EQ(num_uint_bits - 1, log2_uint_ceil((UINT_MAX >> 1) + 1)); |
| EXPECT_EQ(num_uint_bits, log2_uint_ceil((UINT_MAX >> 1) + 2)); |
| EXPECT_EQ(num_uint_bits, log2_uint_ceil(UINT_MAX)); |
| |
| EXPECT_EQ(0u, log2_ulong_floor(0)); |
| EXPECT_EQ(0u, log2_ulong_floor(1)); |
| EXPECT_EQ(1u, log2_ulong_floor(2)); |
| EXPECT_EQ(1u, log2_ulong_floor(3)); |
| EXPECT_EQ(2u, log2_ulong_floor(4)); |
| EXPECT_EQ(num_ulong_bits - 2, log2_ulong_floor(ULONG_MAX >> 1)); |
| EXPECT_EQ(num_ulong_bits - 1, log2_ulong_floor((ULONG_MAX >> 1) + 1)); |
| EXPECT_EQ(num_ulong_bits - 1, log2_ulong_floor(ULONG_MAX)); |
| |
| EXPECT_EQ(0u, log2_ulong_ceil(0)); |
| EXPECT_EQ(0u, log2_ulong_ceil(1)); |
| EXPECT_EQ(1u, log2_ulong_ceil(2)); |
| EXPECT_EQ(2u, log2_ulong_ceil(3)); |
| EXPECT_EQ(2u, log2_ulong_ceil(4)); |
| EXPECT_EQ(3u, log2_ulong_ceil(5)); |
| EXPECT_EQ(num_ulong_bits - 1, log2_ulong_ceil(ULONG_MAX >> 1)); |
| EXPECT_EQ(num_ulong_bits - 1, log2_ulong_ceil((ULONG_MAX >> 1) + 1)); |
| EXPECT_EQ(num_ulong_bits, log2_ulong_ceil((ULONG_MAX >> 1) + 2)); |
| EXPECT_EQ(num_ulong_bits, log2_ulong_ceil(ULONG_MAX)); |
| |
| EXPECT_TRUE(ispow2(0)); |
| for (size_t i = 0; i < num_uint_bits; ++i) { |
| EXPECT_TRUE(ispow2(1u << i)); |
| } |
| EXPECT_FALSE(ispow2(3)); |
| EXPECT_FALSE(ispow2(5)); |
| EXPECT_FALSE(ispow2(6)); |
| EXPECT_FALSE(ispow2(7)); |
| EXPECT_FALSE(ispow2(UINT_MAX)); |
| |
| EXPECT_EQ(0u, round_up_pow2_u32(0)); |
| EXPECT_EQ(1u, round_up_pow2_u32(1)); |
| EXPECT_EQ(2u, round_up_pow2_u32(2)); |
| EXPECT_EQ(4u, round_up_pow2_u32(3)); |
| EXPECT_EQ(8u, round_up_pow2_u32(5)); |
| EXPECT_EQ(8u, round_up_pow2_u32(7)); |
| EXPECT_EQ(1u << 31, round_up_pow2_u32(1u << 31)); |
| EXPECT_EQ(0u, round_up_pow2_u32((1u << 31) + 1)); |
| EXPECT_EQ(0u, round_up_pow2_u32(UINT_MAX)); |
| |
| EXPECT_EQ(1u, valpow2(0u)); |
| EXPECT_EQ(0x80000000u, valpow2(31u)); |
| EXPECT_EQ(0x100000000lu, valpow2(32lu)); |
| EXPECT_EQ(0x8000000000000000lu, valpow2(63lu)); |
| END_TEST; |
| } |
| |
| UNITTEST_START_TESTCASE(pow2_tests) |
| UNITTEST("pow2 lib tests", pow2_test) |
| UNITTEST_END_TESTCASE(pow2_tests, "pow2", "pow2 lib tests") |