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>
505 struct char_traits<
char>;
506 template <class charT, class traits>
508 typedef basic_ostream<
char, char_traits<
char>>
ostream;
509 template<class traits>
511 basic_ostream<
char, traits>& operator<<(basic_ostream<
char, traits>&, const
char*);
512 template <class charT, class traits>
514 typedef basic_istream<
char, char_traits<
char>>
istream;
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 588 bool isOnStack() const noexcept {
return (buf[last] & 128) == 0; }
589 void setOnHeap() noexcept;
590 void setLast(
size_type in = last) 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);
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>
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>
1032 filloss<typename types::remove_reference<decltype(in)>::type>(stream, in);
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 1186 Approx&
epsilon(
double newEpsilon);
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 1226 DOCTEST_APPROX_PREFIX
operator==(
const T& lhs,
const Approx& rhs) {
return operator==(static_cast<double>(lhs), rhs); }
1227 DOCTEST_APPROX_PREFIX
operator==(
const Approx& lhs,
const T& rhs) {
return operator==(rhs, lhs); }
1228 DOCTEST_APPROX_PREFIX
operator!=(
const T& lhs,
const Approx& rhs) {
return !
operator==(lhs, rhs); }
1229 DOCTEST_APPROX_PREFIX
operator!=(
const Approx& lhs,
const T& rhs) {
return !
operator==(rhs, lhs); }
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 3232 bool is_running_in_test =
false;
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) +
" )"; }
3964 String
toString(IsNaN<float> in) {
return toString<float>(in); }
3965 String
toString(IsNaN<double> in) {
return toString<double>(in); }
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);
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; }
4229 , m_decomp(decomposition) {}
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();
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;
4527 g_infoContexts.push_back(
this);
4531 if (other.need_to_destroy) {
4534 other.need_to_destroy =
false;
4535 g_infoContexts.push_back(
this);
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 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] ==
' ')
4861 const char* exception_type,
const String& exception_string)
4862 : AssertData(at, file, line, expr, exception_type, exception_string) { }
4865 const char* exception_type,
const Contains& exception_string)
4866 : AssertData(at, file, line, expr, exception_type, exception_string) { }
4869 m_decomp = res.m_decomp;
4870 m_failed = !res.m_passed;
4875 m_exception = translateActiveException();
4880 m_failed = !m_threw;
4882 m_failed = !m_threw_as || !m_exception_string.check(m_exception);
4883 }
else if(m_at & assertType::is_throws_as) {
4884 m_failed = !m_threw_as;
4885 }
else if(m_at & assertType::is_throws_with) {
4886 m_failed = !m_exception_string.check(m_exception);
4891 if(m_exception.size())
4892 m_exception =
"\"" + m_exception +
"\"";
4894 if(is_running_in_test) {
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);
4921 const Result& result) {
4922 bool failed = !result.m_passed;
4937 m_severity = severity;
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);
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 <<
" | " 6210 << ((p.numAsserts == 0 || anythingFailed) ?
Color::None : Color::Green)
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) {
6518 : p(
new detail::ContextState) {
6519 parseArgs(argc, argv,
true);
6521 p->binary_name = argv[0];
6531 parseArgs(argc, argv);
6533 p->binary_name = argv[0];
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); }
6667 for(
auto& curr : p->filters)
6673 setOption(option, value ?
"true" :
"false");
6678 setOption(option,
toString(value).c_str());
6683 auto argv = String(
"-") + option +
"=" + value;
6684 auto lvalue = argv.c_str();
6685 parseArgs(1, &lvalue);
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);
6722 using namespace detail;
6728 is_running_in_test =
true;
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();
6757 is_running_in_test =
false;
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())
6799 testArray.push_back(&curr);
6800 p->numTestCases = testArray.size();
6803 if(!testArray.empty()) {
6804 if(p->order_by.compare(
"file",
true) == 0) {
6805 std::sort(testArray.begin(), testArray.end(), fileOrderComparator);
6806 }
else if(p->order_by.compare(
"suite",
true) == 0) {
6807 std::sort(testArray.begin(), testArray.end(), suiteOrderComparator);
6808 }
else if(p->order_by.compare(
"name",
true) == 0) {
6809 std::sort(testArray.begin(), testArray.end(), nameOrderComparator);
6810 }
else if(p->order_by.compare(
"rand",
true) == 0) {
6811 std::srand(p->rand_seed);
6814 const auto first = &testArray[0];
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();
6985 return get_num_active_contexts() ? &detail::g_infoContexts[0] :
nullptr;
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
DOCTEST_INTERFACE std::ostream * tlssPush()
TestSuite & operator*(const char *in)
Context(int argc=0, const char *const *argv=nullptr)
decltype(sizeof(void *)) typede size_t)
size_type find(char ch, size_type pos=0) const
#define DOCTEST_FORBIT_EXPRESSION(rt, op)
#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
#define DOCTEST_INTERFACE_DEF
int registerExceptionTranslator(String(*translateFunction)(T))
Contains(const String &string)
assertType::Enum m_severity
#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH
DOCTEST_INTERFACE String tlssPop()
#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)
void filloss(std::ostream *stream, const T &in)
static const IContextScope *const * get_active_contexts()
#define DOCTEST_CONFIG_STRING_SIZE_TYPE
String & operator+=(const String &other)
DOCTEST_NOINLINE bool unary_assert(const DOCTEST_REF_WRAP(L) val)
int numAssertsFailedCurrentTest
int instantiationHelper(const T &)
void run(class_loader::ClassLoader *loader)
DOCTEST_INTERFACE const ContextOptions * getContextOptions()
String stringifyBinaryExpr(const DOCTEST_REF_WRAP(L) lhs, const char *op, const DOCTEST_REF_WRAP(R) rhs)
DOCTEST_INTERFACE const char * assertString(assertType::Enum at)
void translateException()
Approx & epsilon(double newEpsilon)
Approx & scale(double newScale)
DOCTEST_INTERFACE bool operator!=(const String &lhs, const String &rhs)
#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
#define DOCTEST_CMP_EQ(l, r)
int info(const std::vector< std::string > &options)
ros::Time * timeStamp(M &m)
void testArray(XmlRpcValue const &d)
IReporter *(*)(const ContextOptions &) reporterCreatorFunc
__underlying_type(T) type
void setOption(const char *option, bool value)
DOCTEST_INTERFACE std::ostream & operator<<(std::ostream &s, Color::Enum code)
int main(int argc, char **argv)
static void fill(std::ostream *stream, const T &in)
#define DOCTEST_ASSERT_IN_TESTS(decomp)
DOCTEST_MSVC_SUPPRESS_WARNING_POP MessageBuilder & operator<<(const T &in)
DOCTEST_INTERFACE bool operator>=(const String &lhs, const String &rhs)
void setResult(const Result &res)
int numAssertsCurrentTest
DOCTEST_INTERFACE void throwException()
void setAssertHandler(detail::assert_handler ah)
ExceptionTranslator(String(*translateFunction)(T))
static int get_num_active_contexts()
#define DOCTEST_STRINGIFY(...)
#define DOCTEST_DECLARE_INTERFACE(name)
static void fill(std::ostream *stream, const T *in)
ResultBuilder(assertType::Enum at, const char *file, int line, const char *expr, const char *exception_type="", const String &exception_string="")
#define DOCTEST_GCC_SUPPRESS_WARNING(w)
const char * m_exception_type
DOCTEST_INTERFACE int setTestSuite(const TestSuite &ts)
#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)
static const String * get_stringified_contexts()
#define DOCTEST_CLANG_SUPPRESS_WARNING_POP
#define DOCTEST_CONSTEXPR
#define DOCTEST_MSVC_SUPPRESS_WARNING(w)
DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING(4388) DOCTEST_MSVC_SUPPRESS_WARNING(4389) DOCTEST_MSVC_SUPPRESS_WARNING(4018) template< typename L > struct Expression_lhs
bool add(const actionlib::TwoIntsGoal &req, actionlib::TwoIntsResult &res)
ExpressionDecomposer(assertType::Enum at)
char operator[](size_type i) const
Subcase(const String &name, const char *file, int line)
IsNaN< F > operator!() const
bool translate(String &res) const override
DOCTEST_INTERFACE String operator+(const String &lhs, const String &rhs)
static String convert(const DOCTEST_REF_WRAP(T) in)
IReporter * reporterCreator(const ContextOptions &o)
#define DOCTEST_CONSTEXPR_FUNC
#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
bool operator()(const DOCTEST_REF_WRAP(L), const DOCTEST_REF_WRAP(R)) const
DOCTEST_INTERFACE bool isDebuggerActive()
String substr(size_type pos, size_type cnt=npos) &&
DOCTEST_INTERFACE bool checkIfShouldThrow(assertType::Enum at)
DOCTEST_INTERFACE bool operator>(const String &lhs, const String &rhs)
#define DOCTEST_BINARY_RELATIONAL_OP(n, op)
void stringify(std::ostream *s) const override
#define DOCTEST_INTERFACE
DOCTEST_INTERFACE bool operator<(const String &lhs, const String &rhs)
#define DOCTEST_DEFINE_INTERFACE(name)
StringContains(const String &str)
DOCTEST_INTERFACE String toString(const Contains &in)
DOCTEST_INTERFACE void registerReporterImpl(const char *name, int prio, reporterCreatorFunc c, bool isReporter)
#define DOCTEST_RELATIONAL_OP(name, op)
basic_ostream< char, char_traits< char > > ostream
TestCase(funcType test, const char *file, unsigned line, const TestSuite &test_suite, const String &type=String(), int template_id=-1)
#define DOCTEST_REF_WRAP(x)
OCLINT avoid private static members.
unsigned numTestSuitesPassingFilters
void parseArgs(int argc, const char *const *argv, bool withDefaults=false)
#define DOCTEST_REGISTER_REPORTER(name, priority, reporter)
#define DOCTEST_CMP_LE(l, r)
DOCTEST_NOINLINE bool unary_assert(assertType::Enum at, const char *file, int line, const char *expr, const DOCTEST_REF_WRAP(L) val)
Approx operator()(double value) const
#define DOCTEST_BREAK_INTO_DEBUGGER()
void setSize(size_type sz) noexcept
void(*)(const AssertData &) assert_handler
bool isOnStack() const noexcept
String toStream(const T &in)
void copy(const String &other)
#define DOCTEST_SUPPRESS_COMMON_WARNINGS_PUSH
bool operator==(const SubcaseSignature &other) const
DOCTEST_MSVC_SUPPRESS_WARNING_POP TestCase & operator=(TestCase &&)=delete
#define DOCTEST_CMP_NE(l, r)
IsNaN(F f, bool flip=false)
#define DOCTEST_VERSION_STR
ROSCPP_DECL bool execute(const std::string &method, const XmlRpc::XmlRpcValue &request, XmlRpc::XmlRpcValue &response, XmlRpc::XmlRpcValue &payload, bool wait_for_master)
DOCTEST_INTERFACE bool operator<=(const String &lhs, const String &rhs)
DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData &ad)
const char * c_str() const
size_type capacity() const
static void fill(std::ostream *stream, const char(&in)[N])
void setCout(std::ostream *out)
DOCTEST_INTERFACE bool decomp_assert(assertType::Enum at, const char *file, int line, const char *expr, const Result &result)
static void fill(std::ostream *stream, const T(&in)[N])
basic_istream< char, char_traits< char > > istream
DOCTEST_CONFIG_STRING_SIZE_TYPE size_type
const char * m_description
ContextScope< L > MakeContextScope(const L &lambda)
void applyCommandLine(int argc, const char *const *argv)
OCLINT destructor of virtual class.
bool checkWith(const String &other) const
DOCTEST_INTERFACE bool operator==(const String &lhs, const String &rhs)
#define DOCTEST_CMP_GE(l, r)
DOCTEST_INTERFACE const char * failureString(assertType::Enum at)
SubcaseSignature m_signature
#define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH
unsigned numTestCasesFailed
bool no_path_in_filenames
decltype(nullptr) typedef nullptr_t
TF2SIMD_FORCE_INLINE Vector3 operator*(const Matrix3x3 &m, const Vector3 &v)
ContextScope(const L &lambda)
#define DOCTEST_CMP_LT(l, r)
String & operator=(const String &other)
DOCTEST_INTERFACE void registerExceptionTranslatorImpl(const IExceptionTranslator *et)
void addFilter(const char *filter, const char *value)
int test(const std::vector< std::string > &options)
size_type rfind(char ch, size_type pos=npos) const
bool operator<(const TestCase &other) const
unsigned numTestCasesPassingFilters
#define DOCTEST_MSVC_SUPPRESS_WARNING_POP
const char * m_test_suite
const char * c_str() const
MessageBuilder(const char *file, int line, assertType::Enum severity)
#define DOCTEST_CLANG_SUPPRESS_WARNING(w)
DOCTEST_INTERFACE bool is_running_in_test
DOCTEST_NOINLINE bool binary_assert(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs)
DOCTEST_CONSTEXPR_FUNC T && forward(typename types::remove_reference< T >::type &t) DOCTEST_NOEXCEPT
TestCase & operator*(const char *in)
static int get_num_stringified_contexts()
struct DOCTEST_INTERFACE TestCase
#define DOCTEST_TEST_SUITE_END
DOCTEST_DEFINE_DECORATOR(test_suite, const char *, "")
bool check(const String &str)
int subcase_filter_levels
StringContains(Contains cntn)
#define DOCTEST_ASSERT_OUT_OF_TESTS(decomp)
#define DOCTEST_INTERFACE_DECL
MessageBuilder & operator*(const T &in)
#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)
int registerReporter(const char *name, int priority, bool isReporter)
int compare(const char *other, bool no_case=false) const
#define DOCTEST_GCC_SUPPRESS_WARNING_POP
static String convert(const DOCTEST_REF_WRAP(T))
char * allocate(size_type sz)
const TestCaseData * m_test_case
#define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro)
DOCTEST_INTERFACE doctest::detail::TestSuite & getCurrentTestSuite()
AssertData(assertType::Enum at, const char *file, int line, const char *expr, const char *exception_type, const StringContains &exception_string)
DOCTEST_INTERFACE int regTest(const TestCase &tc)
void setLast(size_type in=last) noexcept
void setOnHeap() noexcept
#define DOCTEST_SUPPRESS_COMMON_WARNINGS_POP
void setAsDefaultForAssertsOutOfTestCases()
DOCTEST_NOINLINE bool binary_assert(assertType::Enum at, const char *file, int line, const char *expr, const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs)
bool operator<(const SubcaseSignature &other) const
TestSuite & operator*(const T &in)
#define DOCTEST_CMP_GT(l, r)
DOCTEST_INTERFACE const char * skipPathFromFilename(const char *file)