#pragma once #include #include #include namespace structive::test { inline void check(bool condition, const char* expression, const char* file, int line) { if (condition) { return; } std::fprintf(stderr, "%s:%d: check failed: %s\n", file, line, expression); std::abort(); } template bool throws_as(Function&& function) { try { std::forward(function)(); } catch (const Exception&) { return true; } return false; } } #define STRUCTIVE_CHECK(expression) ::structive::test::check(static_cast(expression), #expression, __FILE__, __LINE__) #define STRUCTIVE_CHECK_THROWS_AS(expression, exception) \ STRUCTIVE_CHECK((::structive::test::throws_as([&] { static_cast(expression); }))) #define REQUIRE(expression) STRUCTIVE_CHECK(expression)