Add relative error closedness check in tests
This commit is contained in:
parent
7040faecd4
commit
790deb19ff
1 changed files with 11 additions and 0 deletions
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue