20#ifndef ZEROERR_G_CONTEXT_SCOPE
21#define ZEROERR_G_CONTEXT_SCOPE(x)
34#ifndef ZEROERR_PRINT_ASSERT_DEFAULT_PRINTER
35#define ZEROERR_PRINT_ASSERT_DEFAULT_PRINTER(cond, level, ...) \
38 switch (zeroerr::assert_level::ZEROERR_CAT(level, _l)) { \
39 case zeroerr::assert_level::ZEROERR_WARN_l: \
40 std::cerr << zeroerr::FgYellow << "WARN" << zeroerr::Reset; \
42 case zeroerr::assert_level::ZEROERR_ERROR_l: \
43 std::cerr << zeroerr::FgRed << "ERROR" << zeroerr::Reset; \
45 case zeroerr::assert_level::ZEROERR_FATAL_l: \
46 std::cerr << zeroerr::FgMagenta << "FATAL" << zeroerr::Reset; \
49 std::cerr << zeroerr::format(__VA_ARGS__) << std::endl; \
58#define ZEROERR_PRINT_ASSERT(cond, level, pattern, ...) \
59 ZEROERR_PRINT_ASSERT_DEFAULT_PRINTER(cond, level, " Assertion Failed:\n{msg}" pattern, \
60 assertion_data.log(), ##__VA_ARGS__)
63#define ZEROERR_ASSERT_EXP(cond, level, expect_throw, is_false, ...) \
64 ZEROERR_FUNC_SCOPE_BEGIN { \
65 zeroerr::assert_info info{zeroerr::assert_level::ZEROERR_CAT(level, _l), \
66 zeroerr::assert_throw::expect_throw, is_false}; \
68 zeroerr::AssertionData assertion_data(__FILE__, __LINE__, #cond, info); \
70 assertion_data.setResult(zeroerr::ExpressionDecomposer() << cond); \
71 } catch (const std::exception& e) { \
72 assertion_data.setException(e); \
74 zeroerr::detail::context_helper< \
75 decltype(_ZEROERR_TEST_CONTEXT), \
76 std::is_same<decltype(_ZEROERR_TEST_CONTEXT), \
77 const bool>::value>::setContext(assertion_data, _ZEROERR_TEST_CONTEXT); \
78 ZEROERR_PRINT_ASSERT(assertion_data.passed == false, level, "" __VA_ARGS__); \
79 if (false) debug_break(); \
81 ZEROERR_FUNC_SCOPE_RET(assertion_data.passed); \
83 ZEROERR_FUNC_SCOPE_END
86#define ZEROERR_ASSERT_CMP(lhs, op, rhs, level, expect_throw, is_false, ...) \
87 ZEROERR_FUNC_SCOPE_BEGIN { \
88 zeroerr::assert_info info{zeroerr::assert_level::ZEROERR_CAT(level, _l), \
89 zeroerr::assert_throw::expect_throw, is_false}; \
91 zeroerr::Printer print; \
92 print.isQuoted = false; \
93 zeroerr::AssertionData assertion_data(__FILE__, __LINE__, #lhs " " #op " " #rhs, info); \
95 assertion_data.setResult({(lhs)op(rhs), print(lhs, #op, rhs)}); \
96 } catch (const std::exception& e) { \
97 assertion_data.setException(e); \
99 zeroerr::detail::context_helper< \
100 decltype(_ZEROERR_TEST_CONTEXT), \
101 std::is_same<decltype(_ZEROERR_TEST_CONTEXT), \
102 const bool>::value>::setContext(assertion_data, _ZEROERR_TEST_CONTEXT); \
103 ZEROERR_PRINT_ASSERT(assertion_data.passed == false, level, "" __VA_ARGS__); \
104 if (false) debug_break(); \
106 ZEROERR_FUNC_SCOPE_RET(assertion_data.passed); \
108 ZEROERR_FUNC_SCOPE_END
111#ifdef ZEROERR_NO_ASSERT
114#define CHECK_NOT(...)
115#define CHECK_THROWS(...)
117#define REQUIRE_NOT(...)
118#define REQUIRE_THROWS(...)
120#define ASSERT_NOT(...)
121#define ASSERT_THROWS(...)
130#define REQUIRE_EQ(...)
131#define REQUIRE_NE(...)
132#define REQUIRE_LT(...)
133#define REQUIRE_LE(...)
134#define REQUIRE_GT(...)
135#define REQUIRE_GE(...)
137#define ASSERT_EQ(...)
138#define ASSERT_NE(...)
139#define ASSERT_LT(...)
140#define ASSERT_LE(...)
141#define ASSERT_GT(...)
142#define ASSERT_GE(...)
148#define ZEROERR_CHECK(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_WARN, no_throw, false, __VA_ARGS__))
149#define ZEROERR_CHECK_NOT(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_WARN, no_throw, true, __VA_ARGS__))
150#define ZEROERR_CHECK_THROWS(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_WARN, throws, false, __VA_ARGS__))
151#define ZEROERR_REQUIRE(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_ERROR, no_throw, false, __VA_ARGS__))
152#define ZEROERR_REQUIRE_NOT(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_ERROR, no_throw, true, __VA_ARGS__))
153#define ZEROERR_REQUIRE_THROWS(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_ERROR, throws, false, __VA_ARGS__))
154#define ZEROERR_ASSERT(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_FATAL, no_throw, false, __VA_ARGS__))
155#define ZEROERR_ASSERT_NOT(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_FATAL, no_throw, true, __VA_ARGS__))
156#define ZEROERR_ASSERT_THROWS(cond, ...) ZEROERR_EXPAND(ZEROERR_ASSERT_EXP(cond, ZEROERR_FATAL, throws, false, __VA_ARGS__))
158#define CHECK(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
159#define CHECK_NOT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK_NOT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
160#define CHECK_THROWS(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK_THROWS(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
161#define REQUIRE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
162#define REQUIRE_NOT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE_NOT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
163#define REQUIRE_THROWS(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE_THROWS(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
164#define ASSERT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
165#define ASSERT_NOT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT_NOT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
166#define ASSERT_THROWS(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT_THROWS(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
168#define ZEROERR_CHECK_EQ(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, ==, rhs, ZEROERR_WARN, no_throw, false, __VA_ARGS__)
169#define ZEROERR_CHECK_NE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, !=, rhs, ZEROERR_WARN, no_throw, false, __VA_ARGS__)
170#define ZEROERR_CHECK_LT(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, <, rhs, ZEROERR_WARN, no_throw, false, __VA_ARGS__)
171#define ZEROERR_CHECK_LE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, <=, rhs, ZEROERR_WARN, no_throw, false, __VA_ARGS__)
172#define ZEROERR_CHECK_GT(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, >, rhs, ZEROERR_WARN, no_throw, false, __VA_ARGS__)
173#define ZEROERR_CHECK_GE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, >=, rhs, ZEROERR_WARN, no_throw, false, __VA_ARGS__)
175#define ZEROERR_REQUIRE_EQ(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, ==, rhs, ZEROERR_ERROR, no_throw, false, __VA_ARGS__)
176#define ZEROERR_REQUIRE_NE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, !=, rhs, ZEROERR_ERROR, no_throw, false, __VA_ARGS__)
177#define ZEROERR_REQUIRE_LT(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, <, rhs, ZEROERR_ERROR, no_throw, false, __VA_ARGS__)
178#define ZEROERR_REQUIRE_LE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, <=, rhs, ZEROERR_ERROR, no_throw, false, __VA_ARGS__)
179#define ZEROERR_REQUIRE_GT(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, >, rhs, ZEROERR_ERROR, no_throw, false, __VA_ARGS__)
180#define ZEROERR_REQUIRE_GE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, >=, rhs, ZEROERR_ERROR, no_throw, false, __VA_ARGS__)
182#define ZEROERR_ASSERT_EQ(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, ==, rhs, ZEROERR_FATAL, no_throw, false, __VA_ARGS__)
183#define ZEROERR_ASSERT_NE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, !=, rhs, ZEROERR_FATAL, no_throw, false, __VA_ARGS__)
184#define ZEROERR_ASSERT_LT(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, <, rhs, ZEROERR_FATAL, no_throw, false, __VA_ARGS__)
185#define ZEROERR_ASSERT_LE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, <=, rhs, ZEROERR_FATAL, no_throw, false, __VA_ARGS__)
186#define ZEROERR_ASSERT_GT(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, >, rhs, ZEROERR_FATAL, no_throw, false, __VA_ARGS__)
187#define ZEROERR_ASSERT_GE(lhs, rhs, ...) ZEROERR_ASSERT_CMP(lhs, >=, rhs, ZEROERR_FATAL, no_throw, false, __VA_ARGS__)
189#define CHECK_EQ(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK_EQ(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
190#define CHECK_NE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK_NE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
191#define CHECK_LT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK_LT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
192#define CHECK_LE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK_LE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
193#define CHECK_GT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK_GT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
194#define CHECK_GE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_CHECK_GE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
195#define REQUIRE_EQ(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE_EQ(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
196#define REQUIRE_NE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE_NE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
197#define REQUIRE_LT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE_LT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
198#define REQUIRE_LE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE_LE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
199#define REQUIRE_GT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE_GT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
200#define REQUIRE_GE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_REQUIRE_GE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
201#define ASSERT_EQ(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT_EQ(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
202#define ASSERT_NE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT_NE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
203#define ASSERT_LT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT_LT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
204#define ASSERT_LE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT_LE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
205#define ASSERT_GT(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT_GT(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
206#define ASSERT_GE(...) ZEROERR_SUPPRESS_VARIADIC_MACRO ZEROERR_EXPAND(ZEROERR_ASSERT_GE(__VA_ARGS__)) ZEROERR_SUPPRESS_VARIADIC_MACRO_POP
251 static std::string pattern =
"zeroerr::ExpressionDecomposer() << ";
252 std::string cond_str(
cond);
253 size_t pos = cond_str.find(pattern);
254 if (pos != std::string::npos) cond_str.replace(pos, pos + pattern.size(),
"");
255 this->cond = cond_str;
273 std::stringstream ss;
274 ss <<
" " <<
cond <<
" expands to " <<
message << std::endl;
291template <
typename T,
bool>
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_POP
Definition config.h:272
#define ZEROERR_SUPPRESS_COMMON_WARNINGS_PUSH
Definition config.h:224
#define ZEROERR_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)
Definition config.h:188
constexpr bool _ZEROERR_TEST_CONTEXT
Definition assert.h:216
Definition benchmark.cpp:17
const char * Dim
Definition color.cpp:36
assert_throw
Definition assert.h:223
assert_level
Definition assert.h:222
assert_cmp
Definition assert.h:224
const char * Reset
Definition color.cpp:34
AssertionData is a struct that contains all the information of an assertion. It will be thrown as an ...
Definition assert.h:241
assert_info info
Definition assert.h:244
std::string log()
Definition assert.h:272
std::string message
Definition assert.h:246
const char * file
Definition assert.h:242
void operator()()
Definition assert.h:280
void setResult(ExprResult &&result)
Definition assert.h:258
bool shouldThrow()
Definition assert.h:285
AssertionData(const char *file, unsigned line, const char *cond, assert_info info)
Definition assert.h:249
void setException(const std::exception &e)
Definition assert.h:267
bool passed
Definition assert.h:245
unsigned line
Definition assert.h:243
std::string cond
Definition assert.h:247
Definition decomposition.h:87
std::string decomp
Definition decomposition.h:89
bool res
Definition decomposition.h:88
This is a one-byte assert info struct, which is used to collect the meta info of an assertion.
Definition assert.h:230
assert_level level
Definition assert.h:231
assert_throw throw_type
Definition assert.h:232
bool is_false
Definition assert.h:233
static void setContext(AssertionData &data, T ctx)
Definition assert.h:303
static void setContext(AssertionData &data, T)
Definition assert.h:296