51 if constexpr (
requires { stream << value; }) {
54 stream <<
"<unprintable>";
65#define RETURN_TEST(fn_name, fn_result) do { \
66 const int stormbyte_test_result = (fn_result); \
67 if (stormbyte_test_result != 0) { \
68 std::cerr << "Test " << fn_name << " FAILED!" << std::endl; \
70 return stormbyte_test_result; \
77#define CurrentFileDirectory std::filesystem::path(__FILE__).parent_path()
86#define ASSERT_EQUAL(fn_name, expected, actual) do { \
87 const auto& stormbyte_expected = (expected); \
88 const auto& stormbyte_actual = (actual); \
89 if (!(stormbyte_expected == stormbyte_actual)) { \
90 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": expected \""; \
91 ::StormByte::Test::Detail::PrintValue(std::cerr, stormbyte_expected); \
92 std::cerr << "\", got \""; \
93 ::StormByte::Test::Detail::PrintValue(std::cerr, stormbyte_actual); \
94 std::cerr << "\"" << std::endl; \
106#define ASSERT_NOT_EQUAL(fn_name, expected, actual) do { \
107 const auto& stormbyte_expected = (expected); \
108 const auto& stormbyte_actual = (actual); \
109 if (stormbyte_expected == stormbyte_actual) { \
110 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": values should differ; both were \""; \
111 ::StormByte::Test::Detail::PrintValue(std::cerr, stormbyte_actual); \
112 std::cerr << "\"" << std::endl; \
123#define ASSERT_FALSE(fn_name, condition) do { \
125 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": condition is true, expected false" << std::endl; \
136#define ASSERT_TRUE(fn_name, condition) do { \
137 if (!(condition)) { \
138 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": condition is false, expected true" << std::endl; \
147#define ASSERT_THROWS(fn_name, expression, exception_type) do { \
148 bool stormbyte_threw = false; \
150 (void)(expression); \
151 } catch (const exception_type&) { \
152 stormbyte_threw = true; \
155 if (!stormbyte_threw) { \
156 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": expected " << #exception_type << " to be thrown" << std::endl; \
165#define ASSERT_NO_THROW(fn_name, expression) do { \
167 (void)(expression); \
168 } catch (const std::exception& stormbyte_exception) { \
169 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": unexpected exception: " << stormbyte_exception.what() << std::endl; \
172 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": unexpected non-standard exception" << std::endl; \
181#define ASSERT_NEAR(fn_name, expected, actual, tolerance) do { \
182 const auto stormbyte_expected = (expected); \
183 const auto stormbyte_actual = (actual); \
184 const auto stormbyte_tolerance = (tolerance); \
185 const auto stormbyte_difference = stormbyte_expected > stormbyte_actual ? \
186 stormbyte_expected - stormbyte_actual : stormbyte_actual - stormbyte_expected; \
187 if (stormbyte_difference > stormbyte_tolerance) { \
188 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": values differ beyond tolerance" << std::endl; \
197#define ASSERT_CONTAINS(fn_name, haystack, needle) do { \
198 const auto& stormbyte_haystack = (haystack); \
199 const auto& stormbyte_needle = (needle); \
200 if (stormbyte_haystack.find(stormbyte_needle) == std::string_view::npos) { \
201 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": expected text to contain \"" << stormbyte_needle << "\"" << std::endl; \
210#define ASSERT_NOT_NULL(fn_name, pointer) do { \
211 if ((pointer) == nullptr) { \
212 std::cerr << fn_name << ": Assertion failed at " << __FILE__ << ":" << __LINE__ << ": pointer is null" << std::endl; \
Definition test_handlers.h:48
void PrintValue(std::ostream &stream, const T &value)
Definition test_handlers.h:50