diff --git a/tools/test/include/psemek/test/test.hpp b/tools/test/include/psemek/test/test.hpp index 129c5ad7..9ce12894 100644 --- a/tools/test/include/psemek/test/test.hpp +++ b/tools/test/include/psemek/test/test.hpp @@ -7,6 +7,8 @@ #include #include #include +#include +#include // Have to put it before including to_string.hpp due to how unqualified lookup works, // see e.g. https://alexanderlobov.net/posts/2019-07-08-function-lookup-in-templates @@ -38,7 +40,28 @@ std::ostream & operator << (std::ostream & s, std::tuple const & t) return s; } +namespace psemek::util +{ + + std::string type_name(std::type_info const &); + std::string type_name(std::type_index const &); + +} + +inline std::ostream & operator << (std::ostream & s, std::type_info const & type) +{ + s << psemek::util::type_name(type); + return s; +} + +inline std::ostream & operator << (std::ostream & s, std::type_index const & type) +{ + s << psemek::util::type_name(type); + return s; +} + #include +#include namespace psemek::test { @@ -129,6 +152,10 @@ void name ## _test_case ([[maybe_unused]] ::psemek::test::context & _ctx) #define expect_different_ptr(expr1, expr2) if ((expr1) == (expr2)) psemek_test_fail(#expr1, " (", (void*)(expr1), ") == ", #expr2, " (", (void*)(expr2), ")") +#define expect_null(expr) expect_equal(expr, nullptr) + +#define expect_non_null(expr) expect_different(expr, nullptr) + #define expect_less(expr1, expr2) if ((expr1) >= (expr2)) psemek_test_fail(#expr1, " (", (expr1), ") >= ", #expr2, " (", (expr2), ")") #define expect_lequal(expr1, expr2) if ((expr2) > (expr2)) psemek_test_fail(#expr1, " (", (expr1), ") > ", #expr2, " (", (expr2), ")") #define expect_greater(expr1, expr2) if ((expr1) <= (expr2)) psemek_test_fail(#expr1, " (", (expr1), ") <= ", #expr2, " (", (expr2), ")") @@ -140,5 +167,7 @@ void name ## _test_case ([[maybe_unused]] ::psemek::test::context & _ctx) #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_dynamic_type(expr, type) if (!dynamic_cast(&expr)) psemek_test_fail("type(", #expr, ") = ", ::psemek::util::type_name(typeid(expr)), " != ", ::psemek::util::type_name()) + #define test_profile(name) \ if (::psemek::test::profiler name ## _profiler(#name, _ctx); true)