diff --git a/tests/cpp/common_math_helpers.hpp b/tests/cpp/common_math_helpers.hpp new file mode 100644 index 0000000..d9768e6 --- /dev/null +++ b/tests/cpp/common_math_helpers.hpp @@ -0,0 +1,28 @@ +#include +#include +#include +#include +#include +#include +#include + +// NOLINTNEXTLINE +#define gen_random_value(T, range_min, range_max, Nsamples) \ + GENERATE(take(Nsamples, random(static_cast(range_min), \ + static_cast(range_max)))) + +namespace math { + +template +constexpr auto func_value_close(T a, T b, T eps) -> bool { + return ((a - b) < eps) && ((a - b) > -eps); +} + +template +constexpr auto func_all_close(const ::math::Vector2& vec, T x, T y, T eps) + -> bool { + return func_value_close(vec.x(), x, eps) && + func_value_close(vec.y(), y, eps); +} + +} // namespace math diff --git a/tests/cpp/test_vec2_type.cpp b/tests/cpp/test_vec2_type.cpp index 47edc6b..74e2bcb 100644 --- a/tests/cpp/test_vec2_type.cpp +++ b/tests/cpp/test_vec2_type.cpp @@ -1,6 +1,8 @@ #include #include +#include "./common_math_helpers.hpp" + #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wimplicit-float-conversion" @@ -14,24 +16,9 @@ #pragma warning(disable : 4305) #endif -constexpr double RANGE_MIN = -10.0; -constexpr double RANGE_MAX = 10.0; - -// NOLINTNEXTLINE -#define GenRandomValue(Type, Nsamples) \ - GENERATE(take(Nsamples, random(static_cast(RANGE_MIN), \ - static_cast(RANGE_MAX)))) - -template -constexpr auto FuncClose(T a, T b, T eps) -> bool { - return ((a - b) < eps) && ((a - b) > -eps); -} - -template -auto FuncAllClose(const math::Vector2& vec, T x, T y) -> bool { - constexpr T EPSILON = static_cast(math::EPS); - return FuncClose(vec.x(), x, EPSILON) && FuncClose(vec.y(), y, EPSILON); -} +constexpr double USER_RANGE_MIN = -10.0; +constexpr double USER_RANGE_MAX = 10.0; +constexpr double USER_EPSILON = 1e-5; // NOLINTNEXTLINE TEMPLATE_TEST_CASE("Vector2 class (vec2_t) type", "[vec2_t][template]", @@ -39,23 +26,41 @@ TEMPLATE_TEST_CASE("Vector2 class (vec2_t) type", "[vec2_t][template]", using T = TestType; using Vector2 = math::Vector2; + constexpr T RANGE_MIN = static_cast(USER_RANGE_MIN); + constexpr T RANGE_MAX = static_cast(USER_RANGE_MAX); + constexpr T EPSILON = static_cast(USER_EPSILON); + + SECTION("Get/Set using .x(), .y()") { + auto val_x = gen_random_value(T, RANGE_MIN, RANGE_MAX, 10); + auto val_y = gen_random_value(T, RANGE_MIN, RANGE_MAX, 10); + + Vector2 v; + v.x() = val_x; + v.y() = val_y; + + REQUIRE(::math::func_value_close(v.x(), val_x, EPSILON)); + REQUIRE(::math::func_value_close(v.y(), val_y, EPSILON)); + } + SECTION("Default constructor") { Vector2 v; - REQUIRE(FuncAllClose(v, 0.0, 0.0)); + // Default constructor initializes the vector entries to zeros + REQUIRE(::math::func_all_close(v, 0.0, 0.0, EPSILON)); } SECTION("From single scalar argument") { - auto val_x = GenRandomValue(T, 100); + auto val_x = gen_random_value(T, RANGE_MIN, RANGE_MAX, 10); Vector2 v(val_x); - REQUIRE(FuncAllClose(v, val_x, val_x)); + // The given argument is copied for the second entry + REQUIRE(::math::func_all_close(v, val_x, val_x, EPSILON)); } SECTION( "From two scalar arguments, from initializer_list, or using " "comma-initializer") { - auto val_x = GenRandomValue(T, 10); - auto val_y = GenRandomValue(T, 10); + auto val_x = gen_random_value(T, RANGE_MIN, RANGE_MAX, 10); + auto val_y = gen_random_value(T, RANGE_MIN, RANGE_MAX, 10); Vector2 v_1(val_x, val_y); Vector2 v_2 = {val_x, val_y}; @@ -63,30 +68,19 @@ TEMPLATE_TEST_CASE("Vector2 class (vec2_t) type", "[vec2_t][template]", // cppcheck-suppress constStatement v_3 << val_x, val_y; - REQUIRE(FuncAllClose(v_1, val_x, val_y)); - REQUIRE(FuncAllClose(v_2, val_x, val_y)); - REQUIRE(FuncAllClose(v_3, val_x, val_y)); - } - - SECTION("Accessors .x(), .y()") { - auto val_x = GenRandomValue(T, 10); - auto val_y = GenRandomValue(T, 10); - - Vector2 v; - v.x() = val_x; - v.y() = val_y; - - REQUIRE(FuncAllClose(v, val_x, val_y)); + REQUIRE(::math::func_all_close(v_1, val_x, val_y, EPSILON)); + REQUIRE(::math::func_all_close(v_2, val_x, val_y, EPSILON)); + REQUIRE(::math::func_all_close(v_3, val_x, val_y, EPSILON)); } SECTION("Accessors [index]") { - auto val_x = GenRandomValue(T, 10); - auto val_y = GenRandomValue(T, 10); + auto val_x = gen_random_value(T, RANGE_MIN, RANGE_MAX, 10); + auto val_y = gen_random_value(T, RANGE_MIN, RANGE_MAX, 10); Vector2 v; v[0] = val_x; v[1] = val_y; - REQUIRE(FuncAllClose(v, val_x, val_y)); + REQUIRE(::math::func_all_close(v, val_x, val_y, EPSILON)); } }