Add relative error closedness check in tests

This commit is contained in:
Nikita Lisitsa 2022-01-23 19:36:55 +03:00
parent 7040faecd4
commit 790deb19ff

View file

@ -65,6 +65,16 @@ namespace psemek::test
context & ctx_; context & ctx_;
}; };
template <typename T>
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 <typename T> template <typename T>
@ -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_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(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) #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)