Add more utilities to tests

This commit is contained in:
Nikita Lisitsa 2023-04-19 19:00:23 +03:00
parent 327e4b9744
commit a1f06a57ca

View file

@ -7,6 +7,8 @@
#include <iostream> #include <iostream>
#include <utility> #include <utility>
#include <tuple> #include <tuple>
#include <typeinfo>
#include <typeindex>
// Have to put it before including to_string.hpp due to how unqualified lookup works, // 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 // 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<Ts...> const & t)
return s; 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 <psemek/util/to_string.hpp> #include <psemek/util/to_string.hpp>
#include <psemek/util/type_name.hpp>
namespace psemek::test 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_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_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_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), ")") #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_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<type const *>(&expr)) psemek_test_fail("type(", #expr, ") = ", ::psemek::util::type_name(typeid(expr)), " != ", ::psemek::util::type_name<type>())
#define test_profile(name) \ #define test_profile(name) \
if (::psemek::test::profiler name ## _profiler(#name, _ctx); true) if (::psemek::test::profiler name ## _profiler(#name, _ctx); true)