From 790deb19ff4bb04eab0466b262b5424ed00cf0cc Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 23 Jan 2022 19:36:55 +0300 Subject: [PATCH] Add relative error closedness check in tests --- tools/test/include/psemek/test/test.hpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/test/include/psemek/test/test.hpp b/tools/test/include/psemek/test/test.hpp index d78dac02..26bb2b3d 100644 --- a/tools/test/include/psemek/test/test.hpp +++ b/tools/test/include/psemek/test/test.hpp @@ -65,6 +65,16 @@ namespace psemek::test context & ctx_; }; + template + bool check_relative_error(T const & x1, T const & x2, T const & error) + { + T m = std::min(std::abs(x1), std::abs(x2)); + T M = std::max(std::abs(x1), std::abs(x2)); + if (m == T{0}) + return M < error; + return std::abs(x1 - x2) < M * error; + } + } template @@ -103,6 +113,7 @@ void name ## _test_case ([[maybe_unused]] ::psemek::test::context & _ctx) #define expect_small(expr1, expr2) if (std::abs((expr1)) > (expr2)) psemek_test_fail("abs(", #expr1, ") (", std::abs((expr1)), ") >= ", #expr2, " (", (expr2), ")") #define expect_close(expr1, expr2, expr3) if (std::abs((expr1) - (expr2)) > (expr3)) psemek_test_fail(#expr1, " (", (expr1), ") and ", #expr2, " (", (expr2), ") differ by more than ", (expr3)) +#define expect_close_rel(expr1, expr2, expr3) if (!::psemek::test::check_relative_error((expr1), (expr2), (expr3))) psemek_test_fail(#expr1, " (", (expr1), ") and ", #expr2, " (", (expr2), ") relative error is more than ", (expr3)) #define expect_throw(expr, type) do { bool thrown = false; try { (void)(expr); } catch (type const &) { thrown = true; } if (!thrown) psemek_test_fail(#expr, " didn't throw ", #type); } while (false)