/* * Copyright (c) 2022, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include TEST_CASE(pow) { EXPECT_EQ(AK::pow(0, 0), 1ull); EXPECT_EQ(AK::pow(10, 0), 1ull); EXPECT_EQ(AK::pow(10, 1), 10ull); EXPECT_EQ(AK::pow(10, 2), 100ull); EXPECT_EQ(AK::pow(10, 3), 1'000ull); EXPECT_EQ(AK::pow(10, 4), 10'000ull); EXPECT_EQ(AK::pow(10, 5), 100'000ull); EXPECT_EQ(AK::pow(10, 6), 1'000'000ull); } TEST_CASE(is_power_of) { EXPECT(!AK::is_power_of<0>(10ull)); // We don't have enough context to know if the input was from 0^0 EXPECT(!AK::is_power_of<0>(1ull)); EXPECT(!AK::is_power_of<1>(10ull)); EXPECT(!AK::is_power_of<1>(0ull)); constexpr auto check_prime = [](u64 limit, u64 init = 0) { for (u64 power = init; power < limit; ++power) EXPECT(AK::is_power_of(AK::pow(prime, power))); }; // Limits calculated as floor( log_{prime}(2^64) ) to prevent overflows. check_prime.operator()<0>(42, 1); check_prime.operator()<1>(36); check_prime.operator()<2>(64); check_prime.operator()<3>(40); check_prime.operator()<5>(27); check_prime.operator()<7>(20); check_prime.operator()<11>(18); check_prime.operator()<97>(9); check_prime.operator()<257>(7); } TEST_CASE(exp2) { EXPECT_EQ(AK::exp2(0), 1ull); EXPECT_EQ(AK::exp2(1), 2ull); EXPECT_EQ(AK::exp2(6), 64); EXPECT_EQ(AK::exp2(7), 128); EXPECT_EQ(AK::exp2(9), 512); EXPECT_EQ(AK::exp2(14), 16384); EXPECT_EQ(AK::exp2(15), 32768); EXPECT_EQ(AK::exp2(17), 131072u); EXPECT_EQ(AK::exp2(30), 1073741824); EXPECT_EQ(AK::exp2(31), 2147483648); EXPECT_EQ(AK::exp2(32), 4294967296); EXPECT_EQ(AK::exp2(33), 8589934592ull); EXPECT_EQ(AK::exp2(62), 4611686018427387904); EXPECT_EQ(AK::exp2(63), 9223372036854775808ull); } TEST_CASE(log2) { EXPECT_EQ(AK::log2(0), 0ull); EXPECT_EQ(AK::log2(1), 0ull); EXPECT_EQ(AK::log2(64), 6); EXPECT_EQ(AK::log2(128), 7); EXPECT_EQ(AK::log2(512), 9); EXPECT_EQ(AK::log2(16384), 14); EXPECT_EQ(AK::log2(32768), 15); EXPECT_EQ(AK::log2(131072), 17); EXPECT_EQ(AK::log2(1073741824), 30); EXPECT_EQ(AK::log2(2147483648), 31u); EXPECT_EQ(AK::log2(4294967296), 32); EXPECT_EQ(AK::log2(8589934592), 33); EXPECT_EQ(AK::log2(4611686018427387904), 62); EXPECT_EQ(AK::log2(9223372036854775808ull), 63ull); } TEST_CASE(ceil_log2) { EXPECT_EQ(AK::ceil_log2(0), 0ull); EXPECT_EQ(AK::ceil_log2(1), 0ull); EXPECT_EQ(AK::ceil_log2(2), 1); EXPECT_EQ(AK::ceil_log2(3), 2); EXPECT_EQ(AK::ceil_log2(6), 3); EXPECT_EQ(AK::ceil_log2(96), 7); EXPECT_EQ(AK::ceil_log2(127), 7); EXPECT_EQ(AK::ceil_log2(128), 7); EXPECT_EQ(AK::ceil_log2(255), 8); EXPECT_EQ(AK::ceil_log2(256), 8); EXPECT_EQ(AK::ceil_log2(257), 9); EXPECT_EQ(AK::ceil_log2(384), 9); EXPECT_EQ(AK::ceil_log2(24576), 15); EXPECT_EQ(AK::ceil_log2(32767), 15); EXPECT_EQ(AK::ceil_log2(32768), 15); EXPECT_EQ(AK::ceil_log2(32769), 16); EXPECT_EQ(AK::ceil_log2(98304), 17); EXPECT_EQ(AK::ceil_log2(1610612736), 31); EXPECT_EQ(AK::ceil_log2(2147483647), 31); EXPECT_EQ(AK::ceil_log2(2147483648), 31u); EXPECT_EQ(AK::ceil_log2(2147483649), 32u); EXPECT_EQ(AK::ceil_log2(3221225472), 32u); EXPECT_EQ(AK::ceil_log2(4294967295), 32u); EXPECT_EQ(AK::ceil_log2(4294967296), 32); EXPECT_EQ(AK::ceil_log2(4294967297), 33); EXPECT_EQ(AK::ceil_log2(9223372036854775807), 63ll); EXPECT_EQ(AK::ceil_log2(9223372036854775808ull), 63ull); EXPECT_EQ(AK::ceil_log2(9223372036854775809ull), 64ull); EXPECT_EQ(AK::ceil_log2(13835058055282163712ull), 64ull); EXPECT_EQ(AK::ceil_log2(18446744073709551615ull), 64ull); } TEST_CASE(clamp_to) { EXPECT_EQ((AK::clamp_to(1000000u)), 1000000); EXPECT_EQ((AK::clamp_to(NumericLimits::max())), NumericLimits::max()); EXPECT_EQ((AK::clamp_to(-10)), 0u); EXPECT_EQ((AK::clamp_to(10)), 10u); EXPECT_EQ((AK::clamp_to(NumericLimits::min())), NumericLimits::min()); EXPECT_EQ((AK::clamp_to(NumericLimits::max())), NumericLimits::max()); EXPECT_EQ(AK::clamp_to(-9223372036854775808.0), NumericLimits::min()); EXPECT_EQ(AK::clamp_to(9223372036854775807.0), NumericLimits::max()); }