42 #ifndef DOCTEST_LIBRARY_INCLUDED
43 #define DOCTEST_LIBRARY_INCLUDED
49 #define DOCTEST_VERSION_MAJOR 2
50 #define DOCTEST_VERSION_MINOR 4
51 #define DOCTEST_VERSION_PATCH 9
54 #define DOCTEST_TOSTR_IMPL(x) #x
55 #define DOCTEST_TOSTR(x) DOCTEST_TOSTR_IMPL(x)
57 #define DOCTEST_VERSION_STR \
58 DOCTEST_TOSTR(DOCTEST_VERSION_MAJOR) "." \
59 DOCTEST_TOSTR(DOCTEST_VERSION_MINOR) "." \
60 DOCTEST_TOSTR(DOCTEST_VERSION_PATCH)
62 #define DOCTEST_VERSION \
63 (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH)
72 #define DOCTEST_CPLUSPLUS _MSVC_LANG
74 #define DOCTEST_CPLUSPLUS __cplusplus
77 #define DOCTEST_COMPILER(MAJOR, MINOR, PATCH) ((MAJOR)*10000000 + (MINOR)*100000 + (PATCH))
80 #if defined(_MSC_VER) && defined(_MSC_FULL_VER)
81 #if _MSC_VER == _MSC_FULL_VER / 10000
82 #define DOCTEST_MSVC DOCTEST_COMPILER(_MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 10000)
84 #define DOCTEST_MSVC \
85 DOCTEST_COMPILER(_MSC_VER / 100, (_MSC_FULL_VER / 100000) % 100, _MSC_FULL_VER % 100000)
88 #if defined(__clang__) && defined(__clang_minor__)
89 #define DOCTEST_CLANG DOCTEST_COMPILER(__clang_major__, __clang_minor__, __clang_patchlevel__)
90 #elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && \
91 !defined(__INTEL_COMPILER)
92 #define DOCTEST_GCC DOCTEST_COMPILER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
96 #define DOCTEST_MSVC 0
97 #endif // DOCTEST_MSVC
99 #define DOCTEST_CLANG 0
100 #endif // DOCTEST_CLANG
102 #define DOCTEST_GCC 0
103 #endif // DOCTEST_GCC
110 #define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
111 #define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH _Pragma("clang diagnostic push")
112 #define DOCTEST_CLANG_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(clang diagnostic ignored w)
113 #define DOCTEST_CLANG_SUPPRESS_WARNING_POP _Pragma("clang diagnostic pop")
114 #define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w) \
115 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING(w)
116 #else // DOCTEST_CLANG
117 #define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
118 #define DOCTEST_CLANG_SUPPRESS_WARNING(w)
119 #define DOCTEST_CLANG_SUPPRESS_WARNING_POP
120 #define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)
121 #endif // DOCTEST_CLANG
124 #define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x)
125 #define DOCTEST_GCC_SUPPRESS_WARNING_PUSH _Pragma("GCC diagnostic push")
126 #define DOCTEST_GCC_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(GCC diagnostic ignored w)
127 #define DOCTEST_GCC_SUPPRESS_WARNING_POP _Pragma("GCC diagnostic pop")
128 #define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w) \
129 DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING(w)
131 #define DOCTEST_GCC_SUPPRESS_WARNING_PUSH
132 #define DOCTEST_GCC_SUPPRESS_WARNING(w)
133 #define DOCTEST_GCC_SUPPRESS_WARNING_POP
134 #define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)
135 #endif // DOCTEST_GCC
138 #define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH __pragma(warning(push))
139 #define DOCTEST_MSVC_SUPPRESS_WARNING(w) __pragma(warning(disable : w))
140 #define DOCTEST_MSVC_SUPPRESS_WARNING_POP __pragma(warning(pop))
141 #define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w) \
142 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING(w)
143 #else // DOCTEST_MSVC
144 #define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
145 #define DOCTEST_MSVC_SUPPRESS_WARNING(w)
146 #define DOCTEST_MSVC_SUPPRESS_WARNING_POP
147 #define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)
148 #endif // DOCTEST_MSVC
156 #define DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH \
157 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH \
158 DOCTEST_CLANG_SUPPRESS_WARNING("-Wunknown-pragmas") \
159 DOCTEST_CLANG_SUPPRESS_WARNING("-Wweak-vtables") \
160 DOCTEST_CLANG_SUPPRESS_WARNING("-Wpadded") \
161 DOCTEST_CLANG_SUPPRESS_WARNING("-Wmissing-prototypes") \
162 DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat") \
163 DOCTEST_CLANG_SUPPRESS_WARNING("-Wc++98-compat-pedantic") \
165 DOCTEST_GCC_SUPPRESS_WARNING_PUSH \
166 DOCTEST_GCC_SUPPRESS_WARNING("-Wunknown-pragmas") \
167 DOCTEST_GCC_SUPPRESS_WARNING("-Wpragmas") \
168 DOCTEST_GCC_SUPPRESS_WARNING("-Weffc++") \
169 DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-overflow") \
170 DOCTEST_GCC_SUPPRESS_WARNING("-Wstrict-aliasing") \
171 DOCTEST_GCC_SUPPRESS_WARNING("-Wmissing-declarations") \
172 DOCTEST_GCC_SUPPRESS_WARNING("-Wuseless-cast") \
173 DOCTEST_GCC_SUPPRESS_WARNING("-Wnoexcept") \
175 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \
177 DOCTEST_MSVC_SUPPRESS_WARNING(4514) \
178 DOCTEST_MSVC_SUPPRESS_WARNING(4571) \
179 DOCTEST_MSVC_SUPPRESS_WARNING(4710) \
180 DOCTEST_MSVC_SUPPRESS_WARNING(4711) \
182 DOCTEST_MSVC_SUPPRESS_WARNING(4616) \
183 DOCTEST_MSVC_SUPPRESS_WARNING(4619) \
184 DOCTEST_MSVC_SUPPRESS_WARNING(4996) \
185 DOCTEST_MSVC_SUPPRESS_WARNING(4706) \
186 DOCTEST_MSVC_SUPPRESS_WARNING(4512) \
187 DOCTEST_MSVC_SUPPRESS_WARNING(4127) \
188 DOCTEST_MSVC_SUPPRESS_WARNING(4820) \
189 DOCTEST_MSVC_SUPPRESS_WARNING(4625) \
190 DOCTEST_MSVC_SUPPRESS_WARNING(4626) \
191 DOCTEST_MSVC_SUPPRESS_WARNING(5027) \
192 DOCTEST_MSVC_SUPPRESS_WARNING(5026) \
193 DOCTEST_MSVC_SUPPRESS_WARNING(4640) \
194 DOCTEST_MSVC_SUPPRESS_WARNING(5045) \
196 DOCTEST_MSVC_SUPPRESS_WARNING(26439) \
197 DOCTEST_MSVC_SUPPRESS_WARNING(26495) \
198 DOCTEST_MSVC_SUPPRESS_WARNING(26451) \
199 DOCTEST_MSVC_SUPPRESS_WARNING(26444) \
200 DOCTEST_MSVC_SUPPRESS_WARNING(26812)
202 #define DOCTEST_SUPPRESS_COMMON_WARNINGS_POP \
203 DOCTEST_CLANG_SUPPRESS_WARNING_POP \
204 DOCTEST_GCC_SUPPRESS_WARNING_POP \
205 DOCTEST_MSVC_SUPPRESS_WARNING_POP
221 #define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN \
222 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \
223 DOCTEST_MSVC_SUPPRESS_WARNING(4548) \
224 DOCTEST_MSVC_SUPPRESS_WARNING(4265) \
225 DOCTEST_MSVC_SUPPRESS_WARNING(4986) \
226 DOCTEST_MSVC_SUPPRESS_WARNING(4350) \
227 DOCTEST_MSVC_SUPPRESS_WARNING(4668) \
228 DOCTEST_MSVC_SUPPRESS_WARNING(4365) \
229 DOCTEST_MSVC_SUPPRESS_WARNING(4774) \
230 DOCTEST_MSVC_SUPPRESS_WARNING(4820) \
231 DOCTEST_MSVC_SUPPRESS_WARNING(4625) \
232 DOCTEST_MSVC_SUPPRESS_WARNING(4626) \
233 DOCTEST_MSVC_SUPPRESS_WARNING(5027) \
234 DOCTEST_MSVC_SUPPRESS_WARNING(5026) \
235 DOCTEST_MSVC_SUPPRESS_WARNING(4623) \
236 DOCTEST_MSVC_SUPPRESS_WARNING(5039) \
237 DOCTEST_MSVC_SUPPRESS_WARNING(5045) \
238 DOCTEST_MSVC_SUPPRESS_WARNING(5105) \
239 DOCTEST_MSVC_SUPPRESS_WARNING(4738)
241 #define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP
263 #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
264 #define DOCTEST_CONFIG_NO_WINDOWS_SEH
265 #endif // WINAPI_FAMILY
266 #if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
267 #define DOCTEST_CONFIG_WINDOWS_SEH
269 #if defined(DOCTEST_CONFIG_NO_WINDOWS_SEH) && defined(DOCTEST_CONFIG_WINDOWS_SEH)
270 #undef DOCTEST_CONFIG_WINDOWS_SEH
271 #endif // DOCTEST_CONFIG_NO_WINDOWS_SEH
273 #if !defined(_WIN32) && !defined(__QNX__) && !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && \
274 !defined(__EMSCRIPTEN__) && !defined(__wasi__)
275 #define DOCTEST_CONFIG_POSIX_SIGNALS
277 #if defined(DOCTEST_CONFIG_NO_POSIX_SIGNALS) && defined(DOCTEST_CONFIG_POSIX_SIGNALS)
278 #undef DOCTEST_CONFIG_POSIX_SIGNALS
279 #endif // DOCTEST_CONFIG_NO_POSIX_SIGNALS
281 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
282 #if !defined(__cpp_exceptions) && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) \
284 #define DOCTEST_CONFIG_NO_EXCEPTIONS
285 #endif // no exceptions
286 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
288 #ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
289 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
290 #define DOCTEST_CONFIG_NO_EXCEPTIONS
291 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
292 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
294 #if defined(DOCTEST_CONFIG_NO_EXCEPTIONS) && !defined(DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS)
295 #define DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
296 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS && !DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
299 #define DOCTEST_CONFIG_NO_MULTITHREADING
302 #if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && !defined(DOCTEST_CONFIG_IMPLEMENT)
303 #define DOCTEST_CONFIG_IMPLEMENT
304 #endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
306 #if defined(_WIN32) || defined(__CYGWIN__)
308 #define DOCTEST_SYMBOL_EXPORT __declspec(dllexport)
309 #define DOCTEST_SYMBOL_IMPORT __declspec(dllimport)
311 #define DOCTEST_SYMBOL_EXPORT __attribute__((dllexport))
312 #define DOCTEST_SYMBOL_IMPORT __attribute__((dllimport))
315 #define DOCTEST_SYMBOL_EXPORT __attribute__((visibility("default")))
316 #define DOCTEST_SYMBOL_IMPORT
319 #ifdef DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
320 #ifdef DOCTEST_CONFIG_IMPLEMENT
321 #define DOCTEST_INTERFACE DOCTEST_SYMBOL_EXPORT
322 #else // DOCTEST_CONFIG_IMPLEMENT
323 #define DOCTEST_INTERFACE DOCTEST_SYMBOL_IMPORT
324 #endif // DOCTEST_CONFIG_IMPLEMENT
325 #else // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
326 #define DOCTEST_INTERFACE
327 #endif // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL
332 #define DOCTEST_INTERFACE_DECL
333 #define DOCTEST_INTERFACE_DEF DOCTEST_INTERFACE
334 #else // DOCTEST_MSVC
335 #define DOCTEST_INTERFACE_DECL DOCTEST_INTERFACE
336 #define DOCTEST_INTERFACE_DEF
337 #endif // DOCTEST_MSVC
339 #define DOCTEST_EMPTY
342 #define DOCTEST_NOINLINE __declspec(noinline)
343 #define DOCTEST_UNUSED
344 #define DOCTEST_ALIGNMENT(x)
345 #elif DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 5, 0)
346 #define DOCTEST_NOINLINE
347 #define DOCTEST_UNUSED
348 #define DOCTEST_ALIGNMENT(x)
350 #define DOCTEST_NOINLINE __attribute__((noinline))
351 #define DOCTEST_UNUSED __attribute__((unused))
352 #define DOCTEST_ALIGNMENT(x) __attribute__((aligned(x)))
355 #ifndef DOCTEST_NORETURN
356 #if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
357 #define DOCTEST_NORETURN
358 #else // DOCTEST_MSVC
359 #define DOCTEST_NORETURN [[noreturn]]
360 #endif // DOCTEST_MSVC
361 #endif // DOCTEST_NORETURN
363 #ifndef DOCTEST_NOEXCEPT
364 #if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
365 #define DOCTEST_NOEXCEPT
366 #else // DOCTEST_MSVC
367 #define DOCTEST_NOEXCEPT noexcept
368 #endif // DOCTEST_MSVC
369 #endif // DOCTEST_NOEXCEPT
371 #ifndef DOCTEST_CONSTEXPR
372 #if DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
373 #define DOCTEST_CONSTEXPR const
374 #define DOCTEST_CONSTEXPR_FUNC inline
375 #else // DOCTEST_MSVC
376 #define DOCTEST_CONSTEXPR constexpr
377 #define DOCTEST_CONSTEXPR_FUNC constexpr
378 #endif // DOCTEST_MSVC
379 #endif // DOCTEST_CONSTEXPR
385 #define DOCTEST_DECLARE_INTERFACE(name) \
388 name(const name&) = delete; \
389 name(name&&) = delete; \
390 name& operator=(const name&) = delete; \
391 name& operator=(name&&) = delete;
393 #define DOCTEST_DEFINE_INTERFACE(name) \
394 name::~name() = default;
397 #define DOCTEST_CAT_IMPL(s1, s2) s1##s2
398 #define DOCTEST_CAT(s1, s2) DOCTEST_CAT_IMPL(s1, s2)
399 #ifdef __COUNTER__ // not standard and may be missing for some compilers
400 #define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __COUNTER__)
402 #define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__)
403 #endif // __COUNTER__
405 #ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
406 #define DOCTEST_REF_WRAP(x) x&
407 #else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
408 #define DOCTEST_REF_WRAP(x) x
409 #endif // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE
412 #ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
413 #define DOCTEST_PLATFORM_MAC
414 #elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
415 #define DOCTEST_PLATFORM_IPHONE
416 #elif defined(_WIN32)
417 #define DOCTEST_PLATFORM_WINDOWS
418 #elif defined(__wasi__)
419 #define DOCTEST_PLATFORM_WASI
420 #else // DOCTEST_PLATFORM
421 #define DOCTEST_PLATFORM_LINUX
422 #endif // DOCTEST_PLATFORM
424 namespace doctest {
namespace detail {
428 #define DOCTEST_GLOBAL_NO_WARNINGS(var, ...) \
429 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wglobal-constructors") \
430 static const int var = doctest::detail::consume(&var, __VA_ARGS__); \
431 DOCTEST_CLANG_SUPPRESS_WARNING_POP
433 #ifndef DOCTEST_BREAK_INTO_DEBUGGER
435 #ifdef DOCTEST_PLATFORM_LINUX
436 #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64))
438 #define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT(hicpp-no-assembler)
441 #define DOCTEST_BREAK_INTO_DEBUGGER() raise(SIGTRAP)
443 #elif defined(DOCTEST_PLATFORM_MAC)
444 #if defined(__x86_64) || defined(__x86_64__) || defined(__amd64__) || defined(__i386)
445 #define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) // NOLINT(hicpp-no-assembler)
446 #elif defined(__ppc__) || defined(__ppc64__)
448 #define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n": : : "memory","r0","r3","r4") // NOLINT(hicpp-no-assembler)
450 #define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("brk #0"); // NOLINT(hicpp-no-assembler)
453 #define DOCTEST_BREAK_INTO_DEBUGGER() __debugbreak()
454 #elif defined(__MINGW32__)
456 extern "C" __declspec(dllimport)
void __stdcall DebugBreak();
458 #define DOCTEST_BREAK_INTO_DEBUGGER() ::DebugBreak()
460 #define DOCTEST_BREAK_INTO_DEBUGGER() (static_cast<void>(0))
462 #endif // DOCTEST_BREAK_INTO_DEBUGGER
465 #ifdef DOCTEST_CONFIG_USE_IOSFWD
466 #ifndef DOCTEST_CONFIG_USE_STD_HEADERS
467 #define DOCTEST_CONFIG_USE_STD_HEADERS
469 #endif // DOCTEST_CONFIG_USE_IOSFWD
478 #ifdef _LIBCPP_VERSION
479 #ifndef DOCTEST_CONFIG_USE_STD_HEADERS
480 #define DOCTEST_CONFIG_USE_STD_HEADERS
482 #endif // _LIBCPP_VERSION
485 #ifdef DOCTEST_CONFIG_USE_STD_HEADERS
486 #ifndef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
487 #define DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
488 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
494 #else // DOCTEST_CONFIG_USE_STD_HEADERS
501 typedef decltype(sizeof(
void*))
size_t;
502 template <class charT>
506 template <class charT, class traits>
509 template<class traits>
512 template <class charT, class traits>
515 template <class... Types>
517 #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
521 template <
class Elem,
class Traits,
class Alloc>
529 #endif // DOCTEST_CONFIG_USE_STD_HEADERS
531 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
532 #include <type_traits>
533 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
541 #ifndef DOCTEST_CONFIG_STRING_SIZE_TYPE
542 #define DOCTEST_CONFIG_STRING_SIZE_TYPE unsigned
586 char* allocate(size_type sz);
588 bool isOnStack() const noexcept {
return (buf[last] & 128) == 0; }
589 void setOnHeap() noexcept;
590 void setLast(size_type in = last) noexcept;
591 void setSize(size_type sz) noexcept;
593 void copy(const
String& other);
619 const
char* c_str()
const {
return const_cast<String*
>(
this)->
c_str(); }
622 return reinterpret_cast<char*
>(buf);
627 size_type size()
const;
628 size_type capacity()
const;
630 String substr(size_type pos, size_type cnt = npos) &&;
631 String substr(size_type pos, size_type cnt = npos)
const &;
633 size_type find(
char ch, size_type pos = 0)
const;
634 size_type rfind(
char ch, size_type pos = npos)
const;
636 int compare(
const char* other,
bool no_case =
false)
const;
637 int compare(
const String& other,
bool no_case =
false)
const;
655 bool checkWith(
const String& other)
const;
690 namespace assertType {
831 bool check(
const String& str) {
return isContains ? (content == str) : (content.string == str); }
836 } m_exception_string;
839 const char* exception_type,
const StringContains& exception_string);
920 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
923 template <
bool COND,
typename T =
void>
926 template <
typename T>
956 template <
typename T>
961 return static_cast<T&&
>(t);
966 return static_cast<T&&
>(t);
969 template <
typename T>
973 #if defined(_MSC_VER) && _MSC_VER <= 1900
974 template <
typename T,
typename =
void>
977 template <
typename T>
978 struct has_global_insertion_operator<T, decltype(::operator<<(declval<std::ostream&>(), declval<const T&>()), void())> : types::true_type { };
980 template <
typename T,
typename =
void>
981 struct has_insertion_operator {
static DOCTEST_CONSTEXPR bool value = has_global_insertion_operator<T>::value; };
983 template <
typename T,
bool global>
986 template <
typename T>
987 struct insert_hack<T, true> {
988 static void insert(
std::ostream& os,
const T& t) { ::operator<<(os, t); }
991 template <
typename T>
992 struct insert_hack<T, false> {
996 template <
typename T>
997 using insert_hack_t = insert_hack<T, has_global_insertion_operator<T>::value>;
999 template <
typename T,
typename =
void>
1003 template <
typename T>
1011 template <
typename T>
1013 #ifdef DOCTEST_CONFIG_REQUIRE_STRINGIFICATION_FOR_ALL_USED_TYPES
1020 template <
typename T>
1023 template <
typename T>
1028 template <
typename T,
size_t N>
1035 template <
typename T>
1044 template <
typename T>
1051 template <
typename T>
1053 detail::has_insertion_operator<T>::value || detail::types::is_pointer<T>::value || detail::types::is_array<T>::value>
1056 #ifndef DOCTEST_STRINGIFY
1057 #ifdef DOCTEST_CONFIG_DOUBLE_STRINGIFY
1058 #define DOCTEST_STRINGIFY(...) toString(toString(__VA_ARGS__))
1060 #define DOCTEST_STRINGIFY(...) toString(__VA_ARGS__)
1064 template <
typename T>
1066 #if DOCTEST_MSVC >= 0 && DOCTEST_CLANG == 0 && DOCTEST_GCC == 0
1067 String ret = __FUNCSIG__;
1071 String ret = __PRETTY_FUNCTION__;
1073 return ret.
substr(begin, ret.
size() - begin - 1);
1077 template <typename T, typename detail::types::enable_if<!detail::types::is_enum<T>::value,
bool>::type =
true>
1082 #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1084 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1086 #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
1113 template <typename T, typename detail::types::enable_if<detail::types::is_enum<T>::value,
bool>::type =
true>
1120 template <
typename T>
1124 #if defined(_MSC_VER) && _MSC_VER <= 1900
1125 insert_hack_t<T>::insert(*stream, in);
1134 template <typename T,
size_t N>
1138 for (
size_t i = 0; i < N; i++) {
1139 if (i != 0) { *stream <<
", "; }
1153 *stream <<
String(in, in[N - 1] ? N : N - 1);
1160 static void fill(
std::ostream* stream,
const void* in);
1163 template <
typename T>
1175 Approx operator()(
double value)
const;
1177 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
1178 template <
typename T>
1179 explicit Approx(
const T& value,
1181 static_cast<T*
>(
nullptr)) {
1182 *
this =
static_cast<double>(value);
1184 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
1188 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
1189 template <
typename T>
1190 typename std::enable_if<std::is_constructible<double, T>::value,
Approx&>::type
epsilon(
1191 const T& newEpsilon) {
1192 m_epsilon =
static_cast<double>(newEpsilon);
1195 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
1197 Approx& scale(
double newScale);
1199 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
1200 template <
typename T>
1201 typename std::enable_if<std::is_constructible<double, T>::value,
Approx&>::type scale(
1202 const T& newScale) {
1203 m_scale =
static_cast<double>(newScale);
1206 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
1222 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
1223 #define DOCTEST_APPROX_PREFIX \
1224 template <typename T> friend typename std::enable_if<std::is_constructible<double, T>::value, bool>::type
1230 DOCTEST_APPROX_PREFIX
operator<=(
const T& lhs,
const Approx& rhs) {
return static_cast<double>(lhs) < rhs.
m_value || lhs == rhs; }
1231 DOCTEST_APPROX_PREFIX
operator<=(
const Approx& lhs,
const T& rhs) {
return lhs.
m_value <
static_cast<double>(rhs) || lhs == rhs; }
1232 DOCTEST_APPROX_PREFIX
operator>=(
const T& lhs,
const Approx& rhs) {
return static_cast<double>(lhs) > rhs.
m_value || lhs == rhs; }
1233 DOCTEST_APPROX_PREFIX
operator>=(
const Approx& lhs,
const T& rhs) {
return lhs.
m_value >
static_cast<double>(rhs) || lhs == rhs; }
1234 DOCTEST_APPROX_PREFIX
operator< (
const T& lhs,
const Approx& rhs) {
return static_cast<double>(lhs) < rhs.
m_value && lhs != rhs; }
1235 DOCTEST_APPROX_PREFIX
operator< (
const Approx& lhs,
const T& rhs) {
return lhs.
m_value <
static_cast<double>(rhs) && lhs != rhs; }
1236 DOCTEST_APPROX_PREFIX
operator> (
const T& lhs,
const Approx& rhs) {
return static_cast<double>(lhs) > rhs.
m_value && lhs != rhs; }
1237 DOCTEST_APPROX_PREFIX
operator> (
const Approx& lhs,
const T& rhs) {
return lhs.
m_value >
static_cast<double>(rhs) && lhs != rhs; }
1238 #undef DOCTEST_APPROX_PREFIX
1239 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS
1252 template <
typename F>
1256 IsNaN(F f,
bool flip =
false) : value(
f), flipped(flip) { }
1258 operator bool()
const;
1269 #ifndef DOCTEST_CONFIG_DISABLE
1273 #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1274 template<
class T>
struct decay_array {
using type = T; };
1275 template<
class T,
unsigned N>
struct decay_array<T[N]> {
using type = T*; };
1276 template<
class T>
struct decay_array<T[]> {
using type = T*; };
1278 template<
class T>
struct not_char_pointer {
static DOCTEST_CONSTEXPR value = 1; };
1279 template<>
struct not_char_pointer<char*> {
static DOCTEST_CONSTEXPR value = 0; };
1280 template<>
struct not_char_pointer<const char*> {
static DOCTEST_CONSTEXPR value = 0; };
1282 template<
class T>
struct can_use_op :
public not_char_pointer<typename decay_array<T>::type> {};
1283 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1292 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
1294 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
1300 bool m_entered =
false;
1309 operator bool()
const;
1312 bool checkFilters();
1315 template <
typename L,
typename R>
1321 #if DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 6, 0)
1329 #define SFINAE_OP(ret,op) decltype((void)(doctest::detail::declval<L>() op doctest::detail::declval<R>()),ret{})
1331 #define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro) \
1332 template <typename R> \
1333 DOCTEST_NOINLINE SFINAE_OP(Result,op) operator op(R&& rhs) { \
1334 bool res = op_macro(doctest::detail::forward<const L>(lhs), doctest::detail::forward<R>(rhs)); \
1335 if(m_at & assertType::is_false) \
1337 if(!res || doctest::getContextOptions()->success) \
1338 return Result(res, stringifyBinaryExpr(lhs, op_str, rhs)); \
1339 return Result(res); \
1345 #define DOCTEST_FORBIT_EXPRESSION(rt, op) \
1346 template <typename R> \
1347 rt& operator op(const R&) { \
1348 static_assert(deferred_false<R>::value, \
1349 "Expression Too Complex Please Rewrite As Binary Comparison!"); \
1386 #ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
1409 #endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
1412 #ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1413 #define DOCTEST_COMPARISON_RETURN_TYPE bool
1414 #else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1415 #define DOCTEST_COMPARISON_RETURN_TYPE typename types::enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type
1416 inline bool eq(
const char* lhs,
const char* rhs) {
return String(lhs) ==
String(rhs); }
1417 inline bool ne(
const char* lhs,
const char* rhs) {
return String(lhs) !=
String(rhs); }
1418 inline bool lt(
const char* lhs,
const char* rhs) {
return String(lhs) < String(rhs); }
1419 inline bool gt(
const char* lhs,
const char* rhs) {
return String(lhs) > String(rhs); }
1420 inline bool le(
const char* lhs,
const char* rhs) {
return String(lhs) <= String(rhs); }
1421 inline bool ge(
const char* lhs,
const char* rhs) {
return String(lhs) >= String(rhs); }
1422 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1425 #define DOCTEST_RELATIONAL_OP(name, op) \
1426 template <typename L, typename R> \
1427 DOCTEST_COMPARISON_RETURN_TYPE name(const DOCTEST_REF_WRAP(L) lhs, \
1428 const DOCTEST_REF_WRAP(R) rhs) { \
1429 return lhs op rhs; \
1439 #ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1440 #define DOCTEST_CMP_EQ(l, r) l == r
1441 #define DOCTEST_CMP_NE(l, r) l != r
1442 #define DOCTEST_CMP_GT(l, r) l > r
1443 #define DOCTEST_CMP_LT(l, r) l < r
1444 #define DOCTEST_CMP_GE(l, r) l >= r
1445 #define DOCTEST_CMP_LE(l, r) l <= r
1446 #else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1447 #define DOCTEST_CMP_EQ(l, r) eq(l, r)
1448 #define DOCTEST_CMP_NE(l, r) ne(l, r)
1449 #define DOCTEST_CMP_GT(l, r) gt(l, r)
1450 #define DOCTEST_CMP_LT(l, r) lt(l, r)
1451 #define DOCTEST_CMP_GE(l, r) ge(l, r)
1452 #define DOCTEST_CMP_LE(l, r) le(l, r)
1453 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
1455 template <
typename L>
1457 struct Expression_lhs
1463 : lhs(static_cast<L&&>(in))
1469 bool res = static_cast<
bool>(lhs);
1482 operator L()
const {
return lhs; }
1516 #ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
1522 #endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION
1524 #if DOCTEST_CLANG && DOCTEST_CLANG < DOCTEST_COMPILER(3, 6, 0)
1538 template <
typename L>
1540 return Expression_lhs<L>(
static_cast<L&&
>(operand), m_at);
1543 template <typename L,typename types::enable_if<!doctest::detail::types::is_rvalue_reference<L>::value,
void >::type* =
nullptr>
1545 return Expression_lhs<const L&>(operand, m_at);
1551 const char* m_test_suite =
nullptr;
1552 const char* m_description =
nullptr;
1553 bool m_skip =
false;
1554 bool m_no_breaks =
false;
1555 bool m_no_output =
false;
1556 bool m_may_fail =
false;
1557 bool m_should_fail =
false;
1558 int m_expected_failures = 0;
1559 double m_timeout = 0;
1563 template <
typename T>
1592 TestCase& operator*(const
char* in);
1594 template <typename T>
1610 template<
typename T>
1613 namespace binaryAssertComparison {
1628 #define DOCTEST_BINARY_RELATIONAL_OP(n, op) \
1629 template <class L, class R> struct RelationalComparator<n, L, R> { bool operator()(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) const { return op(lhs, rhs); } };
1642 const char* exception_type =
"",
const String& exception_string =
"");
1645 const char* exception_type,
const Contains& exception_string);
1647 void setResult(
const Result& res);
1649 template <
int comparison,
typename L,
typename R>
1659 template <
typename L>
1664 m_failed = !m_failed;
1674 void translateException();
1680 namespace assertAction {
1692 const char* expr,
const Result& result);
1694 #define DOCTEST_ASSERT_OUT_OF_TESTS(decomp) \
1696 if(!is_running_in_test) { \
1698 ResultBuilder rb(at, file, line, expr); \
1699 rb.m_failed = failed; \
1700 rb.m_decomp = decomp; \
1701 failed_out_of_a_testing_context(rb); \
1702 if(isDebuggerActive() && !getContextOptions()->no_breaks) \
1703 DOCTEST_BREAK_INTO_DEBUGGER(); \
1704 if(checkIfShouldThrow(at)) \
1711 #define DOCTEST_ASSERT_IN_TESTS(decomp) \
1712 ResultBuilder rb(at, file, line, expr); \
1713 rb.m_failed = failed; \
1714 if(rb.m_failed || getContextOptions()->success) \
1715 rb.m_decomp = decomp; \
1717 DOCTEST_BREAK_INTO_DEBUGGER(); \
1718 if(rb.m_failed && checkIfShouldThrow(at)) \
1721 template <
int comparison,
typename L,
typename R>
1736 template <
typename L>
1756 virtual bool translate(
String&)
const = 0;
1759 template <
typename T>
1764 : m_translateFunction(translateFunction) {}
1767 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
1771 }
catch(
const T& ex) {
1772 res = m_translateFunction(ex);
1775 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
1776 static_cast<void>(res);
1801 bool need_to_destroy{
true};
1821 if (need_to_destroy) {
1830 bool logged =
false;
1844 template <typename T>
1852 template <
typename T>
1859 template <
typename T>
1866 template <
typename L>
1872 #define DOCTEST_DEFINE_DECORATOR(name, type, def) \
1876 name(type in = def) \
1878 void fill(detail::TestCase& state) const { state.DOCTEST_CAT(m_, name) = data; } \
1879 void fill(detail::TestSuite& state) const { state.DOCTEST_CAT(m_, name) = data; } \
1892 template <
typename T>
1910 #else // DOCTEST_CONFIG_DISABLE
1911 template <
typename T>
1915 #endif // DOCTEST_CONFIG_DISABLE
1919 struct ContextState;
1924 detail::ContextState*
p;
1926 void parseArgs(
int argc,
const char*
const* argv,
bool withDefaults =
false);
1929 explicit Context(
int argc = 0,
const char*
const* argv =
nullptr);
1939 void applyCommandLine(
int argc,
const char*
const* argv);
1941 void addFilter(
const char* filter,
const char* value);
1942 void clearFilters();
1943 void setOption(
const char* option,
bool value);
1944 void setOption(
const char* option,
int value);
1945 void setOption(
const char* option,
const char* value);
1949 void setAsDefaultForAssertsOutOfTestCases();
1958 namespace TestCaseFailureReason {
2004 unsigned num_data = 0;
2014 virtual void report_query(
const QueryData&) = 0;
2017 virtual void test_run_start() = 0;
2024 virtual void test_case_reenter(
const TestCaseData&) = 0;
2034 virtual void subcase_end() = 0;
2037 virtual void log_assert(
const AssertData&) = 0;
2043 virtual void test_case_skipped(
const TestCaseData&) = 0;
2048 static int get_num_active_contexts();
2052 static int get_num_stringified_contexts();
2053 static const String* get_stringified_contexts();
2061 template <
typename Reporter>
2063 return new Reporter(o);
2067 template <
typename Reporter>
2074 #ifdef DOCTEST_CONFIG_ASSERTS_RETURN_VALUES
2075 #define DOCTEST_FUNC_EMPTY [] { return false; }()
2077 #define DOCTEST_FUNC_EMPTY (void)0
2081 #ifndef DOCTEST_CONFIG_DISABLE
2083 #ifdef DOCTEST_CONFIG_ASSERTS_RETURN_VALUES
2084 #define DOCTEST_FUNC_SCOPE_BEGIN [&]
2085 #define DOCTEST_FUNC_SCOPE_END ()
2086 #define DOCTEST_FUNC_SCOPE_RET(v) return v
2088 #define DOCTEST_FUNC_SCOPE_BEGIN do
2089 #define DOCTEST_FUNC_SCOPE_END while(false)
2090 #define DOCTEST_FUNC_SCOPE_RET(v) (void)0
2094 #define DOCTEST_ASSERT_LOG_REACT_RETURN(b) \
2095 if(b.log()) DOCTEST_BREAK_INTO_DEBUGGER(); \
2097 DOCTEST_FUNC_SCOPE_RET(!b.m_failed)
2099 #ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
2100 #define DOCTEST_WRAP_IN_TRY(x) x;
2101 #else // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
2102 #define DOCTEST_WRAP_IN_TRY(x) \
2105 } catch(...) { DOCTEST_RB.translateException(); }
2106 #endif // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS
2108 #ifdef DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
2109 #define DOCTEST_CAST_TO_VOID(...) \
2110 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wuseless-cast") \
2111 static_cast<void>(__VA_ARGS__); \
2112 DOCTEST_GCC_SUPPRESS_WARNING_POP
2113 #else // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
2114 #define DOCTEST_CAST_TO_VOID(...) __VA_ARGS__;
2115 #endif // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS
2118 #define DOCTEST_REGISTER_FUNCTION(global_prefix, f, decorators) \
2119 global_prefix DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), \
2120 doctest::detail::regTest( \
2121 doctest::detail::TestCase( \
2122 f, __FILE__, __LINE__, \
2123 doctest_detail_test_suite_ns::getCurrentTestSuite()) * \
2126 #define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, decorators) \
2128 struct der : public base \
2132 static inline DOCTEST_NOINLINE void func() { \
2136 DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, func, decorators) \
2138 inline DOCTEST_NOINLINE void der::f() // NOLINT(misc-definitions-in-headers)
2140 #define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators) \
2142 DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, f, decorators) \
2145 #define DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(f, proxy, decorators) \
2146 static doctest::detail::funcType proxy() { return f; } \
2147 DOCTEST_REGISTER_FUNCTION(inline, proxy(), decorators) \
2151 #define DOCTEST_TEST_CASE(decorators) \
2152 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), decorators)
2155 #if DOCTEST_CPLUSPLUS >= 201703L
2156 #define DOCTEST_TEST_CASE_CLASS(decorators) \
2157 DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), \
2158 DOCTEST_ANONYMOUS(DOCTEST_ANON_PROXY_), \
2160 #else // DOCTEST_TEST_CASE_CLASS
2161 #define DOCTEST_TEST_CASE_CLASS(...) \
2162 TEST_CASES_CAN_BE_REGISTERED_IN_CLASSES_ONLY_IN_CPP17_MODE_OR_WITH_VS_2017_OR_NEWER
2163 #endif // DOCTEST_TEST_CASE_CLASS
2166 #define DOCTEST_TEST_CASE_FIXTURE(c, decorators) \
2167 DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(DOCTEST_ANON_CLASS_), c, \
2168 DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), decorators)
2171 #define DOCTEST_TYPE_TO_STRING_AS(str, ...) \
2172 namespace doctest { \
2174 inline String toString<__VA_ARGS__>() { \
2178 static_assert(true, "")
2180 #define DOCTEST_TYPE_TO_STRING(...) DOCTEST_TYPE_TO_STRING_AS(#__VA_ARGS__, __VA_ARGS__)
2182 #define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, iter, func) \
2183 template <typename T> \
2184 static void func(); \
2186 template <typename Tuple> \
2188 template <typename Type, typename... Rest> \
2189 struct iter<std::tuple<Type, Rest...>> \
2191 iter(const char* file, unsigned line, int index) { \
2192 doctest::detail::regTest(doctest::detail::TestCase(func<Type>, file, line, \
2193 doctest_detail_test_suite_ns::getCurrentTestSuite(), \
2194 doctest::toString<Type>(), \
2195 int(line) * 1000 + index) \
2197 iter<std::tuple<Rest...>>(file, line, index + 1); \
2201 struct iter<std::tuple<>> \
2203 iter(const char*, unsigned, int) {} \
2206 template <typename T> \
2209 #define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(dec, T, id) \
2210 DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(id, ITERATOR), \
2211 DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_))
2213 #define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, anon, ...) \
2214 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY), \
2215 doctest::detail::instantiationHelper( \
2216 DOCTEST_CAT(id, ITERATOR)<__VA_ARGS__>(__FILE__, __LINE__, 0)))
2218 #define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...) \
2219 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), std::tuple<__VA_ARGS__>) \
2220 static_assert(true, "")
2222 #define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...) \
2223 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), __VA_ARGS__) \
2224 static_assert(true, "")
2226 #define DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, anon, ...) \
2227 DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(anon, ITERATOR), anon); \
2228 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(anon, anon, std::tuple<__VA_ARGS__>) \
2229 template <typename T> \
2232 #define DOCTEST_TEST_CASE_TEMPLATE(dec, T, ...) \
2233 DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_), __VA_ARGS__)
2236 #define DOCTEST_SUBCASE(name) \
2237 if(const doctest::detail::Subcase & DOCTEST_ANONYMOUS(DOCTEST_ANON_SUBCASE_) DOCTEST_UNUSED = \
2238 doctest::detail::Subcase(name, __FILE__, __LINE__))
2241 #define DOCTEST_TEST_SUITE_IMPL(decorators, ns_name) \
2242 namespace ns_name { namespace doctest_detail_test_suite_ns { \
2243 static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() noexcept { \
2244 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4640) \
2245 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors") \
2246 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wmissing-field-initializers") \
2247 static doctest::detail::TestSuite data{}; \
2248 static bool inited = false; \
2249 DOCTEST_MSVC_SUPPRESS_WARNING_POP \
2250 DOCTEST_CLANG_SUPPRESS_WARNING_POP \
2251 DOCTEST_GCC_SUPPRESS_WARNING_POP \
2262 #define DOCTEST_TEST_SUITE(decorators) \
2263 DOCTEST_TEST_SUITE_IMPL(decorators, DOCTEST_ANONYMOUS(DOCTEST_ANON_SUITE_))
2266 #define DOCTEST_TEST_SUITE_BEGIN(decorators) \
2267 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), \
2268 doctest::detail::setTestSuite(doctest::detail::TestSuite() * decorators)) \
2269 static_assert(true, "")
2272 #define DOCTEST_TEST_SUITE_END \
2273 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_VAR_), \
2274 doctest::detail::setTestSuite(doctest::detail::TestSuite() * "")) \
2275 using DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) = int
2278 #define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(translatorName, signature) \
2279 inline doctest::String translatorName(signature); \
2280 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_), \
2281 doctest::registerExceptionTranslator(translatorName)) \
2282 doctest::String translatorName(signature)
2284 #define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \
2285 DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_), \
2289 #define DOCTEST_REGISTER_REPORTER(name, priority, reporter) \
2290 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), \
2291 doctest::registerReporter<reporter>(name, priority, true)) \
2292 static_assert(true, "")
2295 #define DOCTEST_REGISTER_LISTENER(name, priority, reporter) \
2296 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(DOCTEST_ANON_REPORTER_), \
2297 doctest::registerReporter<reporter>(name, priority, false)) \
2298 static_assert(true, "")
2302 #define DOCTEST_INFO(...) \
2303 DOCTEST_INFO_IMPL(DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_), \
2304 DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_OTHER_), \
2308 #define DOCTEST_INFO_IMPL(mb_name, s_name, ...) \
2309 auto DOCTEST_ANONYMOUS(DOCTEST_CAPTURE_) = doctest::detail::MakeContextScope( \
2310 [&](std::ostream* s_name) { \
2311 doctest::detail::MessageBuilder mb_name(__FILE__, __LINE__, doctest::assertType::is_warn); \
2312 mb_name.m_stream = s_name; \
2313 mb_name * __VA_ARGS__; \
2316 #define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := ", x)
2318 #define DOCTEST_ADD_AT_IMPL(type, file, line, mb, ...) \
2319 DOCTEST_FUNC_SCOPE_BEGIN { \
2320 doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type); \
2323 DOCTEST_BREAK_INTO_DEBUGGER(); \
2325 } DOCTEST_FUNC_SCOPE_END
2328 #define DOCTEST_ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
2329 #define DOCTEST_ADD_FAIL_CHECK_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_check, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
2330 #define DOCTEST_ADD_FAIL_AT(file, line, ...) DOCTEST_ADD_AT_IMPL(is_require, file, line, DOCTEST_ANONYMOUS(DOCTEST_MESSAGE_), __VA_ARGS__)
2333 #define DOCTEST_MESSAGE(...) DOCTEST_ADD_MESSAGE_AT(__FILE__, __LINE__, __VA_ARGS__)
2334 #define DOCTEST_FAIL_CHECK(...) DOCTEST_ADD_FAIL_CHECK_AT(__FILE__, __LINE__, __VA_ARGS__)
2335 #define DOCTEST_FAIL(...) DOCTEST_ADD_FAIL_AT(__FILE__, __LINE__, __VA_ARGS__)
2337 #define DOCTEST_TO_LVALUE(...) __VA_ARGS__ // Not removed to keep backwards compatibility.
2339 #ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS
2341 #define DOCTEST_ASSERT_IMPLEMENT_2(assert_type, ...) \
2342 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \
2344 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
2345 __LINE__, #__VA_ARGS__); \
2346 DOCTEST_WRAP_IN_TRY(DOCTEST_RB.setResult( \
2347 doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \
2349 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB) \
2350 DOCTEST_CLANG_SUPPRESS_WARNING_POP
2352 #define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \
2353 DOCTEST_FUNC_SCOPE_BEGIN { \
2354 DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__); \
2355 } DOCTEST_FUNC_SCOPE_END // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
2357 #define DOCTEST_BINARY_ASSERT(assert_type, comp, ...) \
2358 DOCTEST_FUNC_SCOPE_BEGIN { \
2359 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
2360 __LINE__, #__VA_ARGS__); \
2361 DOCTEST_WRAP_IN_TRY( \
2362 DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>( \
2364 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
2365 } DOCTEST_FUNC_SCOPE_END
2367 #define DOCTEST_UNARY_ASSERT(assert_type, ...) \
2368 DOCTEST_FUNC_SCOPE_BEGIN { \
2369 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
2370 __LINE__, #__VA_ARGS__); \
2371 DOCTEST_WRAP_IN_TRY(DOCTEST_RB.unary_assert(__VA_ARGS__)) \
2372 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
2373 } DOCTEST_FUNC_SCOPE_END
2375 #else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
2378 #define DOCTEST_ASSERT_IMPLEMENT_2 DOCTEST_ASSERT_IMPLEMENT_1
2380 #define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \
2381 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \
2382 doctest::detail::decomp_assert( \
2383 doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, \
2384 doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \
2385 << __VA_ARGS__) DOCTEST_CLANG_SUPPRESS_WARNING_POP
2387 #define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...) \
2388 doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>( \
2389 doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__)
2391 #define DOCTEST_UNARY_ASSERT(assert_type, ...) \
2392 doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__, \
2393 #__VA_ARGS__, __VA_ARGS__)
2395 #endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS
2397 #define DOCTEST_WARN(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN, __VA_ARGS__)
2398 #define DOCTEST_CHECK(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK, __VA_ARGS__)
2399 #define DOCTEST_REQUIRE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE, __VA_ARGS__)
2400 #define DOCTEST_WARN_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN_FALSE, __VA_ARGS__)
2401 #define DOCTEST_CHECK_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK_FALSE, __VA_ARGS__)
2402 #define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__)
2405 #define DOCTEST_WARN_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } DOCTEST_FUNC_SCOPE_END
2406 #define DOCTEST_CHECK_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } DOCTEST_FUNC_SCOPE_END
2407 #define DOCTEST_REQUIRE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } DOCTEST_FUNC_SCOPE_END
2408 #define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
2409 #define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
2410 #define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } DOCTEST_FUNC_SCOPE_END
2413 #define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__)
2414 #define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__)
2415 #define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__)
2416 #define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__)
2417 #define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__)
2418 #define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__)
2419 #define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__)
2420 #define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__)
2421 #define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__)
2422 #define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__)
2423 #define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__)
2424 #define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__)
2425 #define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__)
2426 #define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__)
2427 #define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__)
2428 #define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__)
2429 #define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__)
2430 #define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__)
2432 #define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__)
2433 #define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__)
2434 #define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__)
2435 #define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__)
2436 #define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__)
2437 #define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__)
2439 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
2441 #define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, message, ...) \
2442 DOCTEST_FUNC_SCOPE_BEGIN { \
2443 if(!doctest::getContextOptions()->no_throw) { \
2444 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
2445 __LINE__, #expr, #__VA_ARGS__, message); \
2447 DOCTEST_CAST_TO_VOID(expr) \
2448 } catch(const typename doctest::detail::types::remove_const< \
2449 typename doctest::detail::types::remove_reference<__VA_ARGS__>::type>::type&) {\
2450 DOCTEST_RB.translateException(); \
2451 DOCTEST_RB.m_threw_as = true; \
2452 } catch(...) { DOCTEST_RB.translateException(); } \
2453 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
2455 DOCTEST_FUNC_SCOPE_RET(false); \
2457 } DOCTEST_FUNC_SCOPE_END
2459 #define DOCTEST_ASSERT_THROWS_WITH(expr, expr_str, assert_type, ...) \
2460 DOCTEST_FUNC_SCOPE_BEGIN { \
2461 if(!doctest::getContextOptions()->no_throw) { \
2462 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
2463 __LINE__, expr_str, "", __VA_ARGS__); \
2465 DOCTEST_CAST_TO_VOID(expr) \
2466 } catch(...) { DOCTEST_RB.translateException(); } \
2467 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
2469 DOCTEST_FUNC_SCOPE_RET(false); \
2471 } DOCTEST_FUNC_SCOPE_END
2473 #define DOCTEST_ASSERT_NOTHROW(assert_type, ...) \
2474 DOCTEST_FUNC_SCOPE_BEGIN { \
2475 doctest::detail::ResultBuilder DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \
2476 __LINE__, #__VA_ARGS__); \
2478 DOCTEST_CAST_TO_VOID(__VA_ARGS__) \
2479 } catch(...) { DOCTEST_RB.translateException(); } \
2480 DOCTEST_ASSERT_LOG_REACT_RETURN(DOCTEST_RB); \
2481 } DOCTEST_FUNC_SCOPE_END
2484 #define DOCTEST_WARN_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_WARN_THROWS, "")
2485 #define DOCTEST_CHECK_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_CHECK_THROWS, "")
2486 #define DOCTEST_REQUIRE_THROWS(...) DOCTEST_ASSERT_THROWS_WITH((__VA_ARGS__), #__VA_ARGS__, DT_REQUIRE_THROWS, "")
2488 #define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_AS, "", __VA_ARGS__)
2489 #define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_AS, "", __VA_ARGS__)
2490 #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_AS, "", __VA_ARGS__)
2492 #define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_WARN_THROWS_WITH, __VA_ARGS__)
2493 #define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_CHECK_THROWS_WITH, __VA_ARGS__)
2494 #define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, #expr, DT_REQUIRE_THROWS_WITH, __VA_ARGS__)
2496 #define DOCTEST_WARN_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_WITH_AS, message, __VA_ARGS__)
2497 #define DOCTEST_CHECK_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_WITH_AS, message, __VA_ARGS__)
2498 #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_WITH_AS, message, __VA_ARGS__)
2500 #define DOCTEST_WARN_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_WARN_NOTHROW, __VA_ARGS__)
2501 #define DOCTEST_CHECK_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_CHECK_NOTHROW, __VA_ARGS__)
2502 #define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_ASSERT_NOTHROW(DT_REQUIRE_NOTHROW, __VA_ARGS__)
2504 #define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
2505 #define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
2506 #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS(expr); } DOCTEST_FUNC_SCOPE_END
2507 #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
2508 #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
2509 #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } DOCTEST_FUNC_SCOPE_END
2510 #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
2511 #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
2512 #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH(expr, with); } DOCTEST_FUNC_SCOPE_END
2513 #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
2514 #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
2515 #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); } DOCTEST_FUNC_SCOPE_END
2516 #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_WARN_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
2517 #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_CHECK_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
2518 #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_SCOPE_BEGIN { DOCTEST_INFO(__VA_ARGS__); DOCTEST_REQUIRE_NOTHROW(expr); } DOCTEST_FUNC_SCOPE_END
2521 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
2527 #else // DOCTEST_CONFIG_DISABLE
2529 #define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, name) \
2531 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
2532 struct der : public base \
2535 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
2536 inline void der<DOCTEST_UNUSED_TEMPLATE_TYPE>::f()
2538 #define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, name) \
2539 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
2540 static inline void f()
2543 #define DOCTEST_TEST_CASE(name) \
2544 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
2547 #define DOCTEST_TEST_CASE_CLASS(name) \
2548 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
2551 #define DOCTEST_TEST_CASE_FIXTURE(x, name) \
2552 DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(DOCTEST_ANON_CLASS_), x, \
2553 DOCTEST_ANONYMOUS(DOCTEST_ANON_FUNC_), name)
2556 #define DOCTEST_TYPE_TO_STRING_AS(str, ...) static_assert(true, "")
2557 #define DOCTEST_TYPE_TO_STRING(...) static_assert(true, "")
2560 #define DOCTEST_TEST_CASE_TEMPLATE(name, type, ...) \
2561 template <typename type> \
2562 inline void DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_)()
2564 #define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, type, id) \
2565 template <typename type> \
2566 inline void DOCTEST_ANONYMOUS(DOCTEST_ANON_TMP_)()
2568 #define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...) static_assert(true, "")
2569 #define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...) static_assert(true, "")
2572 #define DOCTEST_SUBCASE(name)
2575 #define DOCTEST_TEST_SUITE(name) namespace // NOLINT
2578 #define DOCTEST_TEST_SUITE_BEGIN(name) static_assert(true, "")
2581 #define DOCTEST_TEST_SUITE_END using DOCTEST_ANONYMOUS(DOCTEST_ANON_FOR_SEMICOLON_) = int
2583 #define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \
2584 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \
2585 static inline doctest::String DOCTEST_ANONYMOUS(DOCTEST_ANON_TRANSLATOR_)(signature)
2587 #define DOCTEST_REGISTER_REPORTER(name, priority, reporter)
2588 #define DOCTEST_REGISTER_LISTENER(name, priority, reporter)
2590 #define DOCTEST_INFO(...) (static_cast<void>(0))
2591 #define DOCTEST_CAPTURE(x) (static_cast<void>(0))
2592 #define DOCTEST_ADD_MESSAGE_AT(file, line, ...) (static_cast<void>(0))
2593 #define DOCTEST_ADD_FAIL_CHECK_AT(file, line, ...) (static_cast<void>(0))
2594 #define DOCTEST_ADD_FAIL_AT(file, line, ...) (static_cast<void>(0))
2595 #define DOCTEST_MESSAGE(...) (static_cast<void>(0))
2596 #define DOCTEST_FAIL_CHECK(...) (static_cast<void>(0))
2597 #define DOCTEST_FAIL(...) (static_cast<void>(0))
2599 #if defined(DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED) \
2600 && defined(DOCTEST_CONFIG_ASSERTS_RETURN_VALUES)
2602 #define DOCTEST_WARN(...) [&] { return __VA_ARGS__; }()
2603 #define DOCTEST_CHECK(...) [&] { return __VA_ARGS__; }()
2604 #define DOCTEST_REQUIRE(...) [&] { return __VA_ARGS__; }()
2605 #define DOCTEST_WARN_FALSE(...) [&] { return !(__VA_ARGS__); }()
2606 #define DOCTEST_CHECK_FALSE(...) [&] { return !(__VA_ARGS__); }()
2607 #define DOCTEST_REQUIRE_FALSE(...) [&] { return !(__VA_ARGS__); }()
2609 #define DOCTEST_WARN_MESSAGE(cond, ...) [&] { return cond; }()
2610 #define DOCTEST_CHECK_MESSAGE(cond, ...) [&] { return cond; }()
2611 #define DOCTEST_REQUIRE_MESSAGE(cond, ...) [&] { return cond; }()
2612 #define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
2613 #define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
2614 #define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) [&] { return !(cond); }()
2618 #define DOCTEST_RELATIONAL_OP(name, op) \
2619 template <typename L, typename R> \
2620 bool name(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs) { return lhs op rhs; }
2631 #define DOCTEST_WARN_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
2632 #define DOCTEST_CHECK_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
2633 #define DOCTEST_REQUIRE_EQ(...) [&] { return doctest::detail::eq(__VA_ARGS__); }()
2634 #define DOCTEST_WARN_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
2635 #define DOCTEST_CHECK_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
2636 #define DOCTEST_REQUIRE_NE(...) [&] { return doctest::detail::ne(__VA_ARGS__); }()
2637 #define DOCTEST_WARN_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
2638 #define DOCTEST_CHECK_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
2639 #define DOCTEST_REQUIRE_LT(...) [&] { return doctest::detail::lt(__VA_ARGS__); }()
2640 #define DOCTEST_WARN_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
2641 #define DOCTEST_CHECK_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
2642 #define DOCTEST_REQUIRE_GT(...) [&] { return doctest::detail::gt(__VA_ARGS__); }()
2643 #define DOCTEST_WARN_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
2644 #define DOCTEST_CHECK_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
2645 #define DOCTEST_REQUIRE_LE(...) [&] { return doctest::detail::le(__VA_ARGS__); }()
2646 #define DOCTEST_WARN_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
2647 #define DOCTEST_CHECK_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
2648 #define DOCTEST_REQUIRE_GE(...) [&] { return doctest::detail::ge(__VA_ARGS__); }()
2649 #define DOCTEST_WARN_UNARY(...) [&] { return __VA_ARGS__; }()
2650 #define DOCTEST_CHECK_UNARY(...) [&] { return __VA_ARGS__; }()
2651 #define DOCTEST_REQUIRE_UNARY(...) [&] { return __VA_ARGS__; }()
2652 #define DOCTEST_WARN_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
2653 #define DOCTEST_CHECK_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
2654 #define DOCTEST_REQUIRE_UNARY_FALSE(...) [&] { return !(__VA_ARGS__); }()
2656 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
2658 #define DOCTEST_WARN_THROWS_WITH(expr, with, ...) [] { static_assert(false, "Exception translation is not available when doctest is disabled."); return false; }()
2659 #define DOCTEST_CHECK_THROWS_WITH(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
2660 #define DOCTEST_REQUIRE_THROWS_WITH(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
2661 #define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
2662 #define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
2663 #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
2665 #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
2666 #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
2667 #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH(,,)
2668 #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
2669 #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
2670 #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH(,,)
2672 #define DOCTEST_WARN_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
2673 #define DOCTEST_CHECK_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
2674 #define DOCTEST_REQUIRE_THROWS(...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
2675 #define DOCTEST_WARN_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
2676 #define DOCTEST_CHECK_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
2677 #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
2678 #define DOCTEST_WARN_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
2679 #define DOCTEST_CHECK_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
2680 #define DOCTEST_REQUIRE_NOTHROW(...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
2682 #define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
2683 #define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
2684 #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return false; } catch (...) { return true; } }()
2685 #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
2686 #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
2687 #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) [&] { try { expr; } catch (__VA_ARGS__) { return true; } catch (...) { } return false; }()
2688 #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
2689 #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
2690 #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) [&] { try { __VA_ARGS__; return true; } catch (...) { return false; } }()
2692 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
2694 #else // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED
2696 #define DOCTEST_WARN(...) DOCTEST_FUNC_EMPTY
2697 #define DOCTEST_CHECK(...) DOCTEST_FUNC_EMPTY
2698 #define DOCTEST_REQUIRE(...) DOCTEST_FUNC_EMPTY
2699 #define DOCTEST_WARN_FALSE(...) DOCTEST_FUNC_EMPTY
2700 #define DOCTEST_CHECK_FALSE(...) DOCTEST_FUNC_EMPTY
2701 #define DOCTEST_REQUIRE_FALSE(...) DOCTEST_FUNC_EMPTY
2703 #define DOCTEST_WARN_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
2704 #define DOCTEST_CHECK_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
2705 #define DOCTEST_REQUIRE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
2706 #define DOCTEST_WARN_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
2707 #define DOCTEST_CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
2708 #define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_FUNC_EMPTY
2710 #define DOCTEST_WARN_EQ(...) DOCTEST_FUNC_EMPTY
2711 #define DOCTEST_CHECK_EQ(...) DOCTEST_FUNC_EMPTY
2712 #define DOCTEST_REQUIRE_EQ(...) DOCTEST_FUNC_EMPTY
2713 #define DOCTEST_WARN_NE(...) DOCTEST_FUNC_EMPTY
2714 #define DOCTEST_CHECK_NE(...) DOCTEST_FUNC_EMPTY
2715 #define DOCTEST_REQUIRE_NE(...) DOCTEST_FUNC_EMPTY
2716 #define DOCTEST_WARN_GT(...) DOCTEST_FUNC_EMPTY
2717 #define DOCTEST_CHECK_GT(...) DOCTEST_FUNC_EMPTY
2718 #define DOCTEST_REQUIRE_GT(...) DOCTEST_FUNC_EMPTY
2719 #define DOCTEST_WARN_LT(...) DOCTEST_FUNC_EMPTY
2720 #define DOCTEST_CHECK_LT(...) DOCTEST_FUNC_EMPTY
2721 #define DOCTEST_REQUIRE_LT(...) DOCTEST_FUNC_EMPTY
2722 #define DOCTEST_WARN_GE(...) DOCTEST_FUNC_EMPTY
2723 #define DOCTEST_CHECK_GE(...) DOCTEST_FUNC_EMPTY
2724 #define DOCTEST_REQUIRE_GE(...) DOCTEST_FUNC_EMPTY
2725 #define DOCTEST_WARN_LE(...) DOCTEST_FUNC_EMPTY
2726 #define DOCTEST_CHECK_LE(...) DOCTEST_FUNC_EMPTY
2727 #define DOCTEST_REQUIRE_LE(...) DOCTEST_FUNC_EMPTY
2729 #define DOCTEST_WARN_UNARY(...) DOCTEST_FUNC_EMPTY
2730 #define DOCTEST_CHECK_UNARY(...) DOCTEST_FUNC_EMPTY
2731 #define DOCTEST_REQUIRE_UNARY(...) DOCTEST_FUNC_EMPTY
2732 #define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
2733 #define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
2734 #define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_FUNC_EMPTY
2736 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
2738 #define DOCTEST_WARN_THROWS(...) DOCTEST_FUNC_EMPTY
2739 #define DOCTEST_CHECK_THROWS(...) DOCTEST_FUNC_EMPTY
2740 #define DOCTEST_REQUIRE_THROWS(...) DOCTEST_FUNC_EMPTY
2741 #define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
2742 #define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
2743 #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_FUNC_EMPTY
2744 #define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
2745 #define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
2746 #define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_FUNC_EMPTY
2747 #define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
2748 #define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
2749 #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_FUNC_EMPTY
2750 #define DOCTEST_WARN_NOTHROW(...) DOCTEST_FUNC_EMPTY
2751 #define DOCTEST_CHECK_NOTHROW(...) DOCTEST_FUNC_EMPTY
2752 #define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_FUNC_EMPTY
2754 #define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
2755 #define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
2756 #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
2757 #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
2758 #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
2759 #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_FUNC_EMPTY
2760 #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
2761 #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
2762 #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_FUNC_EMPTY
2763 #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
2764 #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
2765 #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_FUNC_EMPTY
2766 #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
2767 #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
2768 #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_FUNC_EMPTY
2770 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
2772 #endif // DOCTEST_CONFIG_EVALUATE_ASSERTS_EVEN_WHEN_DISABLED
2774 #endif // DOCTEST_CONFIG_DISABLE
2776 #ifdef DOCTEST_CONFIG_NO_EXCEPTIONS
2778 #ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
2779 #define DOCTEST_EXCEPTION_EMPTY_FUNC DOCTEST_FUNC_EMPTY
2780 #else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
2781 #define DOCTEST_EXCEPTION_EMPTY_FUNC [] { static_assert(false, "Exceptions are disabled! " \
2782 "Use DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS if you want to compile with exceptions disabled."); return false; }()
2784 #undef DOCTEST_REQUIRE
2785 #undef DOCTEST_REQUIRE_FALSE
2786 #undef DOCTEST_REQUIRE_MESSAGE
2787 #undef DOCTEST_REQUIRE_FALSE_MESSAGE
2788 #undef DOCTEST_REQUIRE_EQ
2789 #undef DOCTEST_REQUIRE_NE
2790 #undef DOCTEST_REQUIRE_GT
2791 #undef DOCTEST_REQUIRE_LT
2792 #undef DOCTEST_REQUIRE_GE
2793 #undef DOCTEST_REQUIRE_LE
2794 #undef DOCTEST_REQUIRE_UNARY
2795 #undef DOCTEST_REQUIRE_UNARY_FALSE
2797 #define DOCTEST_REQUIRE DOCTEST_EXCEPTION_EMPTY_FUNC
2798 #define DOCTEST_REQUIRE_FALSE DOCTEST_EXCEPTION_EMPTY_FUNC
2799 #define DOCTEST_REQUIRE_MESSAGE DOCTEST_EXCEPTION_EMPTY_FUNC
2800 #define DOCTEST_REQUIRE_FALSE_MESSAGE DOCTEST_EXCEPTION_EMPTY_FUNC
2801 #define DOCTEST_REQUIRE_EQ DOCTEST_EXCEPTION_EMPTY_FUNC
2802 #define DOCTEST_REQUIRE_NE DOCTEST_EXCEPTION_EMPTY_FUNC
2803 #define DOCTEST_REQUIRE_GT DOCTEST_EXCEPTION_EMPTY_FUNC
2804 #define DOCTEST_REQUIRE_LT DOCTEST_EXCEPTION_EMPTY_FUNC
2805 #define DOCTEST_REQUIRE_GE DOCTEST_EXCEPTION_EMPTY_FUNC
2806 #define DOCTEST_REQUIRE_LE DOCTEST_EXCEPTION_EMPTY_FUNC
2807 #define DOCTEST_REQUIRE_UNARY DOCTEST_EXCEPTION_EMPTY_FUNC
2808 #define DOCTEST_REQUIRE_UNARY_FALSE DOCTEST_EXCEPTION_EMPTY_FUNC
2810 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS
2812 #define DOCTEST_WARN_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
2813 #define DOCTEST_CHECK_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
2814 #define DOCTEST_REQUIRE_THROWS(...) DOCTEST_EXCEPTION_EMPTY_FUNC
2815 #define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2816 #define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2817 #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2818 #define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2819 #define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2820 #define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2821 #define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2822 #define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2823 #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2824 #define DOCTEST_WARN_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
2825 #define DOCTEST_CHECK_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
2826 #define DOCTEST_REQUIRE_NOTHROW(...) DOCTEST_EXCEPTION_EMPTY_FUNC
2828 #define DOCTEST_WARN_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2829 #define DOCTEST_CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2830 #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2831 #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2832 #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2833 #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2834 #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2835 #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2836 #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2837 #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2838 #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2839 #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2840 #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2841 #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2842 #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_EXCEPTION_EMPTY_FUNC
2844 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
2848 #define DOCTEST_FAST_WARN_EQ DOCTEST_WARN_EQ
2849 #define DOCTEST_FAST_CHECK_EQ DOCTEST_CHECK_EQ
2850 #define DOCTEST_FAST_REQUIRE_EQ DOCTEST_REQUIRE_EQ
2851 #define DOCTEST_FAST_WARN_NE DOCTEST_WARN_NE
2852 #define DOCTEST_FAST_CHECK_NE DOCTEST_CHECK_NE
2853 #define DOCTEST_FAST_REQUIRE_NE DOCTEST_REQUIRE_NE
2854 #define DOCTEST_FAST_WARN_GT DOCTEST_WARN_GT
2855 #define DOCTEST_FAST_CHECK_GT DOCTEST_CHECK_GT
2856 #define DOCTEST_FAST_REQUIRE_GT DOCTEST_REQUIRE_GT
2857 #define DOCTEST_FAST_WARN_LT DOCTEST_WARN_LT
2858 #define DOCTEST_FAST_CHECK_LT DOCTEST_CHECK_LT
2859 #define DOCTEST_FAST_REQUIRE_LT DOCTEST_REQUIRE_LT
2860 #define DOCTEST_FAST_WARN_GE DOCTEST_WARN_GE
2861 #define DOCTEST_FAST_CHECK_GE DOCTEST_CHECK_GE
2862 #define DOCTEST_FAST_REQUIRE_GE DOCTEST_REQUIRE_GE
2863 #define DOCTEST_FAST_WARN_LE DOCTEST_WARN_LE
2864 #define DOCTEST_FAST_CHECK_LE DOCTEST_CHECK_LE
2865 #define DOCTEST_FAST_REQUIRE_LE DOCTEST_REQUIRE_LE
2867 #define DOCTEST_FAST_WARN_UNARY DOCTEST_WARN_UNARY
2868 #define DOCTEST_FAST_CHECK_UNARY DOCTEST_CHECK_UNARY
2869 #define DOCTEST_FAST_REQUIRE_UNARY DOCTEST_REQUIRE_UNARY
2870 #define DOCTEST_FAST_WARN_UNARY_FALSE DOCTEST_WARN_UNARY_FALSE
2871 #define DOCTEST_FAST_CHECK_UNARY_FALSE DOCTEST_CHECK_UNARY_FALSE
2872 #define DOCTEST_FAST_REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE
2874 #define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id,__VA_ARGS__)
2879 #define DOCTEST_SCENARIO(name) DOCTEST_TEST_CASE(" Scenario: " name)
2880 #define DOCTEST_SCENARIO_CLASS(name) DOCTEST_TEST_CASE_CLASS(" Scenario: " name)
2881 #define DOCTEST_SCENARIO_TEMPLATE(name, T, ...) DOCTEST_TEST_CASE_TEMPLATE(" Scenario: " name, T, __VA_ARGS__)
2882 #define DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(" Scenario: " name, T, id)
2884 #define DOCTEST_GIVEN(name) DOCTEST_SUBCASE(" Given: " name)
2885 #define DOCTEST_WHEN(name) DOCTEST_SUBCASE(" When: " name)
2886 #define DOCTEST_AND_WHEN(name) DOCTEST_SUBCASE("And when: " name)
2887 #define DOCTEST_THEN(name) DOCTEST_SUBCASE(" Then: " name)
2888 #define DOCTEST_AND_THEN(name) DOCTEST_SUBCASE(" And: " name)
2892 #ifndef DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
2894 #define TEST_CASE(name) DOCTEST_TEST_CASE(name)
2895 #define TEST_CASE_CLASS(name) DOCTEST_TEST_CASE_CLASS(name)
2896 #define TEST_CASE_FIXTURE(x, name) DOCTEST_TEST_CASE_FIXTURE(x, name)
2897 #define TYPE_TO_STRING_AS(str, ...) DOCTEST_TYPE_TO_STRING_AS(str, __VA_ARGS__)
2898 #define TYPE_TO_STRING(...) DOCTEST_TYPE_TO_STRING(__VA_ARGS__)
2899 #define TEST_CASE_TEMPLATE(name, T, ...) DOCTEST_TEST_CASE_TEMPLATE(name, T, __VA_ARGS__)
2900 #define TEST_CASE_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, T, id)
2901 #define TEST_CASE_TEMPLATE_INVOKE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, __VA_ARGS__)
2902 #define TEST_CASE_TEMPLATE_APPLY(id, ...) DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, __VA_ARGS__)
2903 #define SUBCASE(name) DOCTEST_SUBCASE(name)
2904 #define TEST_SUITE(decorators) DOCTEST_TEST_SUITE(decorators)
2905 #define TEST_SUITE_BEGIN(name) DOCTEST_TEST_SUITE_BEGIN(name)
2906 #define TEST_SUITE_END DOCTEST_TEST_SUITE_END
2907 #define REGISTER_EXCEPTION_TRANSLATOR(signature) DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature)
2908 #define REGISTER_REPORTER(name, priority, reporter) DOCTEST_REGISTER_REPORTER(name, priority, reporter)
2909 #define REGISTER_LISTENER(name, priority, reporter) DOCTEST_REGISTER_LISTENER(name, priority, reporter)
2910 #define INFO(...) DOCTEST_INFO(__VA_ARGS__)
2911 #define CAPTURE(x) DOCTEST_CAPTURE(x)
2912 #define ADD_MESSAGE_AT(file, line, ...) DOCTEST_ADD_MESSAGE_AT(file, line, __VA_ARGS__)
2913 #define ADD_FAIL_CHECK_AT(file, line, ...) DOCTEST_ADD_FAIL_CHECK_AT(file, line, __VA_ARGS__)
2914 #define ADD_FAIL_AT(file, line, ...) DOCTEST_ADD_FAIL_AT(file, line, __VA_ARGS__)
2915 #define MESSAGE(...) DOCTEST_MESSAGE(__VA_ARGS__)
2916 #define FAIL_CHECK(...) DOCTEST_FAIL_CHECK(__VA_ARGS__)
2917 #define FAIL(...) DOCTEST_FAIL(__VA_ARGS__)
2918 #define TO_LVALUE(...) DOCTEST_TO_LVALUE(__VA_ARGS__)
2920 #define WARN(...) DOCTEST_WARN(__VA_ARGS__)
2921 #define WARN_FALSE(...) DOCTEST_WARN_FALSE(__VA_ARGS__)
2922 #define WARN_THROWS(...) DOCTEST_WARN_THROWS(__VA_ARGS__)
2923 #define WARN_THROWS_AS(expr, ...) DOCTEST_WARN_THROWS_AS(expr, __VA_ARGS__)
2924 #define WARN_THROWS_WITH(expr, ...) DOCTEST_WARN_THROWS_WITH(expr, __VA_ARGS__)
2925 #define WARN_THROWS_WITH_AS(expr, with, ...) DOCTEST_WARN_THROWS_WITH_AS(expr, with, __VA_ARGS__)
2926 #define WARN_NOTHROW(...) DOCTEST_WARN_NOTHROW(__VA_ARGS__)
2927 #define CHECK(...) DOCTEST_CHECK(__VA_ARGS__)
2928 #define CHECK_FALSE(...) DOCTEST_CHECK_FALSE(__VA_ARGS__)
2929 #define CHECK_THROWS(...) DOCTEST_CHECK_THROWS(__VA_ARGS__)
2930 #define CHECK_THROWS_AS(expr, ...) DOCTEST_CHECK_THROWS_AS(expr, __VA_ARGS__)
2931 #define CHECK_THROWS_WITH(expr, ...) DOCTEST_CHECK_THROWS_WITH(expr, __VA_ARGS__)
2932 #define CHECK_THROWS_WITH_AS(expr, with, ...) DOCTEST_CHECK_THROWS_WITH_AS(expr, with, __VA_ARGS__)
2933 #define CHECK_NOTHROW(...) DOCTEST_CHECK_NOTHROW(__VA_ARGS__)
2934 #define REQUIRE(...) DOCTEST_REQUIRE(__VA_ARGS__)
2935 #define REQUIRE_FALSE(...) DOCTEST_REQUIRE_FALSE(__VA_ARGS__)
2936 #define REQUIRE_THROWS(...) DOCTEST_REQUIRE_THROWS(__VA_ARGS__)
2937 #define REQUIRE_THROWS_AS(expr, ...) DOCTEST_REQUIRE_THROWS_AS(expr, __VA_ARGS__)
2938 #define REQUIRE_THROWS_WITH(expr, ...) DOCTEST_REQUIRE_THROWS_WITH(expr, __VA_ARGS__)
2939 #define REQUIRE_THROWS_WITH_AS(expr, with, ...) DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, __VA_ARGS__)
2940 #define REQUIRE_NOTHROW(...) DOCTEST_REQUIRE_NOTHROW(__VA_ARGS__)
2942 #define WARN_MESSAGE(cond, ...) DOCTEST_WARN_MESSAGE(cond, __VA_ARGS__)
2943 #define WARN_FALSE_MESSAGE(cond, ...) DOCTEST_WARN_FALSE_MESSAGE(cond, __VA_ARGS__)
2944 #define WARN_THROWS_MESSAGE(expr, ...) DOCTEST_WARN_THROWS_MESSAGE(expr, __VA_ARGS__)
2945 #define WARN_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
2946 #define WARN_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
2947 #define WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
2948 #define WARN_NOTHROW_MESSAGE(expr, ...) DOCTEST_WARN_NOTHROW_MESSAGE(expr, __VA_ARGS__)
2949 #define CHECK_MESSAGE(cond, ...) DOCTEST_CHECK_MESSAGE(cond, __VA_ARGS__)
2950 #define CHECK_FALSE_MESSAGE(cond, ...) DOCTEST_CHECK_FALSE_MESSAGE(cond, __VA_ARGS__)
2951 #define CHECK_THROWS_MESSAGE(expr, ...) DOCTEST_CHECK_THROWS_MESSAGE(expr, __VA_ARGS__)
2952 #define CHECK_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
2953 #define CHECK_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
2954 #define CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
2955 #define CHECK_NOTHROW_MESSAGE(expr, ...) DOCTEST_CHECK_NOTHROW_MESSAGE(expr, __VA_ARGS__)
2956 #define REQUIRE_MESSAGE(cond, ...) DOCTEST_REQUIRE_MESSAGE(cond, __VA_ARGS__)
2957 #define REQUIRE_FALSE_MESSAGE(cond, ...) DOCTEST_REQUIRE_FALSE_MESSAGE(cond, __VA_ARGS__)
2958 #define REQUIRE_THROWS_MESSAGE(expr, ...) DOCTEST_REQUIRE_THROWS_MESSAGE(expr, __VA_ARGS__)
2959 #define REQUIRE_THROWS_AS_MESSAGE(expr, ex, ...) DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, __VA_ARGS__)
2960 #define REQUIRE_THROWS_WITH_MESSAGE(expr, with, ...) DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, __VA_ARGS__)
2961 #define REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, ...) DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, __VA_ARGS__)
2962 #define REQUIRE_NOTHROW_MESSAGE(expr, ...) DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, __VA_ARGS__)
2964 #define SCENARIO(name) DOCTEST_SCENARIO(name)
2965 #define SCENARIO_CLASS(name) DOCTEST_SCENARIO_CLASS(name)
2966 #define SCENARIO_TEMPLATE(name, T, ...) DOCTEST_SCENARIO_TEMPLATE(name, T, __VA_ARGS__)
2967 #define SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id)
2968 #define GIVEN(name) DOCTEST_GIVEN(name)
2969 #define WHEN(name) DOCTEST_WHEN(name)
2970 #define AND_WHEN(name) DOCTEST_AND_WHEN(name)
2971 #define THEN(name) DOCTEST_THEN(name)
2972 #define AND_THEN(name) DOCTEST_AND_THEN(name)
2974 #define WARN_EQ(...) DOCTEST_WARN_EQ(__VA_ARGS__)
2975 #define CHECK_EQ(...) DOCTEST_CHECK_EQ(__VA_ARGS__)
2976 #define REQUIRE_EQ(...) DOCTEST_REQUIRE_EQ(__VA_ARGS__)
2977 #define WARN_NE(...) DOCTEST_WARN_NE(__VA_ARGS__)
2978 #define CHECK_NE(...) DOCTEST_CHECK_NE(__VA_ARGS__)
2979 #define REQUIRE_NE(...) DOCTEST_REQUIRE_NE(__VA_ARGS__)
2980 #define WARN_GT(...) DOCTEST_WARN_GT(__VA_ARGS__)
2981 #define CHECK_GT(...) DOCTEST_CHECK_GT(__VA_ARGS__)
2982 #define REQUIRE_GT(...) DOCTEST_REQUIRE_GT(__VA_ARGS__)
2983 #define WARN_LT(...) DOCTEST_WARN_LT(__VA_ARGS__)
2984 #define CHECK_LT(...) DOCTEST_CHECK_LT(__VA_ARGS__)
2985 #define REQUIRE_LT(...) DOCTEST_REQUIRE_LT(__VA_ARGS__)
2986 #define WARN_GE(...) DOCTEST_WARN_GE(__VA_ARGS__)
2987 #define CHECK_GE(...) DOCTEST_CHECK_GE(__VA_ARGS__)
2988 #define REQUIRE_GE(...) DOCTEST_REQUIRE_GE(__VA_ARGS__)
2989 #define WARN_LE(...) DOCTEST_WARN_LE(__VA_ARGS__)
2990 #define CHECK_LE(...) DOCTEST_CHECK_LE(__VA_ARGS__)
2991 #define REQUIRE_LE(...) DOCTEST_REQUIRE_LE(__VA_ARGS__)
2992 #define WARN_UNARY(...) DOCTEST_WARN_UNARY(__VA_ARGS__)
2993 #define CHECK_UNARY(...) DOCTEST_CHECK_UNARY(__VA_ARGS__)
2994 #define REQUIRE_UNARY(...) DOCTEST_REQUIRE_UNARY(__VA_ARGS__)
2995 #define WARN_UNARY_FALSE(...) DOCTEST_WARN_UNARY_FALSE(__VA_ARGS__)
2996 #define CHECK_UNARY_FALSE(...) DOCTEST_CHECK_UNARY_FALSE(__VA_ARGS__)
2997 #define REQUIRE_UNARY_FALSE(...) DOCTEST_REQUIRE_UNARY_FALSE(__VA_ARGS__)
3000 #define FAST_WARN_EQ(...) DOCTEST_FAST_WARN_EQ(__VA_ARGS__)
3001 #define FAST_CHECK_EQ(...) DOCTEST_FAST_CHECK_EQ(__VA_ARGS__)
3002 #define FAST_REQUIRE_EQ(...) DOCTEST_FAST_REQUIRE_EQ(__VA_ARGS__)
3003 #define FAST_WARN_NE(...) DOCTEST_FAST_WARN_NE(__VA_ARGS__)
3004 #define FAST_CHECK_NE(...) DOCTEST_FAST_CHECK_NE(__VA_ARGS__)
3005 #define FAST_REQUIRE_NE(...) DOCTEST_FAST_REQUIRE_NE(__VA_ARGS__)
3006 #define FAST_WARN_GT(...) DOCTEST_FAST_WARN_GT(__VA_ARGS__)
3007 #define FAST_CHECK_GT(...) DOCTEST_FAST_CHECK_GT(__VA_ARGS__)
3008 #define FAST_REQUIRE_GT(...) DOCTEST_FAST_REQUIRE_GT(__VA_ARGS__)
3009 #define FAST_WARN_LT(...) DOCTEST_FAST_WARN_LT(__VA_ARGS__)
3010 #define FAST_CHECK_LT(...) DOCTEST_FAST_CHECK_LT(__VA_ARGS__)
3011 #define FAST_REQUIRE_LT(...) DOCTEST_FAST_REQUIRE_LT(__VA_ARGS__)
3012 #define FAST_WARN_GE(...) DOCTEST_FAST_WARN_GE(__VA_ARGS__)
3013 #define FAST_CHECK_GE(...) DOCTEST_FAST_CHECK_GE(__VA_ARGS__)
3014 #define FAST_REQUIRE_GE(...) DOCTEST_FAST_REQUIRE_GE(__VA_ARGS__)
3015 #define FAST_WARN_LE(...) DOCTEST_FAST_WARN_LE(__VA_ARGS__)
3016 #define FAST_CHECK_LE(...) DOCTEST_FAST_CHECK_LE(__VA_ARGS__)
3017 #define FAST_REQUIRE_LE(...) DOCTEST_FAST_REQUIRE_LE(__VA_ARGS__)
3019 #define FAST_WARN_UNARY(...) DOCTEST_FAST_WARN_UNARY(__VA_ARGS__)
3020 #define FAST_CHECK_UNARY(...) DOCTEST_FAST_CHECK_UNARY(__VA_ARGS__)
3021 #define FAST_REQUIRE_UNARY(...) DOCTEST_FAST_REQUIRE_UNARY(__VA_ARGS__)
3022 #define FAST_WARN_UNARY_FALSE(...) DOCTEST_FAST_WARN_UNARY_FALSE(__VA_ARGS__)
3023 #define FAST_CHECK_UNARY_FALSE(...) DOCTEST_FAST_CHECK_UNARY_FALSE(__VA_ARGS__)
3024 #define FAST_REQUIRE_UNARY_FALSE(...) DOCTEST_FAST_REQUIRE_UNARY_FALSE(__VA_ARGS__)
3026 #define TEST_CASE_TEMPLATE_INSTANTIATE(id, ...) DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE(id, __VA_ARGS__)
3028 #endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES
3030 #ifndef DOCTEST_CONFIG_DISABLE
3035 #endif // DOCTEST_CONFIG_DISABLE
3043 #endif // DOCTEST_LIBRARY_INCLUDED
3045 #ifndef DOCTEST_SINGLE_HEADER
3046 #define DOCTEST_SINGLE_HEADER
3047 #endif // DOCTEST_SINGLE_HEADER
3049 #if defined(DOCTEST_CONFIG_IMPLEMENT) || !defined(DOCTEST_SINGLE_HEADER)
3051 #ifndef DOCTEST_SINGLE_HEADER
3052 #include "doctest_fwd.h"
3053 #endif // DOCTEST_SINGLE_HEADER
3057 #ifndef DOCTEST_LIBRARY_IMPLEMENTATION
3058 #define DOCTEST_LIBRARY_IMPLEMENTATION
3113 #endif // __BORLANDC__
3123 #include <algorithm>
3126 #ifndef DOCTEST_CONFIG_NO_MULTITHREADING
3129 #define DOCTEST_DECLARE_MUTEX(name) std::mutex name;
3130 #define DOCTEST_DECLARE_STATIC_MUTEX(name) static DOCTEST_DECLARE_MUTEX(name)
3131 #define DOCTEST_LOCK_MUTEX(name) std::lock_guard<std::mutex> DOCTEST_ANONYMOUS(DOCTEST_ANON_LOCK_)(name);
3132 #else // DOCTEST_CONFIG_NO_MULTITHREADING
3133 #define DOCTEST_DECLARE_MUTEX(name)
3134 #define DOCTEST_DECLARE_STATIC_MUTEX(name)
3135 #define DOCTEST_LOCK_MUTEX(name)
3136 #endif // DOCTEST_CONFIG_NO_MULTITHREADING
3139 #include <unordered_set>
3140 #include <exception>
3141 #include <stdexcept>
3148 #ifdef DOCTEST_PLATFORM_MAC
3149 #include <sys/types.h>
3151 #include <sys/sysctl.h>
3152 #endif // DOCTEST_PLATFORM_MAC
3154 #ifdef DOCTEST_PLATFORM_WINDOWS
3157 #ifndef WIN32_LEAN_AND_MEAN
3158 #define WIN32_LEAN_AND_MEAN
3159 #endif // WIN32_LEAN_AND_MEAN
3168 #include <windows.h>
3172 #else // DOCTEST_PLATFORM_WINDOWS
3174 #include <sys/time.h>
3177 #endif // DOCTEST_PLATFORM_WINDOWS
3181 #if !defined(HAVE_UNISTD_H) && !defined(STDOUT_FILENO)
3182 #define STDOUT_FILENO fileno(stdout)
3183 #endif // HAVE_UNISTD_H
3188 #define DOCTEST_COUNTOF(x) (sizeof(x) / sizeof(x[0]))
3190 #ifdef DOCTEST_CONFIG_DISABLE
3191 #define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_disabled
3192 #else // DOCTEST_CONFIG_DISABLE
3193 #define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_not_disabled
3194 #endif // DOCTEST_CONFIG_DISABLE
3196 #ifndef DOCTEST_CONFIG_OPTIONS_PREFIX
3197 #define DOCTEST_CONFIG_OPTIONS_PREFIX "dt-"
3200 #ifndef DOCTEST_THREAD_LOCAL
3201 #if defined(DOCTEST_CONFIG_NO_MULTITHREADING) || DOCTEST_MSVC && (DOCTEST_MSVC < DOCTEST_COMPILER(19, 0, 0))
3202 #define DOCTEST_THREAD_LOCAL
3203 #else // DOCTEST_MSVC
3204 #define DOCTEST_THREAD_LOCAL thread_local
3205 #endif // DOCTEST_MSVC
3206 #endif // DOCTEST_THREAD_LOCAL
3208 #ifndef DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES
3209 #define DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES 32
3212 #ifndef DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE
3213 #define DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE 64
3216 #ifdef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
3217 #define DOCTEST_OPTIONS_PREFIX_DISPLAY DOCTEST_CONFIG_OPTIONS_PREFIX
3219 #define DOCTEST_OPTIONS_PREFIX_DISPLAY ""
3222 #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
3223 #define DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
3226 #ifndef DOCTEST_CDECL
3227 #define DOCTEST_CDECL __cdecl
3235 using namespace detail;
3237 template <
typename Ex>
3239 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
3241 #else // DOCTEST_CONFIG_NO_EXCEPTIONS
3242 std::cerr <<
"doctest will terminate because it needed to throw an exception.\n"
3243 <<
"The message was: " << e.what() <<
'\n';
3245 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
3248 #ifndef DOCTEST_INTERNAL_ERROR
3249 #define DOCTEST_INTERNAL_ERROR(msg) \
3250 throw_exception(std::logic_error( \
3251 __FILE__ ":" DOCTEST_TOSTR(__LINE__) ": Internal doctest error: " msg))
3252 #endif // DOCTEST_INTERNAL_ERROR
3255 int stricmp(
const char* a,
const char* b) {
3257 const int d = tolower(*a) - tolower(*b);
3271 static Arch which() {
3274 auto ptr =
reinterpret_cast<char*
>(&x);
3283 DOCTEST_THREAD_LOCAL
class
3285 std::vector<std::streampos> stack;
3286 std::stringstream ss;
3290 stack.push_back(ss.tellp());
3296 DOCTEST_INTERNAL_ERROR(
"TLSS was empty when trying to pop!");
3298 std::streampos pos = stack.back();
3300 unsigned sz =
static_cast<unsigned>(ss.tellp() - pos);
3301 ss.rdbuf()->pubseekpos(pos, std::ios::in | std::ios::out);
3302 return String(ss, sz);
3307 return g_oss.push();
3314 #ifndef DOCTEST_CONFIG_DISABLE
3316 namespace timer_large_integer
3319 #if defined(DOCTEST_PLATFORM_WINDOWS)
3320 using type = ULONGLONG;
3321 #else // DOCTEST_PLATFORM_WINDOWS
3322 using type = std::uint64_t;
3323 #endif // DOCTEST_PLATFORM_WINDOWS
3326 using ticks_t = timer_large_integer::type;
3328 #ifdef DOCTEST_CONFIG_GETCURRENTTICKS
3329 ticks_t getCurrentTicks() {
return DOCTEST_CONFIG_GETCURRENTTICKS(); }
3330 #elif defined(DOCTEST_PLATFORM_WINDOWS)
3331 ticks_t getCurrentTicks() {
3332 static LARGE_INTEGER hz = { {0} }, hzo = { {0} };
3334 QueryPerformanceFrequency(&hz);
3335 QueryPerformanceCounter(&hzo);
3338 QueryPerformanceCounter(&t);
3339 return ((t.QuadPart - hzo.QuadPart) * LONGLONG(1000000)) / hz.QuadPart;
3341 #else // DOCTEST_PLATFORM_WINDOWS
3342 ticks_t getCurrentTicks() {
3344 gettimeofday(&t,
nullptr);
3345 return static_cast<ticks_t
>(t.tv_sec) * 1000000 +
static_cast<ticks_t
>(t.tv_usec);
3347 #endif // DOCTEST_PLATFORM_WINDOWS
3351 void start() { m_ticks = getCurrentTicks(); }
3352 unsigned int getElapsedMicroseconds()
const {
3353 return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
3358 double getElapsedSeconds()
const {
return static_cast<double>(getCurrentTicks() - m_ticks) / 1000000.0; }
3361 ticks_t m_ticks = 0;
3364 #ifdef DOCTEST_CONFIG_NO_MULTITHREADING
3365 template <
typename T>
3367 #else // DOCTEST_CONFIG_NO_MULTITHREADING
3368 template <
typename T>
3369 using Atomic = std::atomic<T>;
3370 #endif // DOCTEST_CONFIG_NO_MULTITHREADING
3372 #if defined(DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS) || defined(DOCTEST_CONFIG_NO_MULTITHREADING)
3373 template <
typename T>
3374 using MultiLaneAtomic = Atomic<T>;
3375 #else // DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
3386 template <
typename T>
3387 class MultiLaneAtomic
3389 struct CacheLineAlignedAtomic
3392 char padding[DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE -
sizeof(Atomic<T>)];
3394 CacheLineAlignedAtomic m_atomics[DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES];
3396 static_assert(
sizeof(CacheLineAlignedAtomic) == DOCTEST_MULTI_LANE_ATOMICS_CACHE_LINE_SIZE,
3397 "guarantee one atomic takes exactly one cache line");
3404 T fetch_add(T arg, std::memory_order order = std::memory_order_seq_cst)
DOCTEST_NOEXCEPT {
3405 return myAtomic().fetch_add(arg, order);
3408 T fetch_sub(T arg, std::memory_order order = std::memory_order_seq_cst)
DOCTEST_NOEXCEPT {
3409 return myAtomic().fetch_sub(arg, order);
3414 T load(std::memory_order order = std::memory_order_seq_cst)
const DOCTEST_NOEXCEPT {
3416 for(
auto const& c : m_atomics) {
3417 result += c.atomic.load(order);
3427 void store(T desired, std::memory_order order = std::memory_order_seq_cst)
DOCTEST_NOEXCEPT {
3429 for(
auto& c : m_atomics) {
3430 c.atomic.store(desired, order);
3449 static Atomic<size_t> laneCounter;
3450 DOCTEST_THREAD_LOCAL
size_t tlsLaneIdx =
3451 laneCounter++ % DOCTEST_MULTI_LANE_ATOMICS_THREAD_LANES;
3453 return m_atomics[tlsLaneIdx].atomic;
3456 #endif // DOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS
3459 struct ContextState : ContextOptions, TestRunStats, CurrentTestCaseStats
3461 MultiLaneAtomic<int> numAssertsCurrentTest_atomic;
3462 MultiLaneAtomic<int> numAssertsFailedCurrentTest_atomic;
3464 std::vector<std::vector<String>> filters = decltype(filters)(9);
3466 std::vector<IReporter*> reporters_currently_used;
3472 std::vector<String> stringifiedContexts;
3476 std::vector<SubcaseSignature> subcaseStack;
3477 std::vector<SubcaseSignature> nextSubcaseStack;
3478 std::unordered_set<unsigned long long> fullyTraversedSubcases;
3479 size_t currentSubcaseDepth;
3480 Atomic<bool> shouldLogCurrentException;
3482 void resetRunData() {
3484 numTestCasesPassingFilters = 0;
3485 numTestSuitesPassingFilters = 0;
3486 numTestCasesFailed = 0;
3488 numAssertsFailed = 0;
3489 numAssertsCurrentTest = 0;
3490 numAssertsFailedCurrentTest = 0;
3493 void finalizeTestCaseData() {
3494 seconds = timer.getElapsedSeconds();
3497 numAsserts += numAssertsCurrentTest_atomic;
3498 numAssertsFailed += numAssertsFailedCurrentTest_atomic;
3499 numAssertsCurrentTest = numAssertsCurrentTest_atomic;
3500 numAssertsFailedCurrentTest = numAssertsFailedCurrentTest_atomic;
3502 if(numAssertsFailedCurrentTest)
3505 if(Approx(currentTest->m_timeout).epsilon(DBL_EPSILON) != 0 &&
3506 Approx(seconds).
epsilon(DBL_EPSILON) > currentTest->m_timeout)
3509 if(currentTest->m_should_fail) {
3515 }
else if(failure_flags && currentTest->m_may_fail) {
3517 }
else if(currentTest->m_expected_failures > 0) {
3518 if(numAssertsFailedCurrentTest == currentTest->m_expected_failures) {
3530 testCaseSuccess = !(failure_flags && !ok_to_fail);
3531 if(!testCaseSuccess)
3532 numTestCasesFailed++;
3536 ContextState* g_cs =
nullptr;
3541 DOCTEST_THREAD_LOCAL
bool g_no_colors;
3543 #endif // DOCTEST_CONFIG_DISABLE
3554 data.capacity = data.size + 1;
3555 data.ptr =
new char[data.capacity];
3556 data.ptr[sz] =
'\0';
3561 void String::setOnHeap() noexcept { *
reinterpret_cast<unsigned char*
>(&buf[last]) = 128; }
3564 if (isOnStack()) { buf[sz] =
'\0'; setLast(last - sz); }
3565 else { data.ptr[sz] =
'\0'; data.size = sz; }
3569 if(other.isOnStack()) {
3570 memcpy(buf, other.buf, len);
3572 memcpy(allocate(other.data.size), other.data.ptr, other.data.size);
3587 : String(in, strlen(in)) {}
3590 memcpy(allocate(in_size), in, in_size);
3594 in.read(allocate(in_size), in_size);
3600 if(
this != &other) {
3611 const size_type my_old_size = size();
3612 const size_type other_size = other.size();
3613 const size_type total_size = my_old_size + other_size;
3615 if(total_size < len) {
3617 memcpy(buf + my_old_size, other.c_str(), other_size + 1);
3619 setLast(last - total_size);
3622 char* temp =
new char[total_size + 1];
3624 memcpy(temp, buf, my_old_size);
3627 data.size = total_size;
3628 data.capacity = data.size + 1;
3631 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
3634 if(data.capacity > total_size) {
3636 data.size = total_size;
3637 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
3641 if(data.capacity <= total_size)
3642 data.capacity = total_size + 1;
3644 char* temp =
new char[data.capacity];
3646 memcpy(temp, data.ptr, my_old_size);
3650 data.size = total_size;
3653 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
3661 memcpy(buf, other.buf, len);
3662 other.buf[0] =
'\0';
3667 if(
this != &other) {
3670 memcpy(buf, other.buf, len);
3671 other.buf[0] =
'\0';
3678 return const_cast<String*
>(
this)->
operator[](i);
3683 return reinterpret_cast<char*
>(buf)[i];
3690 return last - (size_type(buf[last]) & 31);
3698 return data.capacity;
3702 cnt = std::min(cnt, size() - 1 - pos);
3703 char* cptr = c_str();
3704 memmove(cptr, cptr + pos, cnt);
3706 return std::move(*
this);
3710 cnt = std::min(cnt, size() - 1 - pos);
3711 return String{ c_str() + pos, cnt };
3715 const char* begin = c_str();
3716 const char* end = begin + size();
3717 const char* it = begin + pos;
3718 for (; it < end && *it != ch; it++);
3719 if (it < end) {
return static_cast<size_type
>(it - begin); }
3720 else {
return npos; }
3724 const char* begin = c_str();
3725 const char* it = begin + std::min(pos, size() - 1);
3726 for (; it >= begin && *it != ch; it--);
3727 if (it >= begin) {
return static_cast<size_type
>(it - begin); }
3728 else {
return npos; }
3733 return doctest::stricmp(c_str(), other);
3734 return std::strcmp(c_str(), other);
3738 return compare(other.c_str(), no_case);
3741 String
operator+(
const String& lhs,
const String& rhs) {
return String(lhs) += rhs; }
3743 bool operator==(
const String& lhs,
const String& rhs) {
return lhs.compare(rhs) == 0; }
3744 bool operator!=(
const String& lhs,
const String& rhs) {
return lhs.compare(rhs) != 0; }
3745 bool operator< (
const String& lhs,
const String& rhs) {
return lhs.compare(rhs) < 0; }
3746 bool operator> (
const String& lhs,
const String& rhs) {
return lhs.compare(rhs) > 0; }
3747 bool operator<=(
const String& lhs,
const String& rhs) {
return (lhs != rhs) ? lhs.compare(rhs) < 0 :
true; }
3748 bool operator>=(
const String& lhs,
const String& rhs) {
return (lhs != rhs) ? lhs.compare(rhs) > 0 :
true; }
3755 return strstr(other.c_str(),
string.c_str()) !=
nullptr;
3758 String
toString(
const Contains& in) {
3759 return "Contains( " + in.string +
" )";
3762 bool operator==(
const String& lhs,
const Contains& rhs) {
return rhs.checkWith(lhs); }
3763 bool operator==(
const Contains& lhs,
const String& rhs) {
return lhs.checkWith(rhs); }
3764 bool operator!=(
const String& lhs,
const Contains& rhs) {
return !rhs.checkWith(lhs); }
3765 bool operator!=(
const Contains& lhs,
const String& rhs) {
return !lhs.checkWith(rhs); }
3773 color_to_stream(
s, code);
3781 #define DOCTEST_GENERATE_ASSERT_TYPE_CASE(assert_type) case assertType::DT_ ## assert_type: return #assert_type
3782 #define DOCTEST_GENERATE_ASSERT_TYPE_CASES(assert_type) \
3783 DOCTEST_GENERATE_ASSERT_TYPE_CASE(WARN_ ## assert_type); \
3784 DOCTEST_GENERATE_ASSERT_TYPE_CASE(CHECK_ ## assert_type); \
3785 DOCTEST_GENERATE_ASSERT_TYPE_CASE(REQUIRE_ ## assert_type)
3787 DOCTEST_GENERATE_ASSERT_TYPE_CASE(
WARN);
3788 DOCTEST_GENERATE_ASSERT_TYPE_CASE(
CHECK);
3789 DOCTEST_GENERATE_ASSERT_TYPE_CASE(
REQUIRE);
3791 DOCTEST_GENERATE_ASSERT_TYPE_CASES(FALSE);
3793 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS);
3795 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_AS);
3797 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_WITH);
3799 DOCTEST_GENERATE_ASSERT_TYPE_CASES(THROWS_WITH_AS);
3801 DOCTEST_GENERATE_ASSERT_TYPE_CASES(NOTHROW);
3803 DOCTEST_GENERATE_ASSERT_TYPE_CASES(EQ);
3804 DOCTEST_GENERATE_ASSERT_TYPE_CASES(NE);
3805 DOCTEST_GENERATE_ASSERT_TYPE_CASES(GT);
3806 DOCTEST_GENERATE_ASSERT_TYPE_CASES(LT);
3807 DOCTEST_GENERATE_ASSERT_TYPE_CASES(GE);
3808 DOCTEST_GENERATE_ASSERT_TYPE_CASES(LE);
3810 DOCTEST_GENERATE_ASSERT_TYPE_CASES(UNARY);
3811 DOCTEST_GENERATE_ASSERT_TYPE_CASES(UNARY_FALSE);
3813 default: DOCTEST_INTERNAL_ERROR(
"Tried stringifying invalid assert type!");
3825 return "FATAL ERROR";
3833 #ifndef DOCTEST_CONFIG_DISABLE
3835 auto back = std::strrchr(file,
'\\');
3836 auto forward = std::strrchr(file,
'/');
3843 #endif // DOCTEST_CONFIG_DISABLE
3850 return m_line == other.m_line
3851 && std::strcmp(m_file, other.m_file) == 0
3852 && m_name == other.m_name;
3856 if(m_line != other.m_line)
3857 return m_line < other.m_line;
3858 if(std::strcmp(m_file, other.m_file) != 0)
3859 return std::strcmp(m_file, other.m_file) < 0;
3860 return m_name.compare(other.m_name) < 0;
3867 if (in) { *stream << in; }
3868 else { *stream <<
"nullptr"; }
3871 template <
typename T>
3872 String toStreamLit(T t) {
3879 #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
3880 String
toString(
const char* in) {
return String(
"\"") + (in ? in :
"{null string}") +
"\""; }
3881 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING
3883 #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0)
3885 String
toString(
const std::string& in) {
return in.
c_str(); }
3888 String
toString(String in) {
return in; }
3892 String
toString(
bool in) {
return in ?
"true" :
"false"; }
3894 String
toString(
float in) {
return toStreamLit(in); }
3895 String
toString(
double in) {
return toStreamLit(in); }
3896 String
toString(
double long in) {
return toStreamLit(in); }
3898 String
toString(
char in) {
return toStreamLit(
static_cast<signed>(in)); }
3899 String
toString(
char signed in) {
return toStreamLit(
static_cast<signed>(in)); }
3900 String
toString(
char unsigned in) {
return toStreamLit(
static_cast<unsigned>(in)); }
3901 String
toString(
short in) {
return toStreamLit(in); }
3902 String
toString(
short unsigned in) {
return toStreamLit(in); }
3903 String
toString(
signed in) {
return toStreamLit(in); }
3904 String
toString(
unsigned in) {
return toStreamLit(in); }
3905 String
toString(
long in) {
return toStreamLit(in); }
3906 String
toString(
long unsigned in) {
return toStreamLit(in); }
3907 String
toString(
long long in) {
return toStreamLit(in); }
3908 String
toString(
long long unsigned in) {
return toStreamLit(in); }
3911 : m_epsilon(
static_cast<double>(std::numeric_limits<float>::epsilon()) * 100)
3916 Approx approx(value);
3917 approx.epsilon(m_epsilon);
3918 approx.scale(m_scale);
3923 m_epsilon = newEpsilon;
3931 bool operator==(
double lhs,
const Approx& rhs) {
3933 return std::fabs(lhs - rhs.m_value) <
3934 rhs.m_epsilon * (rhs.m_scale + std::max<double>(std::fabs(lhs), std::fabs(rhs.m_value)));
3939 bool operator<=(
double lhs,
const Approx& rhs) {
return lhs < rhs.m_value || lhs == rhs; }
3940 bool operator<=(
const Approx& lhs,
double rhs) {
return lhs.m_value < rhs || lhs == rhs; }
3941 bool operator>=(
double lhs,
const Approx& rhs) {
return lhs > rhs.m_value || lhs == rhs; }
3942 bool operator>=(
const Approx& lhs,
double rhs) {
return lhs.m_value > rhs || lhs == rhs; }
3943 bool operator<(
double lhs,
const Approx& rhs) {
return lhs < rhs.m_value && lhs != rhs; }
3944 bool operator<(
const Approx& lhs,
double rhs) {
return lhs.m_value < rhs && lhs != rhs; }
3945 bool operator>(
double lhs,
const Approx& rhs) {
return lhs > rhs.m_value && lhs != rhs; }
3946 bool operator>(
const Approx& lhs,
double rhs) {
return lhs.m_value > rhs && lhs != rhs; }
3948 String
toString(
const Approx& in) {
3951 const ContextOptions*
getContextOptions() {
return DOCTEST_BRANCH_ON_DISABLED(
nullptr, g_cs); }
3954 template <
typename F>
3955 IsNaN<F>::operator bool()
const {
3956 return std::isnan(value) ^ flipped;
3962 template <
typename F>
3963 String
toString(IsNaN<F> in) {
return String(in.flipped ?
"! " :
"") +
"IsNaN( " +
doctest::toString(in.value) +
" )"; }
3966 String
toString(IsNaN<double long> in) {
return toString<double long>(in); }
3970 #ifdef DOCTEST_CONFIG_DISABLE
3994 #else // DOCTEST_CONFIG_DISABLE
3996 #if !defined(DOCTEST_CONFIG_COLORS_NONE)
3997 #if !defined(DOCTEST_CONFIG_COLORS_WINDOWS) && !defined(DOCTEST_CONFIG_COLORS_ANSI)
3998 #ifdef DOCTEST_PLATFORM_WINDOWS
3999 #define DOCTEST_CONFIG_COLORS_WINDOWS
4001 #define DOCTEST_CONFIG_COLORS_ANSI
4003 #endif // DOCTEST_CONFIG_COLORS_WINDOWS && DOCTEST_CONFIG_COLORS_ANSI
4004 #endif // DOCTEST_CONFIG_COLORS_NONE
4020 reporterMap& getReporters() {
4021 static reporterMap data;
4024 reporterMap& getListeners() {
4025 static reporterMap data;
4030 #define DOCTEST_ITERATE_THROUGH_REPORTERS(function, ...) \
4031 for(auto& curr_rep : g_cs->reporters_currently_used) \
4032 curr_rep->function(__VA_ARGS__)
4040 (g_cs->numAssertsFailed + g_cs->numAssertsFailedCurrentTest_atomic) >=
4047 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
4049 g_cs->shouldLogCurrentException =
false;
4050 throw TestFailureException();
4052 #else // DOCTEST_CONFIG_NO_EXCEPTIONS
4054 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
4058 using namespace detail;
4061 int wildcmp(
const char* str,
const char* wild,
bool caseSensitive) {
4062 const char* cp = str;
4063 const char* mp = wild;
4065 while((*str) && (*wild !=
'*')) {
4066 if((caseSensitive ? (*wild != *str) : (tolower(*wild) != tolower(*str))) &&
4081 }
else if((caseSensitive ? (*wild == *str) : (tolower(*wild) == tolower(*str))) ||
4091 while(*wild ==
'*') {
4098 bool matchesAny(
const char* name,
const std::vector<String>& filters,
bool matchEmpty,
4099 bool caseSensitive) {
4100 if (filters.empty() && matchEmpty)
4102 for (
auto& curr : filters)
4103 if (wildcmp(name, curr.c_str(), caseSensitive))
4108 unsigned long long hash(
unsigned long long a,
unsigned long long b) {
4109 return (a << 5) + b;
4113 unsigned long long hash(
const char* str) {
4114 unsigned long long hash = 5381;
4116 while ((c = *str++))
4117 hash = ((hash << 5) + hash) + c;
4121 unsigned long long hash(
const SubcaseSignature& sig) {
4122 return hash(hash(hash(sig.m_file), hash(sig.m_name.c_str())), sig.m_line);
4125 unsigned long long hash(
const std::vector<SubcaseSignature>& sigs,
size_t count) {
4126 unsigned long long running = 0;
4127 auto end = sigs.begin() + count;
4128 for (
auto it = sigs.begin(); it != end; it++) {
4129 running = hash(running, hash(*it));
4134 unsigned long long hash(
const std::vector<SubcaseSignature>& sigs) {
4135 unsigned long long running = 0;
4136 for (
const SubcaseSignature& sig : sigs) {
4137 running = hash(running, hash(sig));
4144 if (g_cs->subcaseStack.size() <
size_t(g_cs->subcase_filter_levels)) {
4145 if (!matchesAny(m_signature.m_name.c_str(), g_cs->filters[6],
true, g_cs->case_sensitive))
4147 if (matchesAny(m_signature.m_name.c_str(), g_cs->filters[7],
false, g_cs->case_sensitive))
4154 : m_signature({name, file, line}) {
4155 if (!g_cs->reachedLeaf) {
4156 if (g_cs->nextSubcaseStack.size() <= g_cs->subcaseStack.size()
4157 || g_cs->nextSubcaseStack[g_cs->subcaseStack.size()] == m_signature) {
4159 if (checkFilters()) {
return; }
4161 g_cs->subcaseStack.push_back(m_signature);
4162 g_cs->currentSubcaseDepth++;
4164 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
4167 if (g_cs->subcaseStack[g_cs->currentSubcaseDepth] == m_signature) {
4169 g_cs->currentSubcaseDepth++;
4171 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
4172 }
else if (g_cs->nextSubcaseStack.size() <= g_cs->currentSubcaseDepth
4173 && g_cs->fullyTraversedSubcases.find(hash(hash(g_cs->subcaseStack, g_cs->currentSubcaseDepth), hash(m_signature)))
4174 == g_cs->fullyTraversedSubcases.end()) {
4175 if (checkFilters()) {
return; }
4177 g_cs->nextSubcaseStack.clear();
4178 g_cs->nextSubcaseStack.insert(g_cs->nextSubcaseStack.end(),
4179 g_cs->subcaseStack.begin(), g_cs->subcaseStack.begin() + g_cs->currentSubcaseDepth);
4180 g_cs->nextSubcaseStack.push_back(m_signature);
4189 Subcase::~Subcase() {
4191 g_cs->currentSubcaseDepth--;
4193 if (!g_cs->reachedLeaf) {
4195 g_cs->fullyTraversedSubcases.insert(hash(g_cs->subcaseStack));
4196 g_cs->nextSubcaseStack.clear();
4197 g_cs->reachedLeaf =
true;
4198 }
else if (g_cs->nextSubcaseStack.empty()) {
4200 g_cs->fullyTraversedSubcases.insert(hash(g_cs->subcaseStack));
4203 #if defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
4204 if(std::uncaught_exceptions() > 0
4206 if(std::uncaught_exception()
4208 && g_cs->shouldLogCurrentException) {
4209 DOCTEST_ITERATE_THROUGH_REPORTERS(
4210 test_case_exception, {
"exception thrown in subcase - will translate later "
4211 "when the whole test case has been exited (cannot "
4212 "translate while there is an active exception)",
4214 g_cs->shouldLogCurrentException =
false;
4217 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end,
DOCTEST_EMPTY);
4225 Subcase::operator bool()
const {
return m_entered; }
4227 Result::Result(
bool passed,
const String& decomposition)
4229 , m_decomp(decomposition) {}
4234 TestSuite& TestSuite::operator*(
const char* in) {
4240 const String& type,
int template_id) {
4244 m_test_suite = test_suite.m_test_suite;
4245 m_description = test_suite.m_description;
4246 m_skip = test_suite.m_skip;
4247 m_no_breaks = test_suite.m_no_breaks;
4248 m_no_output = test_suite.m_no_output;
4249 m_may_fail = test_suite.m_may_fail;
4250 m_should_fail = test_suite.m_should_fail;
4251 m_expected_failures = test_suite.m_expected_failures;
4252 m_timeout = test_suite.m_timeout;
4256 m_template_id = template_id;
4266 TestCaseData::operator=(other);
4267 m_test = other.m_test;
4268 m_type = other.m_type;
4269 m_template_id = other.m_template_id;
4270 m_full_name = other.m_full_name;
4272 if(m_template_id != -1)
4273 m_name = m_full_name.
c_str();
4278 TestCase& TestCase::operator*(
const char* in) {
4281 if(m_template_id != -1) {
4282 m_full_name = String(m_name) +
"<" + m_type +
">";
4284 m_name = m_full_name.
c_str();
4291 if(m_line != other.m_line)
4292 return m_line < other.m_line;
4293 const int name_cmp = strcmp(m_name, other.m_name);
4295 return name_cmp < 0;
4296 const int file_cmp = m_file.compare(other.m_file);
4298 return file_cmp < 0;
4299 return m_template_id < other.m_template_id;
4303 std::set<TestCase>& getRegisteredTests() {
4304 static std::set<TestCase> data;
4309 using namespace detail;
4314 const int res = lhs->m_file.compare(rhs->m_file,
bool(
DOCTEST_MSVC));
4317 if(lhs->m_line != rhs->m_line)
4318 return lhs->m_line < rhs->m_line;
4319 return lhs->m_template_id < rhs->m_template_id;
4324 const int res = std::strcmp(lhs->m_test_suite, rhs->m_test_suite);
4327 return fileOrderComparator(lhs, rhs);
4332 const int res = std::strcmp(lhs->m_name, rhs->m_name);
4335 return suiteOrderComparator(lhs, rhs);
4340 static_cast<void>(
s);
4341 static_cast<void>(code);
4342 #ifdef DOCTEST_CONFIG_COLORS_ANSI
4363 default: col =
"[0m";
4367 #endif // DOCTEST_CONFIG_COLORS_ANSI
4369 #ifdef DOCTEST_CONFIG_COLORS_WINDOWS
4374 static struct ConsoleHelper {
4375 HANDLE stdoutHandle;
4380 stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
4381 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
4382 GetConsoleScreenBufferInfo(stdoutHandle, &csbiInfo);
4383 origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |
4384 BACKGROUND_BLUE | BACKGROUND_INTENSITY);
4385 origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |
4386 FOREGROUND_BLUE | FOREGROUND_INTENSITY);
4390 #define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(ch.stdoutHandle, x | ch.origBgAttrs)
4394 case Color::White: DOCTEST_SET_ATTR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
break;
4395 case Color::Red: DOCTEST_SET_ATTR(FOREGROUND_RED);
break;
4396 case Color::Green: DOCTEST_SET_ATTR(FOREGROUND_GREEN);
break;
4397 case Color::Blue: DOCTEST_SET_ATTR(FOREGROUND_BLUE);
break;
4398 case Color::Cyan: DOCTEST_SET_ATTR(FOREGROUND_BLUE | FOREGROUND_GREEN);
break;
4399 case Color::Yellow: DOCTEST_SET_ATTR(FOREGROUND_RED | FOREGROUND_GREEN);
break;
4402 case Color::BrightRed: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_RED);
break;
4403 case Color::BrightGreen: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN);
break;
4404 case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
break;
4407 default: DOCTEST_SET_ATTR(ch.origFgAttrs);
4410 #endif // DOCTEST_CONFIG_COLORS_WINDOWS
4414 std::vector<const IExceptionTranslator*>& getExceptionTranslators() {
4415 static std::vector<const IExceptionTranslator*> data;
4419 String translateActiveException() {
4420 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
4422 auto& translators = getExceptionTranslators();
4423 for(
auto& curr : translators)
4424 if(curr->translate(res))
4430 }
catch(std::exception& ex) {
4432 }
catch(std::string& msg) {
4434 }
catch(
const char* msg) {
4437 return "unknown exception";
4441 #else // DOCTEST_CONFIG_NO_EXCEPTIONS
4443 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
4450 getRegisteredTests().insert(tc);
4460 #ifdef DOCTEST_IS_DEBUGGER_ACTIVE
4462 #else // DOCTEST_IS_DEBUGGER_ACTIVE
4463 #ifdef DOCTEST_PLATFORM_LINUX
4466 ErrnoGuard() : m_oldErrno(errno) {}
4467 ~ErrnoGuard() { errno = m_oldErrno; }
4475 std::ifstream in(
"/proc/self/status");
4476 for(std::string line; std::getline(in, line);) {
4477 static const int PREFIX_LEN = 11;
4478 if(line.compare(0, PREFIX_LEN,
"TracerPid:\t") == 0) {
4479 return line.length() > PREFIX_LEN && line[PREFIX_LEN] !=
'0';
4484 #elif defined(DOCTEST_PLATFORM_MAC)
4495 info.kp_proc.p_flag = 0;
4500 mib[2] = KERN_PROC_PID;
4503 size =
sizeof(
info);
4504 if(sysctl(mib, DOCTEST_COUNTOF(mib), &
info, &size, 0, 0) != 0) {
4505 std::cerr <<
"\nCall to sysctl failed - unable to determine if debugger is active **\n";
4509 return ((
info.kp_proc.p_flag & P_TRACED) != 0);
4511 #elif DOCTEST_MSVC || defined(__MINGW32__) || defined(__MINGW64__)
4516 #endif // DOCTEST_IS_DEBUGGER_ACTIVE
4519 if(std::find(getExceptionTranslators().begin(), getExceptionTranslators().end(), et) ==
4520 getExceptionTranslators().end())
4521 getExceptionTranslators().push_back(et);
4524 DOCTEST_THREAD_LOCAL std::vector<IContextScope*> g_infoContexts;
4526 ContextScopeBase::ContextScopeBase() {
4527 g_infoContexts.push_back(
this);
4530 ContextScopeBase::ContextScopeBase(ContextScopeBase&& other) noexcept {
4531 if (other.need_to_destroy) {
4534 other.need_to_destroy =
false;
4535 g_infoContexts.push_back(
this);
4545 void ContextScopeBase::destroy() {
4546 #if defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411L && (!defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101200)
4547 if(std::uncaught_exceptions() > 0) {
4549 if(std::uncaught_exception()) {
4551 std::ostringstream
s;
4552 this->stringify(&s);
4553 g_cs->stringifiedContexts.push_back(
s.str().c_str());
4555 g_infoContexts.pop_back();
4563 using namespace detail;
4565 #if !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && !defined(DOCTEST_CONFIG_WINDOWS_SEH)
4566 struct FatalConditionHandler
4568 static void reset() {}
4569 static void allocateAltStackMem() {}
4570 static void freeAltStackMem() {}
4572 #else // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
4574 void reportFatal(
const std::string&);
4576 #ifdef DOCTEST_PLATFORM_WINDOWS
4586 SignalDefs signalDefs[] = {
4587 {
static_cast<DWORD
>(EXCEPTION_ILLEGAL_INSTRUCTION),
4588 "SIGILL - Illegal instruction signal"},
4589 {
static_cast<DWORD
>(EXCEPTION_STACK_OVERFLOW),
"SIGSEGV - Stack overflow"},
4590 {
static_cast<DWORD
>(EXCEPTION_ACCESS_VIOLATION),
4591 "SIGSEGV - Segmentation violation signal"},
4592 {
static_cast<DWORD
>(EXCEPTION_INT_DIVIDE_BY_ZERO),
"Divide by zero error"},
4595 struct FatalConditionHandler
4597 static LONG CALLBACK handleException(PEXCEPTION_POINTERS ExceptionInfo) {
4600 DOCTEST_DECLARE_STATIC_MUTEX(mutex)
4603 DOCTEST_LOCK_MUTEX(mutex)
4605 bool reported =
false;
4606 for(
size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
4607 if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {
4608 reportFatal(signalDefs[i].name);
4613 if(reported ==
false)
4614 reportFatal(
"Unhandled SEH exception caught");
4620 std::exit(EXIT_FAILURE);
4623 static void allocateAltStackMem() {}
4624 static void freeAltStackMem() {}
4626 FatalConditionHandler() {
4630 guaranteeSize = 32 * 1024;
4632 previousTop = SetUnhandledExceptionFilter(handleException);
4634 SetThreadStackGuarantee(&guaranteeSize);
4642 original_terminate_handler = std::get_terminate();
4644 reportFatal(
"Terminate handler called");
4647 std::exit(EXIT_FAILURE);
4654 prev_sigabrt_handler = std::signal(SIGABRT, [](
int signal)
DOCTEST_NOEXCEPT {
4655 if(signal == SIGABRT) {
4656 reportFatal(
"SIGABRT - Abort (abnormal termination) signal");
4659 std::exit(EXIT_FAILURE);
4667 prev_error_mode_1 = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
4668 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
4670 prev_error_mode_2 = _set_error_mode(_OUT_TO_STDERR);
4673 prev_abort_behavior = _set_abort_behavior(0x0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
4678 prev_report_mode = _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
4679 prev_report_file = _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
4682 static void reset() {
4685 SetUnhandledExceptionFilter(previousTop);
4686 SetThreadStackGuarantee(&guaranteeSize);
4687 std::set_terminate(original_terminate_handler);
4688 std::signal(SIGABRT, prev_sigabrt_handler);
4689 SetErrorMode(prev_error_mode_1);
4690 _set_error_mode(prev_error_mode_2);
4691 _set_abort_behavior(prev_abort_behavior, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
4692 static_cast<void>(_CrtSetReportMode(_CRT_ASSERT, prev_report_mode));
4693 static_cast<void>(_CrtSetReportFile(_CRT_ASSERT, prev_report_file));
4698 ~FatalConditionHandler() { reset(); }
4701 static UINT prev_error_mode_1;
4702 static int prev_error_mode_2;
4703 static unsigned int prev_abort_behavior;
4704 static int prev_report_mode;
4705 static _HFILE prev_report_file;
4706 static void (DOCTEST_CDECL *prev_sigabrt_handler)(int);
4707 static std::terminate_handler original_terminate_handler;
4709 static ULONG guaranteeSize;
4710 static LPTOP_LEVEL_EXCEPTION_FILTER previousTop;
4713 UINT FatalConditionHandler::prev_error_mode_1;
4714 int FatalConditionHandler::prev_error_mode_2;
4715 unsigned int FatalConditionHandler::prev_abort_behavior;
4716 int FatalConditionHandler::prev_report_mode;
4717 _HFILE FatalConditionHandler::prev_report_file;
4718 void (DOCTEST_CDECL *FatalConditionHandler::prev_sigabrt_handler)(int);
4719 std::terminate_handler FatalConditionHandler::original_terminate_handler;
4720 bool FatalConditionHandler::isSet =
false;
4721 ULONG FatalConditionHandler::guaranteeSize = 0;
4722 LPTOP_LEVEL_EXCEPTION_FILTER FatalConditionHandler::previousTop =
nullptr;
4724 #else // DOCTEST_PLATFORM_WINDOWS
4731 SignalDefs signalDefs[] = {{SIGINT,
"SIGINT - Terminal interrupt signal"},
4732 {SIGILL,
"SIGILL - Illegal instruction signal"},
4733 {SIGFPE,
"SIGFPE - Floating point error signal"},
4734 {SIGSEGV,
"SIGSEGV - Segmentation violation signal"},
4735 {SIGTERM,
"SIGTERM - Termination request signal"},
4736 {SIGABRT,
"SIGABRT - Abort (abnormal termination) signal"}};
4738 struct FatalConditionHandler
4741 static struct sigaction oldSigActions[DOCTEST_COUNTOF(signalDefs)];
4742 static stack_t oldSigStack;
4743 static size_t altStackSize;
4744 static char* altStackMem;
4746 static void handleSignal(
int sig) {
4747 const char* name =
"<unknown signal>";
4748 for(
std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
4749 SignalDefs& def = signalDefs[i];
4760 static void allocateAltStackMem() {
4761 altStackMem =
new char[altStackSize];
4764 static void freeAltStackMem() {
4765 delete[] altStackMem;
4768 FatalConditionHandler() {
4771 sigStack.ss_sp = altStackMem;
4772 sigStack.ss_size = altStackSize;
4773 sigStack.ss_flags = 0;
4774 sigaltstack(&sigStack, &oldSigStack);
4775 struct sigaction sa = {};
4776 sa.sa_handler = handleSignal;
4777 sa.sa_flags = SA_ONSTACK;
4778 for(
std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
4779 sigaction(signalDefs[i].
id, &sa, &oldSigActions[i]);
4783 ~FatalConditionHandler() { reset(); }
4784 static void reset() {
4787 for(
std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
4788 sigaction(signalDefs[i].
id, &oldSigActions[i],
nullptr);
4791 sigaltstack(&oldSigStack,
nullptr);
4797 bool FatalConditionHandler::isSet =
false;
4798 struct sigaction FatalConditionHandler::oldSigActions[DOCTEST_COUNTOF(signalDefs)] = {};
4799 stack_t FatalConditionHandler::oldSigStack = {};
4800 size_t FatalConditionHandler::altStackSize = 4 * SIGSTKSZ;
4801 char* FatalConditionHandler::altStackMem =
nullptr;
4803 #endif // DOCTEST_PLATFORM_WINDOWS
4804 #endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
4809 using namespace detail;
4811 #ifdef DOCTEST_PLATFORM_WINDOWS
4812 #define DOCTEST_OUTPUT_DEBUG_STRING(text) ::OutputDebugStringA(text)
4815 #define DOCTEST_OUTPUT_DEBUG_STRING(text)
4820 g_cs->numAssertsCurrentTest_atomic++;
4825 g_cs->numAssertsFailedCurrentTest_atomic++;
4828 #if defined(DOCTEST_CONFIG_POSIX_SIGNALS) || defined(DOCTEST_CONFIG_WINDOWS_SEH)
4829 void reportFatal(
const std::string& message) {
4832 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception, {message.c_str(),
true});
4834 while (g_cs->subcaseStack.size()) {
4835 g_cs->subcaseStack.pop_back();
4836 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end,
DOCTEST_EMPTY);
4839 g_cs->finalizeTestCaseData();
4841 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
4843 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
4845 #endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH
4848 AssertData::AssertData(
assertType::Enum at,
const char* file,
int line,
const char* expr,
4849 const char* exception_type,
const StringContains& exception_string)
4850 : m_test_case(g_cs->currentTest), m_at(at), m_file(file), m_line(line), m_expr(expr),
4851 m_failed(true), m_threw(false), m_threw_as(false), m_exception_type(exception_type),
4852 m_exception_string(exception_string) {
4854 if (m_expr[0] ==
' ')
4860 ResultBuilder::ResultBuilder(
assertType::Enum at,
const char* file,
int line,
const char* expr,
4861 const char* exception_type,
const String& exception_string)
4862 : AssertData(at, file, line, expr, exception_type, exception_string) { }
4864 ResultBuilder::ResultBuilder(
assertType::Enum at,
const char* file,
int line,
const char* expr,
4865 const char* exception_type,
const Contains& exception_string)
4866 : AssertData(at, file, line, expr, exception_type, exception_string) { }
4868 void ResultBuilder::setResult(
const Result& res) {
4869 m_decomp = res.m_decomp;
4870 m_failed = !res.m_passed;
4873 void ResultBuilder::translateException() {
4875 m_exception = translateActiveException();
4878 bool ResultBuilder::log() {
4880 m_failed = !m_threw;
4882 m_failed = !m_threw_as || !m_exception_string.check(m_exception);
4884 m_failed = !m_threw_as;
4886 m_failed = !m_exception_string.check(m_exception);
4891 if(m_exception.size())
4892 m_exception =
"\"" + m_exception +
"\"";
4896 DOCTEST_ITERATE_THROUGH_REPORTERS(log_assert, *
this);
4899 addFailedAssert(m_at);
4900 }
else if(m_failed) {
4905 (g_cs->currentTest ==
nullptr || !g_cs->currentTest->m_no_breaks);
4908 void ResultBuilder::react()
const {
4921 const Result& result) {
4922 bool failed = !result.m_passed;
4933 MessageBuilder::MessageBuilder(
const char* file,
int line,
assertType::Enum severity) {
4937 m_severity = severity;
4940 MessageBuilder::~MessageBuilder() {
4947 bool MessageBuilder::log() {
4953 DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *
this);
4959 addAssert(m_severity);
4960 addFailedAssert(m_severity);
4964 (g_cs->currentTest ==
nullptr || !g_cs->currentTest->m_no_breaks);
4967 void MessageBuilder::react() {
4973 using namespace detail;
4984 enum ForWhat { ForTextNodes, ForAttributes };
4986 XmlEncode( std::string
const& str, ForWhat forWhat = ForTextNodes );
5000 class ScopedElement {
5002 ScopedElement( XmlWriter* writer );
5009 ScopedElement& writeText( std::string
const& text,
bool indent =
true );
5011 template<
typename T>
5012 ScopedElement& writeAttribute( std::string
const& name, T
const& attribute ) {
5013 m_writer->writeAttribute( name, attribute );
5018 mutable XmlWriter* m_writer =
nullptr;
5024 XmlWriter( XmlWriter
const& ) =
delete;
5025 XmlWriter& operator=( XmlWriter
const& ) =
delete;
5027 XmlWriter& startElement( std::string
const& name );
5029 ScopedElement scopedElement( std::string
const& name );
5031 XmlWriter& endElement();
5033 XmlWriter& writeAttribute( std::string
const& name, std::string
const& attribute );
5035 XmlWriter& writeAttribute( std::string
const& name,
const char* attribute );
5037 XmlWriter& writeAttribute( std::string
const& name,
bool attribute );
5039 template<
typename T>
5040 XmlWriter& writeAttribute( std::string
const& name, T
const& attribute ) {
5041 std::stringstream rss;
5043 return writeAttribute( name, rss.str() );
5046 XmlWriter& writeText( std::string
const& text,
bool indent =
true );
5054 void ensureTagClosed();
5056 void writeDeclaration();
5060 void newlineIfNecessary();
5062 bool m_tagIsOpen =
false;
5063 bool m_needsNewline =
false;
5064 std::vector<std::string> m_tags;
5065 std::string m_indent;
5074 using uchar =
unsigned char;
5078 size_t trailingBytes(
unsigned char c) {
5079 if ((c & 0xE0) == 0xC0) {
5082 if ((c & 0xF0) == 0xE0) {
5085 if ((c & 0xF8) == 0xF0) {
5088 DOCTEST_INTERNAL_ERROR(
"Invalid multibyte utf-8 start byte encountered");
5091 uint32_t headerValue(
unsigned char c) {
5092 if ((c & 0xE0) == 0xC0) {
5095 if ((c & 0xF0) == 0xE0) {
5098 if ((c & 0xF8) == 0xF0) {
5101 DOCTEST_INTERNAL_ERROR(
"Invalid multibyte utf-8 start byte encountered");
5104 void hexEscapeChar(
std::ostream& os,
unsigned char c) {
5105 std::ios_base::fmtflags
f(os.flags());
5107 << std::uppercase << std::hex << std::setfill(
'0') << std::setw(2)
5108 <<
static_cast<int>(c);
5114 XmlEncode::XmlEncode( std::string
const& str, ForWhat forWhat )
5116 m_forWhat( forWhat )
5123 for(
std::size_t idx = 0; idx < m_str.size(); ++ idx ) {
5124 uchar c = m_str[idx];
5126 case '<': os <<
"<";
break;
5127 case '&': os <<
"&";
break;
5131 if (idx > 2 && m_str[idx - 1] ==
']' && m_str[idx - 2] ==
']')
5138 if (m_forWhat == ForAttributes)
5149 if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {
5150 hexEscapeChar(os, c);
5168 hexEscapeChar(os, c);
5172 auto encBytes = trailingBytes(c);
5174 if (idx + encBytes - 1 >= m_str.size()) {
5175 hexEscapeChar(os, c);
5182 uint32_t value = headerValue(c);
5184 uchar nc = m_str[idx + n];
5185 valid &= ((nc & 0xC0) == 0x80);
5186 value = (value << 6) | (nc & 0x3F);
5194 ( value < 0x800 && encBytes > 2) ||
5195 (0x800 < value && value < 0x10000 && encBytes > 3) ||
5199 hexEscapeChar(os, c);
5205 os << m_str[idx + n];
5207 idx += encBytes - 1;
5214 xmlEncode.encodeTo( os );
5218 XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer )
5219 : m_writer( writer )
5222 XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other )
DOCTEST_NOEXCEPT
5223 : m_writer( other.m_writer ){
5224 other.m_writer =
nullptr;
5226 XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other )
DOCTEST_NOEXCEPT {
5228 m_writer->endElement();
5230 m_writer = other.m_writer;
5231 other.m_writer =
nullptr;
5236 XmlWriter::ScopedElement::~ScopedElement() {
5238 m_writer->endElement();
5241 XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string
const& text,
bool indent ) {
5242 m_writer->writeText( text, indent );
5251 XmlWriter::~XmlWriter() {
5252 while( !m_tags.empty() )
5256 XmlWriter& XmlWriter::startElement( std::string
const& name ) {
5258 newlineIfNecessary();
5259 m_os << m_indent <<
'<' << name;
5260 m_tags.push_back( name );
5266 XmlWriter::ScopedElement XmlWriter::scopedElement( std::string
const& name ) {
5267 ScopedElement scoped(
this );
5268 startElement( name );
5272 XmlWriter& XmlWriter::endElement() {
5273 newlineIfNecessary();
5274 m_indent = m_indent.substr( 0, m_indent.size()-2 );
5277 m_tagIsOpen =
false;
5280 m_os << m_indent <<
"</" << m_tags.back() <<
">";
5287 XmlWriter& XmlWriter::writeAttribute( std::string
const& name, std::string
const& attribute ) {
5288 if( !name.empty() && !attribute.empty() )
5289 m_os <<
' ' << name <<
"=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) <<
'"';
5293 XmlWriter& XmlWriter::writeAttribute( std::string
const& name,
const char* attribute ) {
5294 if( !name.empty() && attribute && attribute[0] !=
'\0' )
5295 m_os <<
' ' << name <<
"=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) <<
'"';
5299 XmlWriter& XmlWriter::writeAttribute( std::string
const& name,
bool attribute ) {
5300 m_os <<
' ' << name <<
"=\"" << ( attribute ?
"true" :
"false" ) <<
'"';
5304 XmlWriter& XmlWriter::writeText( std::string
const& text,
bool indent ) {
5305 if( !text.empty() ){
5306 bool tagWasOpen = m_tagIsOpen;
5308 if( tagWasOpen && indent )
5310 m_os << XmlEncode( text );
5311 m_needsNewline =
true;
5333 void XmlWriter::ensureTagClosed() {
5335 m_os <<
">" << std::endl;
5336 m_tagIsOpen =
false;
5340 void XmlWriter::writeDeclaration() {
5341 m_os <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
5344 void XmlWriter::newlineIfNecessary() {
5345 if( m_needsNewline ) {
5347 m_needsNewline =
false;
5357 struct XmlReporter :
public IReporter
5360 DOCTEST_DECLARE_MUTEX(mutex)
5363 const ContextOptions& opt;
5364 const TestCaseData* tc =
nullptr;
5366 XmlReporter(
const ContextOptions& co)
5370 void log_contexts() {
5371 int num_contexts = get_num_active_contexts();
5373 auto contexts = get_active_contexts();
5374 std::stringstream ss;
5375 for(
int i = 0; i < num_contexts; ++i) {
5376 contexts[i]->stringify(&ss);
5377 xml.scopedElement(
"Info").writeText(ss.str());
5383 unsigned line(
unsigned l)
const {
return opt.no_line_numbers ? 0 : l; }
5385 void test_case_start_impl(
const TestCaseData& in) {
5386 bool open_ts_tag =
false;
5388 if(std::strcmp(tc->m_test_suite, in.m_test_suite) != 0) {
5398 xml.startElement(
"TestSuite");
5399 xml.writeAttribute(
"name", in.m_test_suite);
5403 xml.startElement(
"TestCase")
5404 .writeAttribute(
"name", in.m_name)
5406 .writeAttribute(
"line", line(in.m_line))
5407 .writeAttribute(
"description", in.m_description);
5409 if(Approx(in.m_timeout) != 0)
5410 xml.writeAttribute(
"timeout", in.m_timeout);
5412 xml.writeAttribute(
"may_fail",
true);
5413 if(in.m_should_fail)
5414 xml.writeAttribute(
"should_fail",
true);
5421 void report_query(
const QueryData& in)
override {
5423 if(opt.list_reporters) {
5424 for(
auto& curr : getListeners())
5425 xml.scopedElement(
"Listener")
5426 .writeAttribute(
"priority", curr.first.first)
5427 .writeAttribute(
"name", curr.first.second);
5428 for(
auto& curr : getReporters())
5429 xml.scopedElement(
"Reporter")
5430 .writeAttribute(
"priority", curr.first.first)
5431 .writeAttribute(
"name", curr.first.second);
5432 }
else if(opt.count || opt.list_test_cases) {
5433 for(
unsigned i = 0; i < in.num_data; ++i) {
5434 xml.scopedElement(
"TestCase").writeAttribute(
"name", in.data[i]->m_name)
5435 .writeAttribute(
"testsuite", in.data[i]->m_test_suite)
5437 .writeAttribute(
"line", line(in.data[i]->m_line))
5438 .writeAttribute(
"skipped", in.data[i]->m_skip);
5440 xml.scopedElement(
"OverallResultsTestCases")
5441 .writeAttribute(
"unskipped", in.run_stats->numTestCasesPassingFilters);
5442 }
else if(opt.list_test_suites) {
5443 for(
unsigned i = 0; i < in.num_data; ++i)
5444 xml.scopedElement(
"TestSuite").writeAttribute(
"name", in.data[i]->m_test_suite);
5445 xml.scopedElement(
"OverallResultsTestCases")
5446 .writeAttribute(
"unskipped", in.run_stats->numTestCasesPassingFilters);
5447 xml.scopedElement(
"OverallResultsTestSuites")
5448 .writeAttribute(
"unskipped", in.run_stats->numTestSuitesPassingFilters);
5453 void test_run_start()
override {
5454 xml.writeDeclaration();
5458 #ifdef DOCTEST_PLATFORM_WINDOWS
5459 if(binary_name.rfind(
".exe") != std::string::npos)
5460 binary_name = binary_name.substr(0, binary_name.length() - 4);
5461 #endif // DOCTEST_PLATFORM_WINDOWS
5463 xml.startElement(
"doctest").writeAttribute(
"binary", binary_name);
5464 if(opt.no_version ==
false)
5468 xml.scopedElement(
"Options")
5469 .writeAttribute(
"order_by", opt.order_by.c_str())
5470 .writeAttribute(
"rand_seed", opt.rand_seed)
5471 .writeAttribute(
"first", opt.first)
5472 .writeAttribute(
"last", opt.last)
5473 .writeAttribute(
"abort_after", opt.abort_after)
5474 .writeAttribute(
"subcase_filter_levels", opt.subcase_filter_levels)
5475 .writeAttribute(
"case_sensitive", opt.case_sensitive)
5476 .writeAttribute(
"no_throw", opt.no_throw)
5477 .writeAttribute(
"no_skip", opt.no_skip);
5480 void test_run_end(
const TestRunStats& p)
override {
5484 xml.scopedElement(
"OverallResultsAsserts")
5485 .writeAttribute(
"successes", p.numAsserts - p.numAssertsFailed)
5486 .writeAttribute(
"failures", p.numAssertsFailed);
5488 xml.startElement(
"OverallResultsTestCases")
5489 .writeAttribute(
"successes",
5490 p.numTestCasesPassingFilters - p.numTestCasesFailed)
5491 .writeAttribute(
"failures", p.numTestCasesFailed);
5492 if(opt.no_skipped_summary ==
false)
5493 xml.writeAttribute(
"skipped", p.numTestCases - p.numTestCasesPassingFilters);
5499 void test_case_start(
const TestCaseData& in)
override {
5500 test_case_start_impl(in);
5501 xml.ensureTagClosed();
5504 void test_case_reenter(
const TestCaseData&)
override {}
5506 void test_case_end(
const CurrentTestCaseStats& st)
override {
5507 xml.startElement(
"OverallResultsAsserts")
5508 .writeAttribute(
"successes",
5509 st.numAssertsCurrentTest - st.numAssertsFailedCurrentTest)
5510 .writeAttribute(
"failures", st.numAssertsFailedCurrentTest)
5511 .writeAttribute(
"test_case_success", st.testCaseSuccess);
5513 xml.writeAttribute(
"duration", st.seconds);
5514 if(tc->m_expected_failures)
5515 xml.writeAttribute(
"expected_failures", tc->m_expected_failures);
5521 void test_case_exception(
const TestCaseException& e)
override {
5522 DOCTEST_LOCK_MUTEX(mutex)
5524 xml.scopedElement(
"Exception")
5525 .writeAttribute(
"crash", e.is_crash)
5526 .writeText(e.error_string.c_str());
5529 void subcase_start(
const SubcaseSignature& in)
override {
5530 xml.startElement(
"SubCase")
5531 .writeAttribute(
"name", in.m_name)
5533 .writeAttribute(
"line", line(in.m_line));
5534 xml.ensureTagClosed();
5537 void subcase_end()
override { xml.endElement(); }
5539 void log_assert(
const AssertData& rb)
override {
5540 if(!rb.m_failed && !opt.success)
5543 DOCTEST_LOCK_MUTEX(mutex)
5545 xml.startElement(
"Expression")
5546 .writeAttribute(
"success", !rb.m_failed)
5549 .writeAttribute(
"line", line(rb.m_line));
5551 xml.scopedElement(
"Original").writeText(rb.m_expr);
5554 xml.scopedElement(
"Exception").writeText(rb.m_exception.c_str());
5557 xml.scopedElement(
"ExpectedException").writeText(rb.m_exception_type);
5559 xml.scopedElement(
"ExpectedExceptionString").writeText(rb.m_exception_string.c_str());
5561 xml.scopedElement(
"Expanded").writeText(rb.m_decomp.c_str());
5568 void log_message(
const MessageData& mb)
override {
5569 DOCTEST_LOCK_MUTEX(mutex)
5571 xml.startElement(
"Message")
5574 .writeAttribute(
"line", line(mb.m_line));
5576 xml.scopedElement(
"Text").writeText(mb.m_string.c_str());
5583 void test_case_skipped(
const TestCaseData& in)
override {
5584 if(opt.no_skipped_summary ==
false) {
5585 test_case_start_impl(in);
5586 xml.writeAttribute(
"skipped",
"true");
5594 void fulltext_log_assert_to_stream(
std::ostream& s,
const AssertData& rb) {
5601 s << (rb.m_threw ?
"threw as expected!" :
"did NOT throw at all!") <<
"\n";
5605 << rb.m_exception_string.c_str()
5606 <<
"\", " << rb.m_exception_type <<
" ) " <<
Color::None;
5609 s <<
"threw as expected!\n";
5611 s <<
"threw a DIFFERENT exception! (contents: " << rb.m_exception <<
")\n";
5614 s <<
"did NOT throw at all!\n";
5620 << (rb.m_threw ? (rb.m_threw_as ?
"threw as expected!" :
5621 "threw a DIFFERENT exception: ") :
5622 "did NOT throw at all!")
5627 << rb.m_exception_string.c_str()
5629 << (rb.m_threw ? (!rb.m_failed ?
"threw as expected!" :
5630 "threw a DIFFERENT exception: ") :
5631 "did NOT throw at all!")
5634 s << (rb.m_threw ?
"THREW exception: " :
"didn't throw!") <<
Color::Cyan
5635 << rb.m_exception <<
"\n";
5637 s << (rb.m_threw ?
"THREW exception: " :
5638 (!rb.m_failed ?
"is correct!\n" :
"is NOT correct!\n"));
5640 s << rb.m_exception <<
"\n";
5642 s <<
" values: " <<
assertString(rb.m_at) <<
"( " << rb.m_decomp <<
" )\n";
5651 struct JUnitReporter :
public IReporter
5654 DOCTEST_DECLARE_MUTEX(mutex)
5656 std::vector<String> deepestSubcaseStackNames;
5658 struct JUnitTestCaseData
5660 static std::string getCurrentTimestamp() {
5664 std::time(&rawtime);
5665 auto const timeStampSize =
sizeof(
"2017-01-16T17:06:45Z");
5668 #ifdef DOCTEST_PLATFORM_WINDOWS
5669 gmtime_s(&timeInfo, &rawtime);
5670 #else // DOCTEST_PLATFORM_WINDOWS
5671 gmtime_r(&rawtime, &timeInfo);
5672 #endif // DOCTEST_PLATFORM_WINDOWS
5675 const char*
const fmt =
"%Y-%m-%dT%H:%M:%SZ";
5677 std::strftime(timeStamp, timeStampSize,
fmt, &timeInfo);
5678 return std::string(timeStamp);
5681 struct JUnitTestMessage
5683 JUnitTestMessage(
const std::string& _message,
const std::string& _type,
const std::string& _details)
5684 : message(_message), type(_type), details(_details) {}
5686 JUnitTestMessage(
const std::string& _message,
const std::string& _details)
5687 : message(_message), type(), details(_details) {}
5689 std::string message, type, details;
5692 struct JUnitTestCase
5694 JUnitTestCase(
const std::string& _classname,
const std::string& _name)
5695 : classname(_classname), name(_name), time(0), failures() {}
5697 std::string classname, name;
5699 std::vector<JUnitTestMessage> failures, errors;
5702 void add(
const std::string& classname,
const std::string& name) {
5703 testcases.emplace_back(classname, name);
5706 void appendSubcaseNamesToLastTestcase(std::vector<String> nameStack) {
5707 for(
auto& curr: nameStack)
5709 testcases.back().name += std::string(
"/") + curr.c_str();
5712 void addTime(
double time) {
5715 testcases.back().time = time;
5716 totalSeconds += time;
5719 void addFailure(
const std::string& message,
const std::string& type,
const std::string& details) {
5720 testcases.back().failures.emplace_back(message, type, details);
5724 void addError(
const std::string& message,
const std::string& details) {
5725 testcases.back().errors.emplace_back(message, details);
5729 std::vector<JUnitTestCase> testcases;
5730 double totalSeconds = 0;
5731 int totalErrors = 0, totalFailures = 0;
5734 JUnitTestCaseData testCaseData;
5737 const ContextOptions& opt;
5738 const TestCaseData* tc =
nullptr;
5740 JUnitReporter(
const ContextOptions& co)
5744 unsigned line(
unsigned l)
const {
return opt.no_line_numbers ? 0 : l; }
5750 void report_query(
const QueryData&)
override {
5751 xml.writeDeclaration();
5754 void test_run_start()
override {
5755 xml.writeDeclaration();
5758 void test_run_end(
const TestRunStats& p)
override {
5761 #ifdef DOCTEST_PLATFORM_WINDOWS
5762 if(binary_name.rfind(
".exe") != std::string::npos)
5763 binary_name = binary_name.substr(0, binary_name.length() - 4);
5764 #endif // DOCTEST_PLATFORM_WINDOWS
5765 xml.startElement(
"testsuites");
5766 xml.startElement(
"testsuite").writeAttribute(
"name", binary_name)
5767 .writeAttribute(
"errors", testCaseData.totalErrors)
5768 .writeAttribute(
"failures", testCaseData.totalFailures)
5769 .writeAttribute(
"tests", p.numAsserts);
5770 if(opt.no_time_in_output ==
false) {
5771 xml.writeAttribute(
"time", testCaseData.totalSeconds);
5772 xml.writeAttribute(
"timestamp", JUnitTestCaseData::getCurrentTimestamp());
5774 if(opt.no_version ==
false)
5777 for(
const auto& testCase : testCaseData.testcases) {
5778 xml.startElement(
"testcase")
5779 .writeAttribute(
"classname", testCase.classname)
5780 .writeAttribute(
"name", testCase.name);
5781 if(opt.no_time_in_output ==
false)
5782 xml.writeAttribute(
"time", testCase.time);
5784 xml.writeAttribute(
"status",
"run");
5786 for(
const auto& failure : testCase.failures) {
5787 xml.scopedElement(
"failure")
5788 .writeAttribute(
"message", failure.message)
5789 .writeAttribute(
"type", failure.type)
5790 .writeText(failure.details,
false);
5793 for(
const auto& error : testCase.errors) {
5794 xml.scopedElement(
"error")
5795 .writeAttribute(
"message", error.message)
5796 .writeText(error.details);
5805 void test_case_start(
const TestCaseData& in)
override {
5810 void test_case_reenter(
const TestCaseData& in)
override {
5811 testCaseData.addTime(timer.getElapsedSeconds());
5812 testCaseData.appendSubcaseNamesToLastTestcase(deepestSubcaseStackNames);
5813 deepestSubcaseStackNames.clear();
5819 void test_case_end(
const CurrentTestCaseStats&)
override {
5820 testCaseData.addTime(timer.getElapsedSeconds());
5821 testCaseData.appendSubcaseNamesToLastTestcase(deepestSubcaseStackNames);
5822 deepestSubcaseStackNames.clear();
5825 void test_case_exception(
const TestCaseException& e)
override {
5826 DOCTEST_LOCK_MUTEX(mutex)
5827 testCaseData.addError(
"exception", e.error_string.c_str());
5830 void subcase_start(
const SubcaseSignature& in)
override {
5831 deepestSubcaseStackNames.push_back(in.m_name);
5834 void subcase_end()
override {}
5836 void log_assert(
const AssertData& rb)
override {
5840 DOCTEST_LOCK_MUTEX(mutex)
5842 std::ostringstream os;
5844 << line(rb.m_line) << (opt.gnu_file_line ?
":" :
"):") << std::endl;
5846 fulltext_log_assert_to_stream(os, rb);
5848 testCaseData.addFailure(rb.m_decomp.c_str(),
assertString(rb.m_at), os.str());
5851 void log_message(
const MessageData&)
override {}
5853 void test_case_skipped(
const TestCaseData&)
override {}
5855 void log_contexts(std::ostringstream& s) {
5856 int num_contexts = get_num_active_contexts();
5858 auto contexts = get_active_contexts();
5861 for(
int i = 0; i < num_contexts; ++i) {
5862 s << (i == 0 ?
"" :
" ");
5863 contexts[i]->stringify(&s);
5875 explicit Whitespace(
int nr)
5880 if(ws.nrSpaces != 0)
5881 out << std::setw(ws.nrSpaces) <<
' ';
5885 struct ConsoleReporter :
public IReporter
5888 bool hasLoggedCurrentTestStart;
5889 std::vector<SubcaseSignature> subcasesStack;
5890 size_t currentSubcaseLevel;
5891 DOCTEST_DECLARE_MUTEX(mutex)
5894 const ContextOptions& opt;
5895 const TestCaseData* tc;
5897 ConsoleReporter(
const ContextOptions& co)
5901 ConsoleReporter(
const ContextOptions& co,
std::ostream& ostr)
5909 void separator_to_stream() {
5911 <<
"==============================================================================="
5916 const char* success_str) {
5928 const char* success_str =
"SUCCESS") {
5929 s << getSuccessOrFailColor(success, at)
5930 << getSuccessOrFailString(success, at, success_str) <<
": ";
5933 void log_contexts() {
5934 int num_contexts = get_num_active_contexts();
5936 auto contexts = get_active_contexts();
5939 for(
int i = 0; i < num_contexts; ++i) {
5940 s << (i == 0 ?
"" :
" ");
5941 contexts[i]->stringify(&s);
5950 virtual void file_line_to_stream(
const char* file,
int line,
5951 const char* tail =
"") {
5953 << (opt.no_line_numbers ? 0 : line)
5954 << (opt.gnu_file_line ?
":" :
"):") << tail;
5957 void logTestStart() {
5958 if(hasLoggedCurrentTestStart)
5961 separator_to_stream();
5962 file_line_to_stream(tc->m_file.c_str(), tc->m_line,
"\n");
5963 if(tc->m_description)
5965 if(tc->m_test_suite && tc->m_test_suite[0] !=
'\0')
5967 if(strncmp(tc->m_name,
" Scenario:", 11) != 0)
5971 for(
size_t i = 0; i < currentSubcaseLevel; ++i) {
5972 if(subcasesStack[i].m_name[0] !=
'\0')
5973 s <<
" " << subcasesStack[i].m_name <<
"\n";
5976 if(currentSubcaseLevel != subcasesStack.size()) {
5978 for(
size_t i = 0; i < subcasesStack.size(); ++i) {
5979 if(subcasesStack[i].m_name[0] !=
'\0')
5980 s <<
" " << subcasesStack[i].m_name <<
"\n";
5986 hasLoggedCurrentTestStart =
true;
5989 void printVersion() {
5990 if(opt.no_version ==
false)
5996 if(opt.no_intro ==
false) {
5999 <<
"run with \"--" DOCTEST_OPTIONS_PREFIX_DISPLAY
"help\" for options\n";
6004 int sizePrefixDisplay =
static_cast<int>(strlen(DOCTEST_OPTIONS_PREFIX_DISPLAY));
6009 s <<
"boolean values: \"1/on/yes/true\" or \"0/off/no/false\"\n";
6011 s <<
"filter values: \"str1,str2,str3\" (comma separated strings)\n";
6014 s <<
"filters use wildcards for matching strings\n";
6016 s <<
"something passes a filter if any of the strings in a filter matches\n";
6017 #ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
6020 s <<
"ALL FLAGS, OPTIONS AND FILTERS ALSO AVAILABLE WITH A \"" DOCTEST_CONFIG_OPTIONS_PREFIX
"\" PREFIX!!!\n";
6024 s <<
"Query flags - the program quits after them. Available:\n\n";
6025 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"?, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"help, -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"h "
6026 << Whitespace(sizePrefixDisplay*0) <<
"prints this message\n";
6027 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"v, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"version "
6028 << Whitespace(sizePrefixDisplay*1) <<
"prints the version\n";
6029 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"c, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"count "
6030 << Whitespace(sizePrefixDisplay*1) <<
"prints the number of matching tests\n";
6031 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ltc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"list-test-cases "
6032 << Whitespace(sizePrefixDisplay*1) <<
"lists all matching tests by name\n";
6033 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"lts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"list-test-suites "
6034 << Whitespace(sizePrefixDisplay*1) <<
"lists all matching test suites\n";
6035 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"lr, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"list-reporters "
6036 << Whitespace(sizePrefixDisplay*1) <<
"lists all registered reporters\n\n";
6039 s <<
"The available <int>/<string> options/filters are:\n\n";
6040 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"tc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"test-case=<filters> "
6041 << Whitespace(sizePrefixDisplay*1) <<
"filters tests by their name\n";
6042 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"tce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"test-case-exclude=<filters> "
6043 << Whitespace(sizePrefixDisplay*1) <<
"filters OUT tests by their name\n";
6044 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"sf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"source-file=<filters> "
6045 << Whitespace(sizePrefixDisplay*1) <<
"filters tests by their file\n";
6046 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"sfe, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"source-file-exclude=<filters> "
6047 << Whitespace(sizePrefixDisplay*1) <<
"filters OUT tests by their file\n";
6048 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"test-suite=<filters> "
6049 << Whitespace(sizePrefixDisplay*1) <<
"filters tests by their test suite\n";
6050 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"tse, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"test-suite-exclude=<filters> "
6051 << Whitespace(sizePrefixDisplay*1) <<
"filters OUT tests by their test suite\n";
6052 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"sc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"subcase=<filters> "
6053 << Whitespace(sizePrefixDisplay*1) <<
"filters subcases by their name\n";
6054 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"sce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"subcase-exclude=<filters> "
6055 << Whitespace(sizePrefixDisplay*1) <<
"filters OUT subcases by their name\n";
6056 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"r, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"reporters=<filters> "
6057 << Whitespace(sizePrefixDisplay*1) <<
"reporters to use (console is default)\n";
6058 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"o, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"out=<string> "
6059 << Whitespace(sizePrefixDisplay*1) <<
"output filename\n";
6060 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ob, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"order-by=<string> "
6061 << Whitespace(sizePrefixDisplay*1) <<
"how the tests should be ordered\n";
6062 s << Whitespace(sizePrefixDisplay*3) <<
" <string> - [file/suite/name/rand/none]\n";
6063 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"rs, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"rand-seed=<int> "
6064 << Whitespace(sizePrefixDisplay*1) <<
"seed for random ordering\n";
6065 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"f, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"first=<int> "
6066 << Whitespace(sizePrefixDisplay*1) <<
"the first test passing the filters to\n";
6067 s << Whitespace(sizePrefixDisplay*3) <<
" execute - for range-based execution\n";
6068 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"l, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"last=<int> "
6069 << Whitespace(sizePrefixDisplay*1) <<
"the last test passing the filters to\n";
6070 s << Whitespace(sizePrefixDisplay*3) <<
" execute - for range-based execution\n";
6071 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"aa, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"abort-after=<int> "
6072 << Whitespace(sizePrefixDisplay*1) <<
"stop after <int> failed assertions\n";
6073 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"scfl,--" DOCTEST_OPTIONS_PREFIX_DISPLAY
"subcase-filter-levels=<int> "
6074 << Whitespace(sizePrefixDisplay*1) <<
"apply filters for the first <int> levels\n";
6076 s <<
"Bool options - can be used like flags and true is assumed. Available:\n\n";
6077 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"s, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"success=<bool> "
6078 << Whitespace(sizePrefixDisplay*1) <<
"include successful assertions in output\n";
6079 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"cs, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"case-sensitive=<bool> "
6080 << Whitespace(sizePrefixDisplay*1) <<
"filters being treated as case sensitive\n";
6081 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"e, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"exit=<bool> "
6082 << Whitespace(sizePrefixDisplay*1) <<
"exits after the tests finish\n";
6083 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"d, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"duration=<bool> "
6084 << Whitespace(sizePrefixDisplay*1) <<
"prints the time duration of each test\n";
6085 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"m, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"minimal=<bool> "
6086 << Whitespace(sizePrefixDisplay*1) <<
"minimal console output (only failures)\n";
6087 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"q, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"quiet=<bool> "
6088 << Whitespace(sizePrefixDisplay*1) <<
"no console output\n";
6089 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nt, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-throw=<bool> "
6090 << Whitespace(sizePrefixDisplay*1) <<
"skips exceptions-related assert checks\n";
6091 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ne, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-exitcode=<bool> "
6092 << Whitespace(sizePrefixDisplay*1) <<
"returns (or exits) always with success\n";
6093 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nr, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-run=<bool> "
6094 << Whitespace(sizePrefixDisplay*1) <<
"skips all runtime doctest operations\n";
6095 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ni, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-intro=<bool> "
6096 << Whitespace(sizePrefixDisplay*1) <<
"omit the framework intro in the output\n";
6097 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nv, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-version=<bool> "
6098 << Whitespace(sizePrefixDisplay*1) <<
"omit the framework version in the output\n";
6099 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-colors=<bool> "
6100 << Whitespace(sizePrefixDisplay*1) <<
"disables colors in output\n";
6101 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"fc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"force-colors=<bool> "
6102 << Whitespace(sizePrefixDisplay*1) <<
"use colors even when not in a tty\n";
6103 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nb, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-breaks=<bool> "
6104 << Whitespace(sizePrefixDisplay*1) <<
"disables breakpoints in debuggers\n";
6105 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ns, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-skip=<bool> "
6106 << Whitespace(sizePrefixDisplay*1) <<
"don't skip test cases marked as skip\n";
6107 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"gfl, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"gnu-file-line=<bool> "
6108 << Whitespace(sizePrefixDisplay*1) <<
":n: vs (n): for line numbers in output\n";
6109 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"npf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-path-filenames=<bool> "
6110 << Whitespace(sizePrefixDisplay*1) <<
"only filenames and no paths in output\n";
6111 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nln, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-line-numbers=<bool> "
6112 << Whitespace(sizePrefixDisplay*1) <<
"0 instead of real line numbers in output\n";
6117 s <<
"for more information visit the project documentation\n\n";
6120 void printRegisteredReporters() {
6122 auto printReporters = [
this] (
const reporterMap& reporters,
const char* type) {
6123 if(reporters.size()) {
6125 for(
auto& curr : reporters)
6126 s <<
"priority: " << std::setw(5) << curr.first.first
6127 <<
" name: " << curr.first.second <<
"\n";
6130 printReporters(getListeners(),
"listeners");
6131 printReporters(getReporters(),
"reporters");
6138 void report_query(
const QueryData& in)
override {
6141 }
else if(opt.help) {
6143 }
else if(opt.list_reporters) {
6144 printRegisteredReporters();
6145 }
else if(opt.count || opt.list_test_cases) {
6146 if(opt.list_test_cases) {
6148 <<
"listing all test case names\n";
6149 separator_to_stream();
6152 for(
unsigned i = 0; i < in.num_data; ++i)
6155 separator_to_stream();
6158 <<
"unskipped test cases passing the current filters: "
6159 << g_cs->numTestCasesPassingFilters <<
"\n";
6161 }
else if(opt.list_test_suites) {
6163 separator_to_stream();
6165 for(
unsigned i = 0; i < in.num_data; ++i)
6166 s <<
Color::None << in.data[i]->m_test_suite <<
"\n";
6168 separator_to_stream();
6171 <<
"unskipped test cases passing the current filters: "
6172 << g_cs->numTestCasesPassingFilters <<
"\n";
6174 <<
"test suites with unskipped test cases passing the current filters: "
6175 << g_cs->numTestSuitesPassingFilters <<
"\n";
6179 void test_run_start()
override {
6184 void test_run_end(
const TestRunStats& p)
override {
6185 if(opt.minimal && p.numTestCasesFailed == 0)
6188 separator_to_stream();
6191 auto totwidth = int(std::ceil(log10((std::max(p.numTestCasesPassingFilters,
static_cast<unsigned>(p.numAsserts))) + 1)));
6192 auto passwidth = int(std::ceil(log10((std::max(p.numTestCasesPassingFilters - p.numTestCasesFailed,
static_cast<unsigned>(p.numAsserts - p.numAssertsFailed))) + 1)));
6193 auto failwidth = int(std::ceil(log10((std::max(p.numTestCasesFailed,
static_cast<unsigned>(p.numAssertsFailed))) + 1)));
6194 const bool anythingFailed = p.numTestCasesFailed > 0 || p.numAssertsFailed > 0;
6196 << p.numTestCasesPassingFilters <<
" | "
6197 << ((p.numTestCasesPassingFilters == 0 || anythingFailed) ?
Color::None :
6199 << std::setw(passwidth) << p.numTestCasesPassingFilters - p.numTestCasesFailed <<
" passed"
6201 << std::setw(failwidth) << p.numTestCasesFailed <<
" failed" <<
Color::None <<
" |";
6202 if(opt.no_skipped_summary ==
false) {
6203 const int numSkipped = p.numTestCases - p.numTestCasesPassingFilters;
6209 << p.numAsserts <<
" | "
6211 << std::setw(passwidth) << (p.numAsserts - p.numAssertsFailed) <<
" passed" <<
Color::None
6213 << p.numAssertsFailed <<
" failed" <<
Color::None <<
" |\n";
6216 << ((p.numTestCasesFailed > 0) ?
"FAILURE!" :
"SUCCESS!") <<
Color::None << std::endl;
6219 void test_case_start(
const TestCaseData& in)
override {
6220 hasLoggedCurrentTestStart =
false;
6222 subcasesStack.clear();
6223 currentSubcaseLevel = 0;
6226 void test_case_reenter(
const TestCaseData&)
override {
6227 subcasesStack.clear();
6230 void test_case_end(
const CurrentTestCaseStats& st)
override {
6241 s <<
Color::None << std::setprecision(6) << std::fixed << st.seconds
6242 <<
" s: " << tc->m_name <<
"\n";
6245 s <<
Color::Red <<
"Test case exceeded time limit of " << std::setprecision(6)
6246 << std::fixed << tc->m_timeout <<
"!\n";
6249 s <<
Color::Red <<
"Should have failed but didn't! Marking it as failed!\n";
6251 s <<
Color::Yellow <<
"Failed as expected so marking it as not failed\n";
6253 s <<
Color::Yellow <<
"Allowed to fail so marking it as not failed\n";
6255 s <<
Color::Red <<
"Didn't fail exactly " << tc->m_expected_failures
6256 <<
" times so marking it as failed!\n";
6258 s <<
Color::Yellow <<
"Failed exactly " << tc->m_expected_failures
6259 <<
" times as expected so marking it as not failed!\n";
6262 s <<
Color::Red <<
"Aborting - too many failed asserts!\n";
6267 void test_case_exception(
const TestCaseException& e)
override {
6268 DOCTEST_LOCK_MUTEX(mutex)
6274 file_line_to_stream(tc->m_file.c_str(), tc->m_line,
" ");
6277 s <<
Color::Red << (e.is_crash ?
"test case CRASHED: " :
"test case THREW exception: ")
6280 int num_stringified_contexts = get_num_stringified_contexts();
6281 if(num_stringified_contexts) {
6282 auto stringified_contexts = get_stringified_contexts();
6284 for(
int i = num_stringified_contexts; i > 0; --i) {
6285 s << (i == num_stringified_contexts ?
"" :
" ")
6286 << stringified_contexts[i - 1] <<
"\n";
6292 void subcase_start(
const SubcaseSignature& subc)
override {
6293 subcasesStack.push_back(subc);
6294 ++currentSubcaseLevel;
6295 hasLoggedCurrentTestStart =
false;
6298 void subcase_end()
override {
6299 --currentSubcaseLevel;
6300 hasLoggedCurrentTestStart =
false;
6303 void log_assert(
const AssertData& rb)
override {
6304 if((!rb.m_failed && !opt.success) || tc->m_no_output)
6307 DOCTEST_LOCK_MUTEX(mutex)
6311 file_line_to_stream(rb.m_file, rb.m_line,
" ");
6312 successOrFailColoredStringToStream(!rb.m_failed, rb.m_at);
6314 fulltext_log_assert_to_stream(s, rb);
6319 void log_message(
const MessageData& mb)
override {
6323 DOCTEST_LOCK_MUTEX(mutex)
6327 file_line_to_stream(mb.m_file, mb.m_line,
" ");
6328 s << getSuccessOrFailColor(
false, mb.m_severity)
6335 void test_case_skipped(
const TestCaseData&)
override {}
6340 #ifdef DOCTEST_PLATFORM_WINDOWS
6341 struct DebugOutputWindowReporter :
public ConsoleReporter
6343 DOCTEST_THREAD_LOCAL
static std::ostringstream oss;
6345 DebugOutputWindowReporter(
const ContextOptions& co)
6346 : ConsoleReporter(co, oss) {}
6348 #define DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(func, type, arg) \
6349 void func(type arg) override { \
6350 bool with_col = g_no_colors; \
6351 g_no_colors = false; \
6352 ConsoleReporter::func(arg); \
6353 if(oss.tellp() != std::streampos{}) { \
6354 DOCTEST_OUTPUT_DEBUG_STRING(oss.str().c_str()); \
6357 g_no_colors = with_col; \
6361 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_run_end,
const TestRunStats&, in)
6362 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_start,
const TestCaseData&, in)
6363 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_reenter,
const TestCaseData&, in)
6364 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_end,
const CurrentTestCaseStats&, in)
6365 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_exception,
const TestCaseException&, in)
6366 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(subcase_start,
const SubcaseSignature&, in)
6368 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_assert,
const AssertData&, in)
6369 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_message,
const MessageData&, in)
6370 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_skipped,
const TestCaseData&, in)
6373 DOCTEST_THREAD_LOCAL std::ostringstream DebugOutputWindowReporter::oss;
6374 #endif // DOCTEST_PLATFORM_WINDOWS
6377 bool parseOptionImpl(
int argc,
const char*
const* argv,
const char* pattern, String* value) {
6379 for(
int i = argc; i > 0; --i) {
6381 auto temp = std::strstr(argv[index], pattern);
6382 if(temp && (value || strlen(temp) == strlen(pattern))) {
6384 bool noBadCharsFound =
true;
6385 auto curr = argv[index];
6386 while(curr != temp) {
6387 if(*curr++ !=
'-') {
6388 noBadCharsFound =
false;
6392 if(noBadCharsFound && argv[index][0] ==
'-') {
6395 temp += strlen(pattern);
6396 const unsigned len = strlen(temp);
6412 bool parseOption(
int argc,
const char*
const* argv,
const char* pattern, String* value =
nullptr,
6413 const String& defaultVal = String()) {
6415 *value = defaultVal;
6416 #ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
6418 if(parseOptionImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX), value))
6420 #endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS
6421 return parseOptionImpl(argc, argv, pattern, value);
6425 bool parseFlag(
int argc,
const char*
const* argv,
const char* pattern) {
6426 return parseOption(argc, argv, pattern);
6430 bool parseCommaSepArgs(
int argc,
const char*
const* argv,
const char* pattern,
6431 std::vector<String>& res) {
6432 String filtersString;
6433 if(parseOption(argc, argv, pattern, &filtersString)) {
6435 std::ostringstream
s;
6436 auto flush = [&
s, &res]() {
6437 auto string =
s.str();
6438 if(
string.size() > 0) {
6439 res.push_back(
string.c_str());
6444 bool seenBackslash =
false;
6445 const char* current = filtersString.c_str();
6446 const char* end = current + strlen(current);
6447 while(current != end) {
6448 char character = *current++;
6450 seenBackslash =
false;
6451 if(character ==
',' || character ==
'\\') {
6457 if(character ==
'\\') {
6458 seenBackslash =
true;
6459 }
else if(character ==
',') {
6482 bool parseIntOption(
int argc,
const char*
const* argv,
const char* pattern, optionType type,
6485 if(!parseOption(argc, argv, pattern, &parsedValue))
6491 int theInt = std::atoi(parsedValue.c_str());
6498 const char positive[][5] = {
"1",
"true",
"on",
"yes" };
6499 const char negative[][6] = {
"0",
"false",
"off",
"no" };
6502 for (
unsigned i = 0; i < 4; i++) {
6503 if (parsedValue.compare(positive[i],
true) == 0) {
6507 if (parsedValue.compare(negative[i],
true) == 0) {
6517 Context::Context(
int argc,
const char*
const* argv)
6518 : p(new detail::ContextState) {
6519 parseArgs(argc, argv,
true);
6521 p->binary_name = argv[0];
6524 Context::~Context() {
6530 void Context::applyCommandLine(
int argc,
const char*
const* argv) {
6531 parseArgs(argc, argv);
6533 p->binary_name = argv[0];
6537 void Context::parseArgs(
int argc,
const char*
const* argv,
bool withDefaults) {
6538 using namespace detail;
6541 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"source-file=", p->filters[0]);
6542 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"sf=", p->filters[0]);
6543 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"source-file-exclude=",p->filters[1]);
6544 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"sfe=", p->filters[1]);
6545 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"test-suite=", p->filters[2]);
6546 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"ts=", p->filters[2]);
6547 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"test-suite-exclude=", p->filters[3]);
6548 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"tse=", p->filters[3]);
6549 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"test-case=", p->filters[4]);
6550 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"tc=", p->filters[4]);
6551 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"test-case-exclude=", p->filters[5]);
6552 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"tce=", p->filters[5]);
6553 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"subcase=", p->filters[6]);
6554 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"sc=", p->filters[6]);
6555 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"subcase-exclude=", p->filters[7]);
6556 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"sce=", p->filters[7]);
6557 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"reporters=", p->filters[8]);
6558 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"r=", p->filters[8]);
6564 #define DOCTEST_PARSE_AS_BOOL_OR_FLAG(name, sname, var, default) \
6565 if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_bool, intRes) || \
6566 parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_bool, intRes)) \
6567 p->var = static_cast<bool>(intRes); \
6568 else if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name) || \
6569 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname)) \
6571 else if(withDefaults) \
6574 #define DOCTEST_PARSE_INT_OPTION(name, sname, var, default) \
6575 if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_int, intRes) || \
6576 parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_int, intRes)) \
6578 else if(withDefaults) \
6581 #define DOCTEST_PARSE_STR_OPTION(name, sname, var, default) \
6582 if(parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", &strRes, default) || \
6583 parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", &strRes, default) || \
6588 DOCTEST_PARSE_STR_OPTION(
"out",
"o", out,
"");
6589 DOCTEST_PARSE_STR_OPTION(
"order-by",
"ob", order_by,
"file");
6590 DOCTEST_PARSE_INT_OPTION(
"rand-seed",
"rs", rand_seed, 0);
6592 DOCTEST_PARSE_INT_OPTION(
"first",
"f", first, 0);
6593 DOCTEST_PARSE_INT_OPTION(
"last",
"l", last, UINT_MAX);
6595 DOCTEST_PARSE_INT_OPTION(
"abort-after",
"aa", abort_after, 0);
6596 DOCTEST_PARSE_INT_OPTION(
"subcase-filter-levels",
"scfl", subcase_filter_levels, INT_MAX);
6598 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"success",
"s", success,
false);
6599 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"case-sensitive",
"cs", case_sensitive,
false);
6600 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"exit",
"e", exit,
false);
6601 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"duration",
"d", duration,
false);
6602 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"minimal",
"m", minimal,
false);
6603 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"quiet",
"q", quiet,
false);
6604 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-throw",
"nt", no_throw,
false);
6605 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-exitcode",
"ne", no_exitcode,
false);
6606 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-run",
"nr", no_run,
false);
6607 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-intro",
"ni", no_intro,
false);
6608 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-version",
"nv", no_version,
false);
6609 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-colors",
"nc", no_colors,
false);
6610 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"force-colors",
"fc", force_colors,
false);
6611 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-breaks",
"nb", no_breaks,
false);
6612 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-skip",
"ns", no_skip,
false);
6613 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"gnu-file-line",
"gfl", gnu_file_line, !
bool(
DOCTEST_MSVC));
6614 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-path-filenames",
"npf", no_path_in_filenames,
false);
6615 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-line-numbers",
"nln", no_line_numbers,
false);
6616 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-debug-output",
"ndo", no_debug_output,
false);
6617 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-skipped-summary",
"nss", no_skipped_summary,
false);
6618 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-time-in-output",
"ntio", no_time_in_output,
false);
6625 p->list_test_cases =
false;
6626 p->list_test_suites =
false;
6627 p->list_reporters =
false;
6629 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"help") ||
6630 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"h") ||
6631 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"?")) {
6635 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"version") ||
6636 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"v")) {
6640 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"count") ||
6641 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"c")) {
6645 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"list-test-cases") ||
6646 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"ltc")) {
6647 p->list_test_cases =
true;
6650 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"list-test-suites") ||
6651 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"lts")) {
6652 p->list_test_suites =
true;
6655 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"list-reporters") ||
6656 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"lr")) {
6657 p->list_reporters =
true;
6663 void Context::addFilter(
const char* filter,
const char* value) { setOption(filter, value); }
6666 void Context::clearFilters() {
6667 for(
auto& curr : p->filters)
6672 void Context::setOption(
const char* option,
bool value) {
6673 setOption(option, value ?
"true" :
"false");
6677 void Context::setOption(
const char* option,
int value) {
6678 setOption(option,
toString(value).c_str());
6682 void Context::setOption(
const char* option,
const char* value) {
6683 auto argv = String(
"-") + option +
"=" + value;
6684 auto lvalue = argv.c_str();
6685 parseArgs(1, &lvalue);
6689 bool Context::shouldExit() {
return p->exit; }
6691 void Context::setAsDefaultForAssertsOutOfTestCases() { g_cs = p; }
6695 void Context::setCout(
std::ostream* out) { p->cout = out; }
6700 class :
public std::streambuf
6707 std::streamsize xsputn(
const char_type*, std::streamsize count)
override {
return count; }
6709 int_type overflow(int_type ch)
override {
6710 setp(std::begin(buf), std::end(buf));
6711 return traits_type::not_eof(ch);
6721 int Context::run() {
6722 using namespace detail;
6730 g_no_colors = p->no_colors;
6734 if(p->cout ==
nullptr) {
6736 p->cout = &discardOut;
6737 }
else if(p->out.size()) {
6739 fstr.open(p->out.c_str(), std::fstream::out);
6743 p->cout = &std::cout;
6747 FatalConditionHandler::allocateAltStackMem();
6749 auto cleanup_and_return = [&]() {
6750 FatalConditionHandler::freeAltStackMem();
6760 for(
auto& curr : p->reporters_currently_used)
6762 p->reporters_currently_used.clear();
6764 if(p->numTestCasesFailed && !p->no_exitcode)
6765 return EXIT_FAILURE;
6766 return EXIT_SUCCESS;
6770 if(p->filters[8].empty())
6771 p->filters[8].push_back(
"console");
6774 for(
auto& curr : getReporters()) {
6775 if(matchesAny(curr.first.second.c_str(), p->filters[8],
false, p->case_sensitive))
6776 p->reporters_currently_used.push_back(curr.second(*g_cs));
6782 for(
auto& curr : getListeners())
6783 p->reporters_currently_used.insert(p->reporters_currently_used.begin(), curr.second(*g_cs));
6785 #ifdef DOCTEST_PLATFORM_WINDOWS
6787 p->reporters_currently_used.push_back(
new DebugOutputWindowReporter(*g_cs));
6788 #endif // DOCTEST_PLATFORM_WINDOWS
6791 if(p->no_run || p->version || p->help || p->list_reporters) {
6792 DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, QueryData());
6794 return cleanup_and_return();
6798 for(
auto& curr : getRegisteredTests())
6804 if(p->order_by.compare(
"file",
true) == 0) {
6806 }
else if(p->order_by.compare(
"suite",
true) == 0) {
6808 }
else if(p->order_by.compare(
"name",
true) == 0) {
6810 }
else if(p->order_by.compare(
"rand",
true) == 0) {
6811 std::srand(p->rand_seed);
6815 for(
size_t i =
testArray.size() - 1; i > 0; --i) {
6816 int idxToSwap = std::rand() % (i + 1);
6818 const auto temp = first[i];
6820 first[i] = first[idxToSwap];
6821 first[idxToSwap] = temp;
6823 }
else if(p->order_by.compare(
"none",
true) == 0) {
6829 std::set<String> testSuitesPassingFilt;
6831 bool query_mode = p->count || p->list_test_cases || p->list_test_suites;
6832 std::vector<const TestCaseData*> queryResults;
6835 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_start,
DOCTEST_EMPTY);
6838 for(
auto& curr : testArray) {
6839 const auto& tc = *curr;
6841 bool skip_me =
false;
6842 if(tc.m_skip && !p->no_skip)
6845 if(!matchesAny(tc.m_file.c_str(), p->filters[0],
true, p->case_sensitive))
6847 if(matchesAny(tc.m_file.c_str(), p->filters[1],
false, p->case_sensitive))
6849 if(!matchesAny(tc.m_test_suite, p->filters[2],
true, p->case_sensitive))
6851 if(matchesAny(tc.m_test_suite, p->filters[3],
false, p->case_sensitive))
6853 if(!matchesAny(tc.m_name, p->filters[4],
true, p->case_sensitive))
6855 if(matchesAny(tc.m_name, p->filters[5],
false, p->case_sensitive))
6859 p->numTestCasesPassingFilters++;
6862 if((p->last < p->numTestCasesPassingFilters && p->first <= p->last) ||
6863 (p->first > p->numTestCasesPassingFilters))
6868 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_skipped, tc);
6877 if(p->list_test_cases) {
6878 queryResults.push_back(&tc);
6883 if(p->list_test_suites) {
6884 if((testSuitesPassingFilt.count(tc.m_test_suite) == 0) && tc.m_test_suite[0] !=
'\0') {
6885 queryResults.push_back(&tc);
6886 testSuitesPassingFilt.insert(tc.m_test_suite);
6887 p->numTestSuitesPassingFilters++;
6894 p->currentTest = &tc;
6900 p->numAssertsFailedCurrentTest_atomic = 0;
6901 p->numAssertsCurrentTest_atomic = 0;
6903 p->fullyTraversedSubcases.clear();
6905 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc);
6909 bool run_test =
true;
6913 p->reachedLeaf =
false;
6915 p->subcaseStack.clear();
6916 p->currentSubcaseDepth = 0;
6918 p->shouldLogCurrentException =
true;
6921 p->stringifiedContexts.clear();
6923 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
6925 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
6928 FatalConditionHandler fatalConditionHandler;
6931 fatalConditionHandler.reset();
6933 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS
6934 }
catch(
const TestFailureException&) {
6937 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception,
6938 {translateActiveException(),
false});
6941 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS
6944 if(p->abort_after > 0 &&
6945 p->numAssertsFailed + p->numAssertsFailedCurrentTest_atomic >= p->abort_after) {
6950 if(!p->nextSubcaseStack.empty() && run_test)
6951 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_reenter, tc);
6952 if(p->nextSubcaseStack.empty())
6956 p->finalizeTestCaseData();
6958 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
6960 p->currentTest =
nullptr;
6963 if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after)
6969 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
6972 qdata.run_stats = g_cs;
6973 qdata.data = queryResults.data();
6974 qdata.num_data = unsigned(queryResults.size());
6975 DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, qdata);
6978 return cleanup_and_return();
6983 int IReporter::get_num_active_contexts() {
return detail::g_infoContexts.size(); }
6984 const IContextScope*
const* IReporter::get_active_contexts() {
6985 return get_num_active_contexts() ? &detail::g_infoContexts[0] :
nullptr;
6988 int IReporter::get_num_stringified_contexts() {
return detail::g_cs->stringifiedContexts.size(); }
6989 const String* IReporter::get_stringified_contexts() {
6990 return get_num_stringified_contexts() ? &detail::g_cs->stringifiedContexts[0] :
nullptr;
6996 getReporters().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));
6998 getListeners().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));
7004 #endif // DOCTEST_CONFIG_DISABLE
7006 #ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
7010 #endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
7018 #endif // DOCTEST_LIBRARY_IMPLEMENTATION
7019 #endif // DOCTEST_CONFIG_IMPLEMENT