TestIntegerMath.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (c) 2022, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibTest/TestCase.h>
  7. #include <AK/IntegralMath.h>
  8. #include <initializer_list>
  9. TEST_CASE(pow)
  10. {
  11. EXPECT_EQ(AK::pow<u64>(0, 0), 1ull);
  12. EXPECT_EQ(AK::pow<u64>(10, 0), 1ull);
  13. EXPECT_EQ(AK::pow<u64>(10, 1), 10ull);
  14. EXPECT_EQ(AK::pow<u64>(10, 2), 100ull);
  15. EXPECT_EQ(AK::pow<u64>(10, 3), 1'000ull);
  16. EXPECT_EQ(AK::pow<u64>(10, 4), 10'000ull);
  17. EXPECT_EQ(AK::pow<u64>(10, 5), 100'000ull);
  18. EXPECT_EQ(AK::pow<u64>(10, 6), 1'000'000ull);
  19. }
  20. TEST_CASE(is_power_of)
  21. {
  22. EXPECT(!AK::is_power_of<0>(10ull));
  23. // We don't have enough context to know if the input was from 0^0
  24. EXPECT(!AK::is_power_of<0>(1ull));
  25. EXPECT(!AK::is_power_of<1>(10ull));
  26. EXPECT(!AK::is_power_of<1>(0ull));
  27. constexpr auto check_prime = []<u64 prime>(u64 limit, u64 init = 0) {
  28. for (u64 power = init; power < limit; ++power)
  29. EXPECT(AK::is_power_of<prime>(AK::pow(prime, power)));
  30. };
  31. // Limits calculated as floor( log_{prime}(2^64) ) to prevent overflows.
  32. check_prime.operator()<0>(42, 1);
  33. check_prime.operator()<1>(36);
  34. check_prime.operator()<2>(64);
  35. check_prime.operator()<3>(40);
  36. check_prime.operator()<5>(27);
  37. check_prime.operator()<7>(20);
  38. check_prime.operator()<11>(18);
  39. check_prime.operator()<97>(9);
  40. check_prime.operator()<257>(7);
  41. }
  42. TEST_CASE(exp2)
  43. {
  44. EXPECT_EQ(AK::exp2<u64>(0), 1ull);
  45. EXPECT_EQ(AK::exp2<u64>(1), 2ull);
  46. EXPECT_EQ(AK::exp2<i8>(6), 64);
  47. EXPECT_EQ(AK::exp2<u8>(7), 128);
  48. EXPECT_EQ(AK::exp2<u16>(9), 512);
  49. EXPECT_EQ(AK::exp2<i16>(14), 16384);
  50. EXPECT_EQ(AK::exp2<u16>(15), 32768);
  51. EXPECT_EQ(AK::exp2<u32>(17), 131072u);
  52. EXPECT_EQ(AK::exp2<i32>(30), 1073741824);
  53. EXPECT_EQ(AK::exp2<u32>(31), 2147483648);
  54. EXPECT_EQ(AK::exp2<i64>(32), 4294967296);
  55. EXPECT_EQ(AK::exp2<u64>(33), 8589934592ull);
  56. EXPECT_EQ(AK::exp2<i64>(62), 4611686018427387904);
  57. EXPECT_EQ(AK::exp2<u64>(63), 9223372036854775808ull);
  58. }