#include "catch.hpp" #include "duckdb/common/numeric_utils.hpp" #include "test_helpers.hpp" using namespace duckdb; using namespace std; TEST_CASE("Numeric cast checks", "[numeric_cast]") { #ifdef DUCKDB_CRASH_ON_ASSERT return; #endif // unsigned-unsiged // can not fail upcasting unsigned type REQUIRE_NOTHROW(NumericCast(NumericLimits::Maximum())); REQUIRE_NOTHROW(NumericCast(NumericLimits::Minimum())); // we can down cast if value fits REQUIRE_NOTHROW(NumericCast(NumericLimits::Maximum())); // but not if it doesn't REQUIRE_THROWS(NumericCast(NumericLimits::Maximum() + 1)); // signed-signed, same as above REQUIRE_NOTHROW(NumericCast(NumericLimits::Maximum())); REQUIRE_NOTHROW(NumericCast(NumericLimits::Minimum())); REQUIRE_NOTHROW(NumericCast(NumericLimits::Maximum())); REQUIRE_THROWS(NumericCast(NumericLimits::Maximum() + 1)); REQUIRE_THROWS(NumericCast(NumericLimits::Minimum() - 1)); // unsigned to signed REQUIRE_NOTHROW(NumericCast(NumericLimits::Maximum())); REQUIRE_NOTHROW(NumericCast(NumericLimits::Minimum())); // uint8 max will not fit in int8 REQUIRE_THROWS(NumericCast(NumericLimits::Maximum())); // signed to unsigned // can cast int8 max to uint8 REQUIRE_NOTHROW(NumericCast(NumericLimits::Maximum())); // cat cast int8 min to unit8 REQUIRE_THROWS(NumericCast(NumericLimits::Minimum())); // can't cast anything negative to anything unsigned REQUIRE_THROWS(NumericCast(-1)); REQUIRE_THROWS(NumericCast(-1)); REQUIRE_THROWS(NumericCast(-1)); REQUIRE_THROWS(NumericCast(-1)); // can't downcast big number REQUIRE_THROWS(NumericCast(NumericLimits::Maximum())); REQUIRE_THROWS(NumericCast(NumericLimits::Maximum())); REQUIRE_THROWS(NumericCast(NumericLimits::Maximum())); REQUIRE_THROWS(NumericCast(NumericLimits::Maximum())); REQUIRE_THROWS(NumericCast(NumericLimits::Maximum())); REQUIRE_THROWS(NumericCast(NumericLimits::Maximum())); REQUIRE_THROWS(NumericCast(NumericLimits::Maximum())); // TODO this should throw but doesn't // REQUIRE_THROWS(NumericCast(hugeint_t(-1))); }