#include "common.hpp"
#include "Utils.hpp"
#include <catch2/catch_test_macros.hpp>
#include <limits>
SCENARIO("Utils::Number", "[utils][number]")
{
SECTION("IsEqualThan()")
{
REQUIRE(Utils::Number::IsEqualThan<uint16_t>(0, 16) == false);
REQUIRE(Utils::Number::IsEqualThan<uint8_t, 4>(0, 16) == true);
REQUIRE(Utils::Number::IsEqualThan<uint16_t, 4>(0, 16) == true);
REQUIRE(Utils::Number::IsEqualThan<uint32_t, 4>(0, 16) == true);
REQUIRE(Utils::Number::IsEqualThan<uint64_t, 4>(0, 16) == true);
REQUIRE(Utils::Number::IsEqualThan<uint8_t, 7>(0, 128) == true);
REQUIRE(Utils::Number::IsEqualThan<uint16_t, 7>(0, 128) == true);
REQUIRE(Utils::Number::IsEqualThan<uint32_t, 7>(0, 128) == true);
REQUIRE(Utils::Number::IsEqualThan<uint64_t, 7>(0, 128) == true);
}
SECTION("IsHigherThan()")
{
REQUIRE(Utils::Number::IsHigherThan<uint8_t>(10, std::numeric_limits<uint8_t>::max()) == true);
REQUIRE(Utils::Number::IsHigherThan<uint64_t>(0, std::numeric_limits<uint64_t>::max()) == true);
REQUIRE(
Utils::Number::IsHigherThan<uint64_t>(
(std::numeric_limits<uint64_t>::max() / 2) - 1, std::numeric_limits<uint64_t>::max()) == true);
REQUIRE(
Utils::Number::IsHigherThan<uint64_t>(
std::numeric_limits<uint64_t>::max(), (std::numeric_limits<uint64_t>::max() / 2) + 1) == true);
REQUIRE(Utils::Number::IsHigherThan<uint8_t, 4>(0, 14) == true);
REQUIRE(Utils::Number::IsHigherThan<uint16_t, 4>(0, 14) == true);
REQUIRE(Utils::Number::IsHigherThan<uint32_t, 4>(0, 14) == true);
REQUIRE(Utils::Number::IsHigherThan<uint64_t, 4>(0, 14) == true);
REQUIRE(Utils::Number::IsHigherThan<uint8_t, 6>(0, 64) == false);
REQUIRE(Utils::Number::IsHigherThan<uint16_t, 6>(0, 64) == false);
REQUIRE(Utils::Number::IsHigherThan<uint32_t, 6>(0, 64) == false);
REQUIRE(Utils::Number::IsHigherThan<uint64_t, 6>(0, 64) == false);
}
SECTION("IsLowerThan()")
{
REQUIRE(Utils::Number::IsLowerThan<uint8_t>(1, 2) == true);
REQUIRE(Utils::Number::IsLowerThan<uint8_t>(std::numeric_limits<uint8_t>::max(), 0) == true);
REQUIRE(Utils::Number::IsLowerThan<uint64_t>(1000000, 2000000) == true);
REQUIRE(Utils::Number::IsLowerThan<uint64_t>(std::numeric_limits<uint64_t>::max(), 0) == true);
REQUIRE(
Utils::Number::IsLowerThan<uint64_t>(
(std::numeric_limits<uint64_t>::max() / 2) + 1, std::numeric_limits<uint64_t>::max()) == true);
REQUIRE(
Utils::Number::IsLowerThan<uint64_t>(
std::numeric_limits<uint64_t>::max(), (std::numeric_limits<uint64_t>::max() / 2) - 1) == true);
REQUIRE(Utils::Number::IsLowerThan<uint8_t, 3>(15, 2) == true);
REQUIRE(Utils::Number::IsLowerThan<uint16_t, 3>(15, 2) == true);
REQUIRE(Utils::Number::IsLowerThan<uint32_t, 3>(15, 2) == true);
REQUIRE(Utils::Number::IsLowerThan<uint64_t, 3>(15, 2) == true);
REQUIRE(Utils::Number::IsLowerThan<uint8_t, 2>(3, 1) == true);
REQUIRE(Utils::Number::IsLowerThan<uint16_t, 2>(3, 1) == true);
REQUIRE(Utils::Number::IsLowerThan<uint32_t, 2>(3, 1) == true);
REQUIRE(Utils::Number::IsLowerThan<uint64_t, 2>(3, 1) == true);
}
SECTION("IsHigherOrEqualThan()")
{
REQUIRE(
Utils::Number::IsHigherOrEqualThan<uint64_t>(0, std::numeric_limits<uint64_t>::max()) == true);
REQUIRE(Utils::Number::IsHigherOrEqualThan<uint8_t, 5>(0, 32) == true);
REQUIRE(Utils::Number::IsHigherOrEqualThan<uint16_t, 5>(0, 32) == true);
REQUIRE(Utils::Number::IsHigherOrEqualThan<uint32_t, 5>(0, 32) == true);
REQUIRE(Utils::Number::IsHigherOrEqualThan<uint64_t, 5>(0, 32) == true);
}
SECTION("IsLowerOrEqualThan()")
{
REQUIRE(
Utils::Number::IsLowerOrEqualThan<uint64_t>(std::numeric_limits<uint64_t>::max(), 0) == true);
REQUIRE(Utils::Number::IsLowerOrEqualThan<uint8_t, 2>(0, 4) == true);
REQUIRE(Utils::Number::IsLowerOrEqualThan<uint16_t, 2>(0, 4) == true);
REQUIRE(Utils::Number::IsLowerOrEqualThan<uint32_t, 2>(0, 4) == true);
REQUIRE(Utils::Number::IsLowerOrEqualThan<uint64_t, 2>(0, 4) == true);
REQUIRE(Utils::Number::IsLowerOrEqualThan<uint8_t, 2>(3, 1) == true);
REQUIRE(Utils::Number::IsLowerOrEqualThan<uint16_t, 2>(3, 1) == true);
REQUIRE(Utils::Number::IsLowerOrEqualThan<uint32_t, 2>(3, 1) == true);
REQUIRE(Utils::Number::IsLowerOrEqualThan<uint64_t, 2>(3, 1) == true);
}
SECTION("ForwardDiff()")
{
REQUIRE(static_cast<uint64_t>(Utils::Number::ForwardDiff(4711u, 4711u)) == 0);
uint8_t x{ 0 };
uint8_t y{ 255 };
for (uint16_t i{ 0 }; i < 256; ++i)
{
REQUIRE(static_cast<uint64_t>(Utils::Number::ForwardDiff(x, y)) == 255);
++x;
++y;
}
uint32_t yi{ 255 };
for (uint16_t i{ 0 }; i < 512; ++i)
{
REQUIRE(static_cast<uint64_t>(Utils::Number::ForwardDiff<uint8_t>(x, yi)) == 255);
++x;
++yi;
}
}
SECTION("ForwardDiff() with divisor")
{
REQUIRE(static_cast<uint64_t>(Utils::Number::ForwardDiff<uint8_t, 123>(0, 122)) == 122);
REQUIRE(static_cast<uint64_t>(Utils::Number::ForwardDiff<uint8_t, 123>(122, 122)) == 0);
REQUIRE(static_cast<uint64_t>(Utils::Number::ForwardDiff<uint8_t, 123>(1, 0)) == 122);
REQUIRE(static_cast<uint64_t>(Utils::Number::ForwardDiff<uint8_t, 123>(0, 0)) == 0);
REQUIRE(static_cast<uint64_t>(Utils::Number::ForwardDiff<uint8_t, 123>(122, 0)) == 1);
}
SECTION("ReverseDiff()")
{
REQUIRE(static_cast<uint64_t>(Utils::Number::ReverseDiff(4711u, 4711u)) == 0);
uint8_t x{ 0 };
uint8_t y{ 255 };
for (uint16_t i{ 0 }; i < 256; ++i)
{
REQUIRE(static_cast<uint64_t>(Utils::Number::ReverseDiff(x, y)) == 1);
++x;
++y;
}
uint32_t yi{ 255 };
for (uint16_t i{ 0 }; i < 512; ++i)
{
REQUIRE(static_cast<uint64_t>(Utils::Number::ReverseDiff<uint8_t>(x, yi)) == 1);
++x;
++yi;
}
}
SECTION("ReverseDiff() with divisor")
{
REQUIRE(static_cast<uint64_t>(Utils::Number::ReverseDiff<uint8_t, 123>(0, 122)) == 1);
REQUIRE(static_cast<uint64_t>(Utils::Number::ReverseDiff<uint8_t, 123>(122, 122)) == 0);
REQUIRE(static_cast<uint64_t>(Utils::Number::ReverseDiff<uint8_t, 123>(1, 0)) == 1);
REQUIRE(static_cast<uint64_t>(Utils::Number::ReverseDiff<uint8_t, 123>(0, 0)) == 0);
REQUIRE(static_cast<uint64_t>(Utils::Number::ReverseDiff<uint8_t, 123>(122, 0)) == 122);
}
}