#pragma once #include #include #include #include #include #include namespace fuc2 { using Func = std::function; using Case = std::pair; struct Options { bool fail_fast; }; struct Set { std::string name; Options options; std::vector tests; std::source_location location = std::source_location::current(); }; std::string craft_error( const std::string& type, const std::string& test, const std::string &message, const std::source_location location, const std::source_location test_sig = std::source_location::current()); void CHECK(bool test, const std::string &message="", const std::source_location location = std::source_location::current()); void EQUAL(auto v1, auto v2, const std::string &message="", const std::source_location location = std::source_location::current()) { if(v1 != v2) { auto test_value = fmt::format("{} != {}", v1, v2); throw std::runtime_error(craft_error("EQUAL", test_value, message, location)); } } void NOT_EQUAL(auto v1, auto v2, const std::string &message="", const std::source_location location = std::source_location::current()) { if(v1 == v2) { auto test_value = fmt::format("{} == {}", v1, v2); throw std::runtime_error(craft_error("NOT_EQUAL", test_value, message, location)); } } void BLOWS_UP(std::function cb, const std::string &message, const std::source_location location = std::source_location::current()); int run(const Set& test_set); }