42 #ifndef DOCTEST_LIBRARY_INCLUDED 43 #define DOCTEST_LIBRARY_INCLUDED 49 #define DOCTEST_VERSION_MAJOR 2 50 #define DOCTEST_VERSION_MINOR 3 51 #define DOCTEST_VERSION_PATCH 7 52 #define DOCTEST_VERSION_STR "2.3.7" 54 #define DOCTEST_VERSION \ 55 (DOCTEST_VERSION_MAJOR * 10000 + DOCTEST_VERSION_MINOR * 100 + DOCTEST_VERSION_PATCH) 63 #define DOCTEST_COMPILER(MAJOR, MINOR, PATCH) ((MAJOR)*10000000 + (MINOR)*100000 + (PATCH)) 66 #if defined(_MSC_VER) && defined(_MSC_FULL_VER) 67 #if _MSC_VER == _MSC_FULL_VER / 10000 68 #define DOCTEST_MSVC DOCTEST_COMPILER(_MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 10000) 70 #define DOCTEST_MSVC \ 71 DOCTEST_COMPILER(_MSC_VER / 100, (_MSC_FULL_VER / 100000) % 100, _MSC_FULL_VER % 100000) 74 #if defined(__clang__) && defined(__clang_minor__) 75 #define DOCTEST_CLANG DOCTEST_COMPILER(__clang_major__, __clang_minor__, __clang_patchlevel__) 76 #elif defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) && \ 77 !defined(__INTEL_COMPILER) 78 #define DOCTEST_GCC DOCTEST_COMPILER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) 82 #define DOCTEST_MSVC 0 83 #endif // DOCTEST_MSVC 85 #define DOCTEST_CLANG 0 86 #endif // DOCTEST_CLANG 96 #define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x) 97 #define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH _Pragma("clang diagnostic push") 98 #define DOCTEST_CLANG_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(clang diagnostic ignored w) 99 #define DOCTEST_CLANG_SUPPRESS_WARNING_POP _Pragma("clang diagnostic pop") 100 #define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w) \ 101 DOCTEST_CLANG_SUPPRESS_WARNING_PUSH DOCTEST_CLANG_SUPPRESS_WARNING(w) 102 #else // DOCTEST_CLANG 103 #define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH 104 #define DOCTEST_CLANG_SUPPRESS_WARNING(w) 105 #define DOCTEST_CLANG_SUPPRESS_WARNING_POP 106 #define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w) 107 #endif // DOCTEST_CLANG 110 #define DOCTEST_PRAGMA_TO_STR(x) _Pragma(#x) 111 #define DOCTEST_GCC_SUPPRESS_WARNING_PUSH _Pragma("GCC diagnostic push") 112 #define DOCTEST_GCC_SUPPRESS_WARNING(w) DOCTEST_PRAGMA_TO_STR(GCC diagnostic ignored w) 113 #define DOCTEST_GCC_SUPPRESS_WARNING_POP _Pragma("GCC diagnostic pop") 114 #define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w) \ 115 DOCTEST_GCC_SUPPRESS_WARNING_PUSH DOCTEST_GCC_SUPPRESS_WARNING(w) 117 #define DOCTEST_GCC_SUPPRESS_WARNING_PUSH 118 #define DOCTEST_GCC_SUPPRESS_WARNING(w) 119 #define DOCTEST_GCC_SUPPRESS_WARNING_POP 120 #define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w) 121 #endif // DOCTEST_GCC 124 #define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH __pragma(warning(push)) 125 #define DOCTEST_MSVC_SUPPRESS_WARNING(w) __pragma(warning(disable : w)) 126 #define DOCTEST_MSVC_SUPPRESS_WARNING_POP __pragma(warning(pop)) 127 #define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w) \ 128 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH DOCTEST_MSVC_SUPPRESS_WARNING(w) 129 #else // DOCTEST_MSVC 130 #define DOCTEST_MSVC_SUPPRESS_WARNING_PUSH 131 #define DOCTEST_MSVC_SUPPRESS_WARNING(w) 132 #define DOCTEST_MSVC_SUPPRESS_WARNING_POP 133 #define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w) 134 #endif // DOCTEST_MSVC 201 #define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN \ 202 DOCTEST_MSVC_SUPPRESS_WARNING_PUSH \ 203 DOCTEST_MSVC_SUPPRESS_WARNING(4548) \ 204 DOCTEST_MSVC_SUPPRESS_WARNING(4265) \ 205 DOCTEST_MSVC_SUPPRESS_WARNING(4986) \ 206 DOCTEST_MSVC_SUPPRESS_WARNING(4350) \ 207 DOCTEST_MSVC_SUPPRESS_WARNING(4668) \ 208 DOCTEST_MSVC_SUPPRESS_WARNING(4365) \ 209 DOCTEST_MSVC_SUPPRESS_WARNING(4774) \ 210 DOCTEST_MSVC_SUPPRESS_WARNING(4820) \ 211 DOCTEST_MSVC_SUPPRESS_WARNING(4625) \ 212 DOCTEST_MSVC_SUPPRESS_WARNING(4626) \ 213 DOCTEST_MSVC_SUPPRESS_WARNING(5027) \ 214 DOCTEST_MSVC_SUPPRESS_WARNING(5026) \ 215 DOCTEST_MSVC_SUPPRESS_WARNING(4623) \ 216 DOCTEST_MSVC_SUPPRESS_WARNING(5039) \ 217 DOCTEST_MSVC_SUPPRESS_WARNING(5045) \ 218 DOCTEST_MSVC_SUPPRESS_WARNING(5105) 220 #define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END DOCTEST_MSVC_SUPPRESS_WARNING_POP 240 #if DOCTEST_MSVC && !defined(DOCTEST_CONFIG_WINDOWS_SEH) 241 #define DOCTEST_CONFIG_WINDOWS_SEH 243 #if defined(DOCTEST_CONFIG_NO_WINDOWS_SEH) && defined(DOCTEST_CONFIG_WINDOWS_SEH) 244 #undef DOCTEST_CONFIG_WINDOWS_SEH 245 #endif // DOCTEST_CONFIG_NO_WINDOWS_SEH 247 #if !defined(_WIN32) && !defined(__QNX__) && !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && \ 248 !defined(__EMSCRIPTEN__) 249 #define DOCTEST_CONFIG_POSIX_SIGNALS 251 #if defined(DOCTEST_CONFIG_NO_POSIX_SIGNALS) && defined(DOCTEST_CONFIG_POSIX_SIGNALS) 252 #undef DOCTEST_CONFIG_POSIX_SIGNALS 253 #endif // DOCTEST_CONFIG_NO_POSIX_SIGNALS 255 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 256 #if !defined(__cpp_exceptions) && !defined(__EXCEPTIONS) && !defined(_CPPUNWIND) 257 #define DOCTEST_CONFIG_NO_EXCEPTIONS 258 #endif // no exceptions 259 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 261 #ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS 262 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 263 #define DOCTEST_CONFIG_NO_EXCEPTIONS 264 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 265 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS 267 #if defined(DOCTEST_CONFIG_NO_EXCEPTIONS) && !defined(DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS) 268 #define DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS 269 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS && !DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS 271 #if defined(DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN) && !defined(DOCTEST_CONFIG_IMPLEMENT) 272 #define DOCTEST_CONFIG_IMPLEMENT 273 #endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN 275 #if defined(_WIN32) || defined(__CYGWIN__) 277 #define DOCTEST_SYMBOL_EXPORT __declspec(dllexport) 278 #define DOCTEST_SYMBOL_IMPORT __declspec(dllimport) 280 #define DOCTEST_SYMBOL_EXPORT __attribute__((dllexport)) 281 #define DOCTEST_SYMBOL_IMPORT __attribute__((dllimport)) 284 #define DOCTEST_SYMBOL_EXPORT __attribute__((visibility("default"))) 285 #define DOCTEST_SYMBOL_IMPORT 288 #ifdef DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL 289 #ifdef DOCTEST_CONFIG_IMPLEMENT 290 #define DOCTEST_INTERFACE DOCTEST_SYMBOL_EXPORT 291 #else // DOCTEST_CONFIG_IMPLEMENT 292 #define DOCTEST_INTERFACE DOCTEST_SYMBOL_IMPORT 293 #endif // DOCTEST_CONFIG_IMPLEMENT 294 #else // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL 295 #define DOCTEST_INTERFACE 296 #endif // DOCTEST_CONFIG_IMPLEMENTATION_IN_DLL 298 #define DOCTEST_EMPTY 301 #define DOCTEST_NOINLINE __declspec(noinline) 302 #define DOCTEST_UNUSED 303 #define DOCTEST_ALIGNMENT(x) 305 #define DOCTEST_NOINLINE __attribute__((noinline)) 306 #define DOCTEST_UNUSED __attribute__((unused)) 307 #define DOCTEST_ALIGNMENT(x) __attribute__((aligned(x))) 315 #define DOCTEST_CAT_IMPL(s1, s2) s1##s2 316 #define DOCTEST_CAT(s1, s2) DOCTEST_CAT_IMPL(s1, s2) 317 #ifdef __COUNTER__ // not standard and may be missing for some compilers 318 #define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __COUNTER__) 320 #define DOCTEST_ANONYMOUS(x) DOCTEST_CAT(x, __LINE__) 321 #endif // __COUNTER__ 323 #define DOCTEST_TOSTR(x) #x 325 #ifndef DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE 326 #define DOCTEST_REF_WRAP(x) x& 327 #else // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE 328 #define DOCTEST_REF_WRAP(x) x 329 #endif // DOCTEST_CONFIG_ASSERTION_PARAMETERS_BY_VALUE 332 #ifdef __MAC_OS_X_VERSION_MIN_REQUIRED 333 #define DOCTEST_PLATFORM_MAC 334 #elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED) 335 #define DOCTEST_PLATFORM_IPHONE 336 #elif defined(_WIN32) 337 #define DOCTEST_PLATFORM_WINDOWS 338 #else // DOCTEST_PLATFORM 339 #define DOCTEST_PLATFORM_LINUX 340 #endif // DOCTEST_PLATFORM 342 #define DOCTEST_GLOBAL_NO_WARNINGS(var) \ 343 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wglobal-constructors") \ 344 DOCTEST_CLANG_SUPPRESS_WARNING("-Wunused-variable") \ 345 static int var DOCTEST_UNUSED // NOLINT(fuchsia-statically-constructed-objects,cert-err58-cpp) 346 #define DOCTEST_GLOBAL_NO_WARNINGS_END() DOCTEST_CLANG_SUPPRESS_WARNING_POP 348 #ifndef DOCTEST_BREAK_INTO_DEBUGGER 350 #ifdef DOCTEST_PLATFORM_MAC 351 #define DOCTEST_BREAK_INTO_DEBUGGER() __asm__("int $3\n" : :) 353 #define DOCTEST_BREAK_INTO_DEBUGGER() __debugbreak() 354 #elif defined(__MINGW32__) 356 extern "C" __declspec(dllimport)
void __stdcall DebugBreak();
358 #define DOCTEST_BREAK_INTO_DEBUGGER() ::DebugBreak() 360 #define DOCTEST_BREAK_INTO_DEBUGGER() ((void)0) 362 #endif // DOCTEST_BREAK_INTO_DEBUGGER 365 #ifdef DOCTEST_CONFIG_USE_IOSFWD 366 #define DOCTEST_CONFIG_USE_STD_HEADERS 367 #endif // DOCTEST_CONFIG_USE_IOSFWD 369 #ifdef DOCTEST_CONFIG_USE_STD_HEADERS 373 #else // DOCTEST_CONFIG_USE_STD_HEADERS 380 #ifdef _LIBCPP_VERSION 381 #define DOCTEST_STD_NAMESPACE_BEGIN _LIBCPP_BEGIN_NAMESPACE_STD 382 #define DOCTEST_STD_NAMESPACE_END _LIBCPP_END_NAMESPACE_STD 383 #else // _LIBCPP_VERSION 384 #define DOCTEST_STD_NAMESPACE_BEGIN namespace std { 385 #define DOCTEST_STD_NAMESPACE_END } 386 #endif // _LIBCPP_VERSION 392 typedef decltype(
nullptr) nullptr_t;
393 template <class charT>
396 struct char_traits<
char>;
397 template <class charT, class traits>
399 typedef basic_ostream<
char, char_traits<
char>>
ostream;
400 template <class... Types>
402 #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) 406 template <
class _Elem,
class _Traits,
class _Alloc>
408 using string = basic_string<char, char_traits<char>, allocator<char>>;
414 #endif // DOCTEST_CONFIG_USE_STD_HEADERS 416 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 417 #include <type_traits> 418 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 446 static const unsigned len = 24;
447 static const unsigned last = len - 1;
462 bool isOnStack()
const {
return (buf[last] & 128) == 0; }
464 void setLast(
unsigned in = last);
466 void copy(
const String& other);
474 String(
const char* in,
unsigned in_size);
485 char operator[](
unsigned i)
const;
486 char& operator[](
unsigned i);
492 return reinterpret_cast<char*
>(buf);
496 unsigned size()
const;
497 unsigned capacity()
const;
499 int compare(
const char* other,
bool no_case =
false)
const;
500 int compare(
const String& other,
bool no_case =
false)
const;
535 namespace assertType {
687 virtual ~IContextScope();
734 #if defined(DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) || defined(DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS) 735 template <
bool CONDITION,
typename TYPE =
void>
739 template <
typename TYPE>
740 struct enable_if<true, TYPE>
741 {
typedef TYPE
type; };
742 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) || DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 753 template <
typename T>
756 {
static const bool value =
false; };
758 namespace has_insertion_operator_impl {
764 template <
typename T>
774 template <
typename T>
779 static const bool value =
sizeof(decltype(
testStreamable(s << t))) ==
sizeof(yes);
783 template <
typename T>
795 template <
typename T>
804 template <
typename T>
813 template <
typename T>
818 template <
typename T>
824 template <
typename T>
828 template <
typename T>
831 template <
typename U>
839 template <
typename R,
typename C>
849 template <
typename T>
854 #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 857 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 876 #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) 884 explicit Approx(
double value);
886 Approx operator()(
double value)
const;
888 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 889 template <
typename T>
890 explicit Approx(
const T& value,
891 typename detail::enable_if<std::is_constructible<double, T>::value>::
type* =
892 static_cast<T*>(
nullptr)) {
893 *
this =
Approx(static_cast<double>(value));
895 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 899 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 900 template <
typename T>
901 typename detail::enable_if<std::is_constructible<double, T>::value,
Approx&>
::type epsilon(
902 const T& newEpsilon) {
903 m_epsilon =
static_cast<double>(newEpsilon);
906 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 908 Approx& scale(
double newScale);
910 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 911 template <
typename T>
912 typename detail::enable_if<std::is_constructible<double, T>::value,
Approx&>
::type scale(
914 m_scale =
static_cast<double>(newScale);
917 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 935 #ifdef DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 936 #define DOCTEST_APPROX_PREFIX \ 937 template <typename T> friend typename detail::enable_if<std::is_constructible<double, T>::value, bool>::type 943 DOCTEST_APPROX_PREFIX
operator<=(
const T& lhs,
const Approx& rhs) {
return double(lhs) < rhs.
m_value || lhs == rhs; }
944 DOCTEST_APPROX_PREFIX
operator<=(
const Approx& lhs,
const T& rhs) {
return lhs.
m_value < double(rhs) || lhs == rhs; }
945 DOCTEST_APPROX_PREFIX
operator>=(
const T& lhs,
const Approx& rhs) {
return double(lhs) > rhs.
m_value || lhs == rhs; }
946 DOCTEST_APPROX_PREFIX
operator>=(
const Approx& lhs,
const T& rhs) {
return lhs.
m_value > double(rhs) || lhs == rhs; }
947 DOCTEST_APPROX_PREFIX
operator< (
const T& lhs,
const Approx& rhs) {
return double(lhs) < rhs.
m_value && lhs != rhs; }
948 DOCTEST_APPROX_PREFIX
operator< (
const Approx& lhs,
const T& rhs) {
return lhs.
m_value < double(rhs) && lhs != rhs; }
949 DOCTEST_APPROX_PREFIX
operator> (
const T& lhs,
const Approx& rhs) {
return double(lhs) > rhs.
m_value && lhs != rhs; }
950 DOCTEST_APPROX_PREFIX
operator> (
const Approx& lhs,
const T& rhs) {
return lhs.
m_value > double(rhs) && lhs != rhs; }
951 #undef DOCTEST_APPROX_PREFIX 952 #endif // DOCTEST_CONFIG_INCLUDE_TYPE_TRAITS 966 #if !defined(DOCTEST_CONFIG_DISABLE) 970 #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 971 template<
class T>
struct decay_array {
typedef T
type; };
972 template<
class T,
unsigned N>
struct decay_array<T[N]> {
typedef T*
type; };
973 template<
class T>
struct decay_array<T[]> {
typedef T*
type; };
975 template<
class T>
struct not_char_pointer {
enum { value = 1 }; };
976 template<>
struct not_char_pointer<char*> {
enum { value = 0 }; };
977 template<>
struct not_char_pointer<const char*> {
enum { value = 0 }; };
979 template<
class T>
struct can_use_op :
public not_char_pointer<typename decay_array<T>::type> {};
980 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 989 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 991 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 997 bool m_entered =
false;
1002 operator bool()
const;
1005 template <
typename L,
typename R>
1011 #define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro) \ 1012 template <typename R> \ 1013 DOCTEST_NOINLINE Result operator op(const DOCTEST_REF_WRAP(R) rhs) { \ 1014 bool res = op_macro(lhs, rhs); \ 1015 if(m_at & assertType::is_false) \ 1017 if(!res || doctest::getContextOptions()->success) \ 1018 return Result(res, stringifyBinaryExpr(lhs, op_str, rhs)); \ 1019 return Result(res); \ 1025 #define DOCTEST_FORBIT_EXPRESSION(rt, op) \ 1026 template <typename R> \ 1027 rt& operator op(const R&) { \ 1028 static_assert(deferred_false<R>::value, \ 1029 "Expression Too Complex Please Rewrite As Binary Comparison!"); \ 1065 #ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION 1088 #endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION 1091 #ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 1092 #define DOCTEST_COMPARISON_RETURN_TYPE bool 1093 #else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 1094 #define DOCTEST_COMPARISON_RETURN_TYPE typename enable_if<can_use_op<L>::value || can_use_op<R>::value, bool>::type 1095 inline bool eq(
const char* lhs,
const char* rhs) {
return String(lhs) ==
String(rhs); }
1096 inline bool ne(
const char* lhs,
const char* rhs) {
return String(lhs) !=
String(rhs); }
1097 inline bool lt(
const char* lhs,
const char* rhs) {
return String(lhs) <
String(rhs); }
1098 inline bool gt(
const char* lhs,
const char* rhs) {
return String(lhs) >
String(rhs); }
1099 inline bool le(
const char* lhs,
const char* rhs) {
return String(lhs) <=
String(rhs); }
1100 inline bool ge(
const char* lhs,
const char* rhs) {
return String(lhs) >=
String(rhs); }
1101 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 1104 #define DOCTEST_RELATIONAL_OP(name, op) \ 1105 template <typename L, typename R> \ 1106 DOCTEST_COMPARISON_RETURN_TYPE name(const DOCTEST_REF_WRAP(L) lhs, \ 1107 const DOCTEST_REF_WRAP(R) rhs) { \ 1108 return lhs op rhs; \ 1118 #ifndef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 1119 #define DOCTEST_CMP_EQ(l, r) l == r 1120 #define DOCTEST_CMP_NE(l, r) l != r 1121 #define DOCTEST_CMP_GT(l, r) l > r 1122 #define DOCTEST_CMP_LT(l, r) l < r 1123 #define DOCTEST_CMP_GE(l, r) l >= r 1124 #define DOCTEST_CMP_LE(l, r) l <= r 1125 #else // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 1126 #define DOCTEST_CMP_EQ(l, r) eq(l, r) 1127 #define DOCTEST_CMP_NE(l, r) ne(l, r) 1128 #define DOCTEST_CMP_GT(l, r) gt(l, r) 1129 #define DOCTEST_CMP_LT(l, r) lt(l, r) 1130 #define DOCTEST_CMP_GE(l, r) ge(l, r) 1131 #define DOCTEST_CMP_LE(l, r) le(l, r) 1132 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 1134 template <
typename L>
1136 struct Expression_lhs
1187 #ifndef DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION 1193 #endif // DOCTEST_CONFIG_NO_COMPARISON_WARNING_SUPPRESSION 1205 template <
typename L>
1207 return Expression_lhs<const DOCTEST_REF_WRAP(L)>(operand, m_at);
1223 template <
typename T>
1241 const char*
type =
"",
int template_id = -1);
1249 TestCase& operator*(const
char* in);
1251 template <typename T>
1265 template<
typename T>
1268 namespace binaryAssertComparison {
1283 #define DOCTEST_BINARY_RELATIONAL_OP(n, op) \ 1284 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); } }; 1297 const char* exception_type =
"",
const char* exception_string =
"");
1299 void setResult(
const Result& res);
1301 template <
int comparison,
typename L,
typename R>
1309 template <
typename L>
1314 m_failed = !m_failed;
1320 void translateException();
1326 namespace assertAction {
1338 const char* expr, Result result);
1340 #define DOCTEST_ASSERT_OUT_OF_TESTS(decomp) \ 1342 if(!is_running_in_test) { \ 1344 ResultBuilder rb(at, file, line, expr); \ 1345 rb.m_failed = failed; \ 1346 rb.m_decomp = decomp; \ 1347 failed_out_of_a_testing_context(rb); \ 1348 if(isDebuggerActive() && !getContextOptions()->no_breaks) \ 1349 DOCTEST_BREAK_INTO_DEBUGGER(); \ 1350 if(checkIfShouldThrow(at)) \ 1357 #define DOCTEST_ASSERT_IN_TESTS(decomp) \ 1358 ResultBuilder rb(at, file, line, expr); \ 1359 rb.m_failed = failed; \ 1360 if(rb.m_failed || getContextOptions()->success) \ 1361 rb.m_decomp = decomp; \ 1363 DOCTEST_BREAK_INTO_DEBUGGER(); \ 1364 if(rb.m_failed && checkIfShouldThrow(at)) \ 1367 template <
int comparison,
typename L,
typename R>
1381 template <
typename L>
1400 virtual ~IExceptionTranslator();
1401 virtual bool translate(
String&)
const = 0;
1404 template <
typename T>
1409 : m_translateFunction(translateFunction) {}
1412 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 1417 res = m_translateFunction(ex);
1420 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 1434 template <
typename T>
1447 template <
typename T>
1453 template <
typename T>
1457 template <
typename T>
1462 #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 1465 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 1514 template <
typename T>
1524 template <
typename L>
1530 #define DOCTEST_DEFINE_DECORATOR(name, type, def) \ 1534 name(type in = def) \ 1536 void fill(detail::TestCase& state) const { state.DOCTEST_CAT(m_, name) = data; } \ 1537 void fill(detail::TestSuite& state) const { state.DOCTEST_CAT(m_, name) = data; } \ 1548 template <
typename T>
1566 #else // DOCTEST_CONFIG_DISABLE 1567 template <
typename T>
1571 #endif // DOCTEST_CONFIG_DISABLE 1575 struct ContextState;
1580 detail::ContextState*
p;
1582 void parseArgs(
int argc,
const char*
const* argv,
bool withDefaults =
false);
1585 explicit Context(
int argc = 0,
const char*
const* argv =
nullptr);
1589 void applyCommandLine(
int argc,
const char*
const* argv);
1591 void addFilter(
const char* filter,
const char* value);
1592 void clearFilters();
1593 void setOption(
const char* option,
int value);
1594 void setOption(
const char* option,
const char* value);
1598 void setAsDefaultForAssertsOutOfTestCases();
1605 namespace TestCaseFailureReason {
1650 unsigned num_data = 0;
1660 virtual void report_query(
const QueryData&) = 0;
1663 virtual void test_run_start() = 0;
1670 virtual void test_case_reenter(
const TestCaseData&) = 0;
1680 virtual void subcase_end() = 0;
1683 virtual void log_assert(
const AssertData&) = 0;
1689 virtual void test_case_skipped(
const TestCaseData&) = 0;
1695 static int get_num_active_contexts();
1699 static int get_num_stringified_contexts();
1700 static const String* get_stringified_contexts();
1708 template <
typename Reporter>
1710 return new Reporter(o);
1714 template <
typename Reporter>
1722 #if !defined(DOCTEST_CONFIG_DISABLE) 1725 #define DOCTEST_ASSERT_LOG_AND_REACT(b) \ 1727 DOCTEST_BREAK_INTO_DEBUGGER(); \ 1730 #ifdef DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS 1731 #define DOCTEST_WRAP_IN_TRY(x) x; 1732 #else // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS 1733 #define DOCTEST_WRAP_IN_TRY(x) \ 1736 } catch(...) { _DOCTEST_RB.translateException(); } 1737 #endif // DOCTEST_CONFIG_NO_TRY_CATCH_IN_ASSERTS 1739 #ifdef DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS 1740 #define DOCTEST_CAST_TO_VOID(x) \ 1741 DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH("-Wuseless-cast") \ 1742 static_cast<void>(x); \ 1743 DOCTEST_GCC_SUPPRESS_WARNING_POP 1744 #else // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS 1745 #define DOCTEST_CAST_TO_VOID(x) x; 1746 #endif // DOCTEST_CONFIG_VOID_CAST_EXPRESSIONS 1749 #define DOCTEST_REGISTER_FUNCTION(global_prefix, f, decorators) \ 1750 global_prefix DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) = \ 1751 doctest::detail::regTest( \ 1752 doctest::detail::TestCase( \ 1753 f, __FILE__, __LINE__, \ 1754 doctest_detail_test_suite_ns::getCurrentTestSuite()) * \ 1756 DOCTEST_GLOBAL_NO_WARNINGS_END() 1758 #define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, decorators) \ 1760 struct der : public base \ 1764 static void func() { \ 1768 DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, func, decorators) \ 1770 inline DOCTEST_NOINLINE void der::f() 1772 #define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, decorators) \ 1774 DOCTEST_REGISTER_FUNCTION(DOCTEST_EMPTY, f, decorators) \ 1777 #define DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(f, proxy, decorators) \ 1778 static doctest::detail::funcType proxy() { return f; } \ 1779 DOCTEST_REGISTER_FUNCTION(inline const, proxy(), decorators) \ 1783 #define DOCTEST_TEST_CASE(decorators) \ 1784 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), decorators) 1787 #if __cplusplus >= 201703L || (DOCTEST_MSVC >= DOCTEST_COMPILER(19, 12, 0) && _MSVC_LANG >= 201703L) 1788 #define DOCTEST_TEST_CASE_CLASS(decorators) \ 1789 DOCTEST_CREATE_AND_REGISTER_FUNCTION_IN_CLASS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), \ 1790 DOCTEST_ANONYMOUS(_DOCTEST_ANON_PROXY_), \ 1792 #else // DOCTEST_TEST_CASE_CLASS 1793 #define DOCTEST_TEST_CASE_CLASS(...) \ 1794 TEST_CASES_CAN_BE_REGISTERED_IN_CLASSES_ONLY_IN_CPP17_MODE_OR_WITH_VS_2017_OR_NEWER 1795 #endif // DOCTEST_TEST_CASE_CLASS 1798 #define DOCTEST_TEST_CASE_FIXTURE(c, decorators) \ 1799 DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(_DOCTEST_ANON_CLASS_), c, \ 1800 DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), decorators) 1803 #define DOCTEST_TYPE_TO_STRING_IMPL(...) \ 1805 inline const char* type_to_string<__VA_ARGS__>() { \ 1806 return "<" #__VA_ARGS__ ">"; \ 1808 #define DOCTEST_TYPE_TO_STRING(...) \ 1809 namespace doctest { namespace detail { \ 1810 DOCTEST_TYPE_TO_STRING_IMPL(__VA_ARGS__) \ 1813 typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 1815 #define DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, iter, func) \ 1816 template <typename T> \ 1817 static void func(); \ 1819 template <typename Tuple> \ 1821 template <typename Type, typename... Rest> \ 1822 struct iter<std::tuple<Type, Rest...>> \ 1824 iter(const char* file, unsigned line, int index) { \ 1825 doctest::detail::regTest(doctest::detail::TestCase(func<Type>, file, line, \ 1826 doctest_detail_test_suite_ns::getCurrentTestSuite(), \ 1827 doctest::detail::type_to_string<Type>(), \ 1828 int(line) * 1000 + index) \ 1830 iter<std::tuple<Rest...>>(file, line, index + 1); \ 1834 struct iter<std::tuple<>> \ 1836 iter(const char*, unsigned, int) {} \ 1839 template <typename T> \ 1842 #define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(dec, T, id) \ 1843 DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(id, ITERATOR), \ 1844 DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)) 1846 #define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, anon, ...) \ 1847 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_CAT(anon, DUMMY)) = \ 1848 doctest::detail::instantiationHelper(DOCTEST_CAT(id, ITERATOR)<__VA_ARGS__>(__FILE__, __LINE__, 0));\ 1849 DOCTEST_GLOBAL_NO_WARNINGS_END() 1851 #define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...) \ 1852 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_), std::tuple<__VA_ARGS__>) \ 1853 typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 1855 #define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...) \ 1856 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(id, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_), __VA_ARGS__) \ 1857 typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 1859 #define DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, anon, ...) \ 1860 DOCTEST_TEST_CASE_TEMPLATE_DEFINE_IMPL(dec, T, DOCTEST_CAT(anon, ITERATOR), anon); \ 1861 DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE_IMPL(anon, anon, std::tuple<__VA_ARGS__>) \ 1862 template <typename T> \ 1865 #define DOCTEST_TEST_CASE_TEMPLATE(dec, T, ...) \ 1866 DOCTEST_TEST_CASE_TEMPLATE_IMPL(dec, T, DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_), __VA_ARGS__) 1869 #define DOCTEST_SUBCASE(name) \ 1870 if(const doctest::detail::Subcase & DOCTEST_ANONYMOUS(_DOCTEST_ANON_SUBCASE_) DOCTEST_UNUSED = \ 1871 doctest::detail::Subcase(name, __FILE__, __LINE__)) 1874 #define DOCTEST_TEST_SUITE_IMPL(decorators, ns_name) \ 1875 namespace ns_name { namespace doctest_detail_test_suite_ns { \ 1876 static DOCTEST_NOINLINE doctest::detail::TestSuite& getCurrentTestSuite() { \ 1877 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4640) \ 1878 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Wexit-time-destructors") \ 1879 static doctest::detail::TestSuite data; \ 1880 static bool inited = false; \ 1881 DOCTEST_MSVC_SUPPRESS_WARNING_POP \ 1882 DOCTEST_CLANG_SUPPRESS_WARNING_POP \ 1893 #define DOCTEST_TEST_SUITE(decorators) \ 1894 DOCTEST_TEST_SUITE_IMPL(decorators, DOCTEST_ANONYMOUS(_DOCTEST_ANON_SUITE_)) 1897 #define DOCTEST_TEST_SUITE_BEGIN(decorators) \ 1898 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) = \ 1899 doctest::detail::setTestSuite(doctest::detail::TestSuite() * decorators); \ 1900 DOCTEST_GLOBAL_NO_WARNINGS_END() \ 1901 typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 1904 #define DOCTEST_TEST_SUITE_END \ 1905 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_VAR_)) = \ 1906 doctest::detail::setTestSuite(doctest::detail::TestSuite() * ""); \ 1907 DOCTEST_GLOBAL_NO_WARNINGS_END() \ 1908 typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 1911 #define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(translatorName, signature) \ 1912 inline doctest::String translatorName(signature); \ 1913 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_)) = \ 1914 doctest::registerExceptionTranslator(translatorName); \ 1915 DOCTEST_GLOBAL_NO_WARNINGS_END() \ 1916 doctest::String translatorName(signature) 1918 #define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \ 1919 DOCTEST_REGISTER_EXCEPTION_TRANSLATOR_IMPL(DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_), \ 1923 #define DOCTEST_REGISTER_REPORTER(name, priority, reporter) \ 1924 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_REPORTER_)) = \ 1925 doctest::registerReporter<reporter>(name, priority, true); \ 1926 DOCTEST_GLOBAL_NO_WARNINGS_END() typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 1929 #define DOCTEST_REGISTER_LISTENER(name, priority, reporter) \ 1930 DOCTEST_GLOBAL_NO_WARNINGS(DOCTEST_ANONYMOUS(_DOCTEST_ANON_REPORTER_)) = \ 1931 doctest::registerReporter<reporter>(name, priority, false); \ 1932 DOCTEST_GLOBAL_NO_WARNINGS_END() typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 1935 #define DOCTEST_INFO(expression) \ 1936 DOCTEST_INFO_IMPL(DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_), DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_), \ 1937 DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_), expression) 1939 #define DOCTEST_INFO_IMPL(lambda_name, mb_name, s_name, expression) \ 1940 DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(4626) \ 1941 auto lambda_name = [&](std::ostream* s_name) { \ 1942 doctest::detail::MessageBuilder mb_name(__FILE__, __LINE__, doctest::assertType::is_warn); \ 1943 mb_name.m_stream = s_name; \ 1944 mb_name << expression; \ 1946 DOCTEST_MSVC_SUPPRESS_WARNING_POP \ 1947 auto DOCTEST_ANONYMOUS(_DOCTEST_CAPTURE_) = doctest::detail::MakeContextScope(lambda_name) 1949 #define DOCTEST_CAPTURE(x) DOCTEST_INFO(#x " := " << x) 1951 #define DOCTEST_ADD_AT_IMPL(type, file, line, mb, x) \ 1953 doctest::detail::MessageBuilder mb(file, line, doctest::assertType::type); \ 1955 DOCTEST_ASSERT_LOG_AND_REACT(mb); \ 1959 #define DOCTEST_ADD_MESSAGE_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_warn, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x) 1960 #define DOCTEST_ADD_FAIL_CHECK_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_check, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x) 1961 #define DOCTEST_ADD_FAIL_AT(file, line, x) DOCTEST_ADD_AT_IMPL(is_require, file, line, DOCTEST_ANONYMOUS(_DOCTEST_MESSAGE_), x) 1964 #define DOCTEST_MESSAGE(x) DOCTEST_ADD_MESSAGE_AT(__FILE__, __LINE__, x) 1965 #define DOCTEST_FAIL_CHECK(x) DOCTEST_ADD_FAIL_CHECK_AT(__FILE__, __LINE__, x) 1966 #define DOCTEST_FAIL(x) DOCTEST_ADD_FAIL_AT(__FILE__, __LINE__, x) 1968 #define DOCTEST_TO_LVALUE(...) __VA_ARGS__ // Not removed to keep backwards compatibility. 1970 #ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS 1972 #define DOCTEST_ASSERT_IMPLEMENT_2(assert_type, ...) \ 1973 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \ 1974 doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ 1975 __LINE__, #__VA_ARGS__); \ 1976 DOCTEST_WRAP_IN_TRY(_DOCTEST_RB.setResult( \ 1977 doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \ 1979 DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB) \ 1980 DOCTEST_CLANG_SUPPRESS_WARNING_POP 1982 #define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \ 1984 DOCTEST_ASSERT_IMPLEMENT_2(assert_type, __VA_ARGS__); \ 1987 #else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS 1990 #define DOCTEST_ASSERT_IMPLEMENT_2 DOCTEST_ASSERT_IMPLEMENT_1 1992 #define DOCTEST_ASSERT_IMPLEMENT_1(assert_type, ...) \ 1993 DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH("-Woverloaded-shift-op-parentheses") \ 1994 doctest::detail::decomp_assert( \ 1995 doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, \ 1996 doctest::detail::ExpressionDecomposer(doctest::assertType::assert_type) \ 1997 << __VA_ARGS__) DOCTEST_CLANG_SUPPRESS_WARNING_POP 1999 #endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS 2001 #define DOCTEST_WARN(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN, __VA_ARGS__) 2002 #define DOCTEST_CHECK(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK, __VA_ARGS__) 2003 #define DOCTEST_REQUIRE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE, __VA_ARGS__) 2004 #define DOCTEST_WARN_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_WARN_FALSE, __VA_ARGS__) 2005 #define DOCTEST_CHECK_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_CHECK_FALSE, __VA_ARGS__) 2006 #define DOCTEST_REQUIRE_FALSE(...) DOCTEST_ASSERT_IMPLEMENT_1(DT_REQUIRE_FALSE, __VA_ARGS__) 2009 #define DOCTEST_WARN_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN, cond); } while((void)0, 0) 2010 #define DOCTEST_CHECK_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK, cond); } while((void)0, 0) 2011 #define DOCTEST_REQUIRE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE, cond); } while((void)0, 0) 2012 #define DOCTEST_WARN_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_WARN_FALSE, cond); } while((void)0, 0) 2013 #define DOCTEST_CHECK_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_CHECK_FALSE, cond); } while((void)0, 0) 2014 #define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, msg) do { DOCTEST_INFO(msg); DOCTEST_ASSERT_IMPLEMENT_2(DT_REQUIRE_FALSE, cond); } while((void)0, 0) 2017 #define DOCTEST_ASSERT_THROWS_AS(expr, assert_type, message, ...) \ 2019 if(!doctest::getContextOptions()->no_throw) { \ 2020 doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ 2021 __LINE__, #expr, #__VA_ARGS__, message); \ 2023 DOCTEST_CAST_TO_VOID(expr) \ 2024 } catch(const doctest::detail::remove_const< \ 2025 doctest::detail::remove_reference<__VA_ARGS__>::type>::type&) { \ 2026 _DOCTEST_RB.translateException(); \ 2027 _DOCTEST_RB.m_threw_as = true; \ 2028 } catch(...) { _DOCTEST_RB.translateException(); } \ 2029 DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB); \ 2033 #define DOCTEST_ASSERT_THROWS_WITH(expr, assert_type, ...) \ 2035 if(!doctest::getContextOptions()->no_throw) { \ 2036 doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ 2037 __LINE__, #expr, "", __VA_ARGS__); \ 2039 DOCTEST_CAST_TO_VOID(expr) \ 2040 } catch(...) { _DOCTEST_RB.translateException(); } \ 2041 DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB); \ 2045 #define DOCTEST_ASSERT_NOTHROW(expr, assert_type) \ 2047 doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ 2050 DOCTEST_CAST_TO_VOID(expr) \ 2051 } catch(...) { _DOCTEST_RB.translateException(); } \ 2052 DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB); \ 2056 #define DOCTEST_WARN_THROWS(expr) DOCTEST_ASSERT_THROWS_WITH(expr, DT_WARN_THROWS, "") 2057 #define DOCTEST_CHECK_THROWS(expr) DOCTEST_ASSERT_THROWS_WITH(expr, DT_CHECK_THROWS, "") 2058 #define DOCTEST_REQUIRE_THROWS(expr) DOCTEST_ASSERT_THROWS_WITH(expr, DT_REQUIRE_THROWS, "") 2060 #define DOCTEST_WARN_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_AS, "", __VA_ARGS__) 2061 #define DOCTEST_CHECK_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_AS, "", __VA_ARGS__) 2062 #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_AS, "", __VA_ARGS__) 2064 #define DOCTEST_WARN_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_WARN_THROWS_WITH, __VA_ARGS__) 2065 #define DOCTEST_CHECK_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_CHECK_THROWS_WITH, __VA_ARGS__) 2066 #define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) DOCTEST_ASSERT_THROWS_WITH(expr, DT_REQUIRE_THROWS_WITH, __VA_ARGS__) 2068 #define DOCTEST_WARN_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_WARN_THROWS_WITH_AS, message, __VA_ARGS__) 2069 #define DOCTEST_CHECK_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_CHECK_THROWS_WITH_AS, message, __VA_ARGS__) 2070 #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, message, ...) DOCTEST_ASSERT_THROWS_AS(expr, DT_REQUIRE_THROWS_WITH_AS, message, __VA_ARGS__) 2072 #define DOCTEST_WARN_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_WARN_NOTHROW) 2073 #define DOCTEST_CHECK_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_CHECK_NOTHROW) 2074 #define DOCTEST_REQUIRE_NOTHROW(expr) DOCTEST_ASSERT_NOTHROW(expr, DT_REQUIRE_NOTHROW) 2076 #define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS(expr); } while((void)0, 0) 2077 #define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS(expr); } while((void)0, 0) 2078 #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS(expr); } while((void)0, 0) 2079 #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_AS(expr, ex); } while((void)0, 0) 2080 #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_AS(expr, ex); } while((void)0, 0) 2081 #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_AS(expr, ex); } while((void)0, 0) 2082 #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_WITH(expr, with); } while((void)0, 0) 2083 #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_WITH(expr, with); } while((void)0, 0) 2084 #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_WITH(expr, with); } while((void)0, 0) 2085 #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_THROWS_WITH_AS(expr, with, ex); } while((void)0, 0) 2086 #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ex); } while((void)0, 0) 2087 #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ex); } while((void)0, 0) 2088 #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_WARN_NOTHROW(expr); } while((void)0, 0) 2089 #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_CHECK_NOTHROW(expr); } while((void)0, 0) 2090 #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) do { DOCTEST_INFO(msg); DOCTEST_REQUIRE_NOTHROW(expr); } while((void)0, 0) 2093 #ifndef DOCTEST_CONFIG_SUPER_FAST_ASSERTS 2095 #define DOCTEST_BINARY_ASSERT(assert_type, comp, ...) \ 2097 doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ 2098 __LINE__, #__VA_ARGS__); \ 2099 DOCTEST_WRAP_IN_TRY( \ 2100 _DOCTEST_RB.binary_assert<doctest::detail::binaryAssertComparison::comp>( \ 2102 DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB); \ 2105 #define DOCTEST_UNARY_ASSERT(assert_type, ...) \ 2107 doctest::detail::ResultBuilder _DOCTEST_RB(doctest::assertType::assert_type, __FILE__, \ 2108 __LINE__, #__VA_ARGS__); \ 2109 DOCTEST_WRAP_IN_TRY(_DOCTEST_RB.unary_assert(__VA_ARGS__)) \ 2110 DOCTEST_ASSERT_LOG_AND_REACT(_DOCTEST_RB); \ 2113 #else // DOCTEST_CONFIG_SUPER_FAST_ASSERTS 2115 #define DOCTEST_BINARY_ASSERT(assert_type, comparison, ...) \ 2116 doctest::detail::binary_assert<doctest::detail::binaryAssertComparison::comparison>( \ 2117 doctest::assertType::assert_type, __FILE__, __LINE__, #__VA_ARGS__, __VA_ARGS__) 2119 #define DOCTEST_UNARY_ASSERT(assert_type, ...) \ 2120 doctest::detail::unary_assert(doctest::assertType::assert_type, __FILE__, __LINE__, \ 2121 #__VA_ARGS__, __VA_ARGS__) 2123 #endif // DOCTEST_CONFIG_SUPER_FAST_ASSERTS 2125 #define DOCTEST_WARN_EQ(...) DOCTEST_BINARY_ASSERT(DT_WARN_EQ, eq, __VA_ARGS__) 2126 #define DOCTEST_CHECK_EQ(...) DOCTEST_BINARY_ASSERT(DT_CHECK_EQ, eq, __VA_ARGS__) 2127 #define DOCTEST_REQUIRE_EQ(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_EQ, eq, __VA_ARGS__) 2128 #define DOCTEST_WARN_NE(...) DOCTEST_BINARY_ASSERT(DT_WARN_NE, ne, __VA_ARGS__) 2129 #define DOCTEST_CHECK_NE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_NE, ne, __VA_ARGS__) 2130 #define DOCTEST_REQUIRE_NE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_NE, ne, __VA_ARGS__) 2131 #define DOCTEST_WARN_GT(...) DOCTEST_BINARY_ASSERT(DT_WARN_GT, gt, __VA_ARGS__) 2132 #define DOCTEST_CHECK_GT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GT, gt, __VA_ARGS__) 2133 #define DOCTEST_REQUIRE_GT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GT, gt, __VA_ARGS__) 2134 #define DOCTEST_WARN_LT(...) DOCTEST_BINARY_ASSERT(DT_WARN_LT, lt, __VA_ARGS__) 2135 #define DOCTEST_CHECK_LT(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LT, lt, __VA_ARGS__) 2136 #define DOCTEST_REQUIRE_LT(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LT, lt, __VA_ARGS__) 2137 #define DOCTEST_WARN_GE(...) DOCTEST_BINARY_ASSERT(DT_WARN_GE, ge, __VA_ARGS__) 2138 #define DOCTEST_CHECK_GE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_GE, ge, __VA_ARGS__) 2139 #define DOCTEST_REQUIRE_GE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_GE, ge, __VA_ARGS__) 2140 #define DOCTEST_WARN_LE(...) DOCTEST_BINARY_ASSERT(DT_WARN_LE, le, __VA_ARGS__) 2141 #define DOCTEST_CHECK_LE(...) DOCTEST_BINARY_ASSERT(DT_CHECK_LE, le, __VA_ARGS__) 2142 #define DOCTEST_REQUIRE_LE(...) DOCTEST_BINARY_ASSERT(DT_REQUIRE_LE, le, __VA_ARGS__) 2144 #define DOCTEST_WARN_UNARY(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY, __VA_ARGS__) 2145 #define DOCTEST_CHECK_UNARY(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY, __VA_ARGS__) 2146 #define DOCTEST_REQUIRE_UNARY(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY, __VA_ARGS__) 2147 #define DOCTEST_WARN_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_WARN_UNARY_FALSE, __VA_ARGS__) 2148 #define DOCTEST_CHECK_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_CHECK_UNARY_FALSE, __VA_ARGS__) 2149 #define DOCTEST_REQUIRE_UNARY_FALSE(...) DOCTEST_UNARY_ASSERT(DT_REQUIRE_UNARY_FALSE, __VA_ARGS__) 2151 #ifdef DOCTEST_CONFIG_NO_EXCEPTIONS 2153 #undef DOCTEST_WARN_THROWS 2154 #undef DOCTEST_CHECK_THROWS 2155 #undef DOCTEST_REQUIRE_THROWS 2156 #undef DOCTEST_WARN_THROWS_AS 2157 #undef DOCTEST_CHECK_THROWS_AS 2158 #undef DOCTEST_REQUIRE_THROWS_AS 2159 #undef DOCTEST_WARN_THROWS_WITH 2160 #undef DOCTEST_CHECK_THROWS_WITH 2161 #undef DOCTEST_REQUIRE_THROWS_WITH 2162 #undef DOCTEST_WARN_THROWS_WITH_AS 2163 #undef DOCTEST_CHECK_THROWS_WITH_AS 2164 #undef DOCTEST_REQUIRE_THROWS_WITH_AS 2165 #undef DOCTEST_WARN_NOTHROW 2166 #undef DOCTEST_CHECK_NOTHROW 2167 #undef DOCTEST_REQUIRE_NOTHROW 2169 #undef DOCTEST_WARN_THROWS_MESSAGE 2170 #undef DOCTEST_CHECK_THROWS_MESSAGE 2171 #undef DOCTEST_REQUIRE_THROWS_MESSAGE 2172 #undef DOCTEST_WARN_THROWS_AS_MESSAGE 2173 #undef DOCTEST_CHECK_THROWS_AS_MESSAGE 2174 #undef DOCTEST_REQUIRE_THROWS_AS_MESSAGE 2175 #undef DOCTEST_WARN_THROWS_WITH_MESSAGE 2176 #undef DOCTEST_CHECK_THROWS_WITH_MESSAGE 2177 #undef DOCTEST_REQUIRE_THROWS_WITH_MESSAGE 2178 #undef DOCTEST_WARN_THROWS_WITH_AS_MESSAGE 2179 #undef DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE 2180 #undef DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE 2181 #undef DOCTEST_WARN_NOTHROW_MESSAGE 2182 #undef DOCTEST_CHECK_NOTHROW_MESSAGE 2183 #undef DOCTEST_REQUIRE_NOTHROW_MESSAGE 2185 #ifdef DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS 2187 #define DOCTEST_WARN_THROWS(expr) ((void)0) 2188 #define DOCTEST_CHECK_THROWS(expr) ((void)0) 2189 #define DOCTEST_REQUIRE_THROWS(expr) ((void)0) 2190 #define DOCTEST_WARN_THROWS_AS(expr, ...) ((void)0) 2191 #define DOCTEST_CHECK_THROWS_AS(expr, ...) ((void)0) 2192 #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ((void)0) 2193 #define DOCTEST_WARN_THROWS_WITH(expr, ...) ((void)0) 2194 #define DOCTEST_CHECK_THROWS_WITH(expr, ...) ((void)0) 2195 #define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ((void)0) 2196 #define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) ((void)0) 2197 #define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) ((void)0) 2198 #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) ((void)0) 2199 #define DOCTEST_WARN_NOTHROW(expr) ((void)0) 2200 #define DOCTEST_CHECK_NOTHROW(expr) ((void)0) 2201 #define DOCTEST_REQUIRE_NOTHROW(expr) ((void)0) 2203 #define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) ((void)0) 2204 #define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) ((void)0) 2205 #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) ((void)0) 2206 #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0) 2207 #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0) 2208 #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0) 2209 #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0) 2210 #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0) 2211 #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0) 2212 #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0) 2213 #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0) 2214 #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0) 2215 #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) ((void)0) 2216 #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) ((void)0) 2217 #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) ((void)0) 2219 #else // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS 2221 #undef DOCTEST_REQUIRE 2222 #undef DOCTEST_REQUIRE_FALSE 2223 #undef DOCTEST_REQUIRE_MESSAGE 2224 #undef DOCTEST_REQUIRE_FALSE_MESSAGE 2225 #undef DOCTEST_REQUIRE_EQ 2226 #undef DOCTEST_REQUIRE_NE 2227 #undef DOCTEST_REQUIRE_GT 2228 #undef DOCTEST_REQUIRE_LT 2229 #undef DOCTEST_REQUIRE_GE 2230 #undef DOCTEST_REQUIRE_LE 2231 #undef DOCTEST_REQUIRE_UNARY 2232 #undef DOCTEST_REQUIRE_UNARY_FALSE 2234 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS_BUT_WITH_ALL_ASSERTS 2236 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 2242 #else // DOCTEST_CONFIG_DISABLE 2244 #define DOCTEST_IMPLEMENT_FIXTURE(der, base, func, name) \ 2246 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \ 2247 struct der : public base \ 2250 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \ 2251 inline void der<DOCTEST_UNUSED_TEMPLATE_TYPE>::f() 2253 #define DOCTEST_CREATE_AND_REGISTER_FUNCTION(f, name) \ 2254 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \ 2255 static inline void f() 2258 #define DOCTEST_TEST_CASE(name) \ 2259 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name) 2262 #define DOCTEST_TEST_CASE_CLASS(name) \ 2263 DOCTEST_CREATE_AND_REGISTER_FUNCTION(DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name) 2266 #define DOCTEST_TEST_CASE_FIXTURE(x, name) \ 2267 DOCTEST_IMPLEMENT_FIXTURE(DOCTEST_ANONYMOUS(_DOCTEST_ANON_CLASS_), x, \ 2268 DOCTEST_ANONYMOUS(_DOCTEST_ANON_FUNC_), name) 2271 #define DOCTEST_TYPE_TO_STRING(...) typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 2272 #define DOCTEST_TYPE_TO_STRING_IMPL(...) 2275 #define DOCTEST_TEST_CASE_TEMPLATE(name, type, ...) \ 2276 template <typename type> \ 2277 inline void DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)() 2279 #define DOCTEST_TEST_CASE_TEMPLATE_DEFINE(name, type, id) \ 2280 template <typename type> \ 2281 inline void DOCTEST_ANONYMOUS(_DOCTEST_ANON_TMP_)() 2283 #define DOCTEST_TEST_CASE_TEMPLATE_INVOKE(id, ...) \ 2284 typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 2286 #define DOCTEST_TEST_CASE_TEMPLATE_APPLY(id, ...) \ 2287 typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 2290 #define DOCTEST_SUBCASE(name) 2293 #define DOCTEST_TEST_SUITE(name) namespace 2296 #define DOCTEST_TEST_SUITE_BEGIN(name) typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 2299 #define DOCTEST_TEST_SUITE_END typedef int DOCTEST_ANONYMOUS(_DOCTEST_ANON_FOR_SEMICOLON_) 2301 #define DOCTEST_REGISTER_EXCEPTION_TRANSLATOR(signature) \ 2302 template <typename DOCTEST_UNUSED_TEMPLATE_TYPE> \ 2303 static inline doctest::String DOCTEST_ANONYMOUS(_DOCTEST_ANON_TRANSLATOR_)(signature) 2305 #define DOCTEST_REGISTER_REPORTER(name, priority, reporter) 2306 #define DOCTEST_REGISTER_LISTENER(name, priority, reporter) 2308 #define DOCTEST_INFO(x) ((void)0) 2309 #define DOCTEST_CAPTURE(x) ((void)0) 2310 #define DOCTEST_ADD_MESSAGE_AT(file, line, x) ((void)0) 2311 #define DOCTEST_ADD_FAIL_CHECK_AT(file, line, x) ((void)0) 2312 #define DOCTEST_ADD_FAIL_AT(file, line, x) ((void)0) 2313 #define DOCTEST_MESSAGE(x) ((void)0) 2314 #define DOCTEST_FAIL_CHECK(x) ((void)0) 2315 #define DOCTEST_FAIL(x) ((void)0) 2317 #define DOCTEST_WARN(...) ((void)0) 2318 #define DOCTEST_CHECK(...) ((void)0) 2319 #define DOCTEST_REQUIRE(...) ((void)0) 2320 #define DOCTEST_WARN_FALSE(...) ((void)0) 2321 #define DOCTEST_CHECK_FALSE(...) ((void)0) 2322 #define DOCTEST_REQUIRE_FALSE(...) ((void)0) 2324 #define DOCTEST_WARN_MESSAGE(cond, msg) ((void)0) 2325 #define DOCTEST_CHECK_MESSAGE(cond, msg) ((void)0) 2326 #define DOCTEST_REQUIRE_MESSAGE(cond, msg) ((void)0) 2327 #define DOCTEST_WARN_FALSE_MESSAGE(cond, msg) ((void)0) 2328 #define DOCTEST_CHECK_FALSE_MESSAGE(cond, msg) ((void)0) 2329 #define DOCTEST_REQUIRE_FALSE_MESSAGE(cond, msg) ((void)0) 2331 #define DOCTEST_WARN_THROWS(expr) ((void)0) 2332 #define DOCTEST_CHECK_THROWS(expr) ((void)0) 2333 #define DOCTEST_REQUIRE_THROWS(expr) ((void)0) 2334 #define DOCTEST_WARN_THROWS_AS(expr, ...) ((void)0) 2335 #define DOCTEST_CHECK_THROWS_AS(expr, ...) ((void)0) 2336 #define DOCTEST_REQUIRE_THROWS_AS(expr, ...) ((void)0) 2337 #define DOCTEST_WARN_THROWS_WITH(expr, ...) ((void)0) 2338 #define DOCTEST_CHECK_THROWS_WITH(expr, ...) ((void)0) 2339 #define DOCTEST_REQUIRE_THROWS_WITH(expr, ...) ((void)0) 2340 #define DOCTEST_WARN_THROWS_WITH_AS(expr, with, ...) ((void)0) 2341 #define DOCTEST_CHECK_THROWS_WITH_AS(expr, with, ...) ((void)0) 2342 #define DOCTEST_REQUIRE_THROWS_WITH_AS(expr, with, ...) ((void)0) 2343 #define DOCTEST_WARN_NOTHROW(expr) ((void)0) 2344 #define DOCTEST_CHECK_NOTHROW(expr) ((void)0) 2345 #define DOCTEST_REQUIRE_NOTHROW(expr) ((void)0) 2347 #define DOCTEST_WARN_THROWS_MESSAGE(expr, msg) ((void)0) 2348 #define DOCTEST_CHECK_THROWS_MESSAGE(expr, msg) ((void)0) 2349 #define DOCTEST_REQUIRE_THROWS_MESSAGE(expr, msg) ((void)0) 2350 #define DOCTEST_WARN_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0) 2351 #define DOCTEST_CHECK_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0) 2352 #define DOCTEST_REQUIRE_THROWS_AS_MESSAGE(expr, ex, msg) ((void)0) 2353 #define DOCTEST_WARN_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0) 2354 #define DOCTEST_CHECK_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0) 2355 #define DOCTEST_REQUIRE_THROWS_WITH_MESSAGE(expr, with, msg) ((void)0) 2356 #define DOCTEST_WARN_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0) 2357 #define DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0) 2358 #define DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE(expr, with, ex, msg) ((void)0) 2359 #define DOCTEST_WARN_NOTHROW_MESSAGE(expr, msg) ((void)0) 2360 #define DOCTEST_CHECK_NOTHROW_MESSAGE(expr, msg) ((void)0) 2361 #define DOCTEST_REQUIRE_NOTHROW_MESSAGE(expr, msg) ((void)0) 2363 #define DOCTEST_WARN_EQ(...) ((void)0) 2364 #define DOCTEST_CHECK_EQ(...) ((void)0) 2365 #define DOCTEST_REQUIRE_EQ(...) ((void)0) 2366 #define DOCTEST_WARN_NE(...) ((void)0) 2367 #define DOCTEST_CHECK_NE(...) ((void)0) 2368 #define DOCTEST_REQUIRE_NE(...) ((void)0) 2369 #define DOCTEST_WARN_GT(...) ((void)0) 2370 #define DOCTEST_CHECK_GT(...) ((void)0) 2371 #define DOCTEST_REQUIRE_GT(...) ((void)0) 2372 #define DOCTEST_WARN_LT(...) ((void)0) 2373 #define DOCTEST_CHECK_LT(...) ((void)0) 2374 #define DOCTEST_REQUIRE_LT(...) ((void)0) 2375 #define DOCTEST_WARN_GE(...) ((void)0) 2376 #define DOCTEST_CHECK_GE(...) ((void)0) 2377 #define DOCTEST_REQUIRE_GE(...) ((void)0) 2378 #define DOCTEST_WARN_LE(...) ((void)0) 2379 #define DOCTEST_CHECK_LE(...) ((void)0) 2380 #define DOCTEST_REQUIRE_LE(...) ((void)0) 2382 #define DOCTEST_WARN_UNARY(...) ((void)0) 2383 #define DOCTEST_CHECK_UNARY(...) ((void)0) 2384 #define DOCTEST_REQUIRE_UNARY(...) ((void)0) 2385 #define DOCTEST_WARN_UNARY_FALSE(...) ((void)0) 2386 #define DOCTEST_CHECK_UNARY_FALSE(...) ((void)0) 2387 #define DOCTEST_REQUIRE_UNARY_FALSE(...) ((void)0) 2389 #endif // DOCTEST_CONFIG_DISABLE 2393 #define DOCTEST_FAST_WARN_EQ DOCTEST_WARN_EQ 2394 #define DOCTEST_FAST_CHECK_EQ DOCTEST_CHECK_EQ 2395 #define DOCTEST_FAST_REQUIRE_EQ DOCTEST_REQUIRE_EQ 2396 #define DOCTEST_FAST_WARN_NE DOCTEST_WARN_NE 2397 #define DOCTEST_FAST_CHECK_NE DOCTEST_CHECK_NE 2398 #define DOCTEST_FAST_REQUIRE_NE DOCTEST_REQUIRE_NE 2399 #define DOCTEST_FAST_WARN_GT DOCTEST_WARN_GT 2400 #define DOCTEST_FAST_CHECK_GT DOCTEST_CHECK_GT 2401 #define DOCTEST_FAST_REQUIRE_GT DOCTEST_REQUIRE_GT 2402 #define DOCTEST_FAST_WARN_LT DOCTEST_WARN_LT 2403 #define DOCTEST_FAST_CHECK_LT DOCTEST_CHECK_LT 2404 #define DOCTEST_FAST_REQUIRE_LT DOCTEST_REQUIRE_LT 2405 #define DOCTEST_FAST_WARN_GE DOCTEST_WARN_GE 2406 #define DOCTEST_FAST_CHECK_GE DOCTEST_CHECK_GE 2407 #define DOCTEST_FAST_REQUIRE_GE DOCTEST_REQUIRE_GE 2408 #define DOCTEST_FAST_WARN_LE DOCTEST_WARN_LE 2409 #define DOCTEST_FAST_CHECK_LE DOCTEST_CHECK_LE 2410 #define DOCTEST_FAST_REQUIRE_LE DOCTEST_REQUIRE_LE 2412 #define DOCTEST_FAST_WARN_UNARY DOCTEST_WARN_UNARY 2413 #define DOCTEST_FAST_CHECK_UNARY DOCTEST_CHECK_UNARY 2414 #define DOCTEST_FAST_REQUIRE_UNARY DOCTEST_REQUIRE_UNARY 2415 #define DOCTEST_FAST_WARN_UNARY_FALSE DOCTEST_WARN_UNARY_FALSE 2416 #define DOCTEST_FAST_CHECK_UNARY_FALSE DOCTEST_CHECK_UNARY_FALSE 2417 #define DOCTEST_FAST_REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE 2419 #define DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE DOCTEST_TEST_CASE_TEMPLATE_INVOKE 2424 #define DOCTEST_SCENARIO(name) DOCTEST_TEST_CASE(" Scenario: " name) 2425 #define DOCTEST_SCENARIO_CLASS(name) DOCTEST_TEST_CASE_CLASS(" Scenario: " name) 2426 #define DOCTEST_SCENARIO_TEMPLATE(name, T, ...) DOCTEST_TEST_CASE_TEMPLATE(" Scenario: " name, T, __VA_ARGS__) 2427 #define DOCTEST_SCENARIO_TEMPLATE_DEFINE(name, T, id) DOCTEST_TEST_CASE_TEMPLATE_DEFINE(" Scenario: " name, T, id) 2429 #define DOCTEST_GIVEN(name) DOCTEST_SUBCASE(" Given: " name) 2430 #define DOCTEST_WHEN(name) DOCTEST_SUBCASE(" When: " name) 2431 #define DOCTEST_AND_WHEN(name) DOCTEST_SUBCASE("And when: " name) 2432 #define DOCTEST_THEN(name) DOCTEST_SUBCASE(" Then: " name) 2433 #define DOCTEST_AND_THEN(name) DOCTEST_SUBCASE(" And: " name) 2437 #if !defined(DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES) 2439 #define TEST_CASE DOCTEST_TEST_CASE 2440 #define TEST_CASE_CLASS DOCTEST_TEST_CASE_CLASS 2441 #define TEST_CASE_FIXTURE DOCTEST_TEST_CASE_FIXTURE 2442 #define TYPE_TO_STRING DOCTEST_TYPE_TO_STRING 2443 #define TEST_CASE_TEMPLATE DOCTEST_TEST_CASE_TEMPLATE 2444 #define TEST_CASE_TEMPLATE_DEFINE DOCTEST_TEST_CASE_TEMPLATE_DEFINE 2445 #define TEST_CASE_TEMPLATE_INVOKE DOCTEST_TEST_CASE_TEMPLATE_INVOKE 2446 #define TEST_CASE_TEMPLATE_APPLY DOCTEST_TEST_CASE_TEMPLATE_APPLY 2447 #define SUBCASE DOCTEST_SUBCASE 2448 #define TEST_SUITE DOCTEST_TEST_SUITE 2449 #define TEST_SUITE_BEGIN DOCTEST_TEST_SUITE_BEGIN 2450 #define TEST_SUITE_END DOCTEST_TEST_SUITE_END 2451 #define REGISTER_EXCEPTION_TRANSLATOR DOCTEST_REGISTER_EXCEPTION_TRANSLATOR 2452 #define REGISTER_REPORTER DOCTEST_REGISTER_REPORTER 2453 #define REGISTER_LISTENER DOCTEST_REGISTER_LISTENER 2454 #define INFO DOCTEST_INFO 2455 #define CAPTURE DOCTEST_CAPTURE 2456 #define ADD_MESSAGE_AT DOCTEST_ADD_MESSAGE_AT 2457 #define ADD_FAIL_CHECK_AT DOCTEST_ADD_FAIL_CHECK_AT 2458 #define ADD_FAIL_AT DOCTEST_ADD_FAIL_AT 2459 #define MESSAGE DOCTEST_MESSAGE 2460 #define FAIL_CHECK DOCTEST_FAIL_CHECK 2461 #define FAIL DOCTEST_FAIL 2462 #define TO_LVALUE DOCTEST_TO_LVALUE 2464 #define WARN DOCTEST_WARN 2465 #define WARN_FALSE DOCTEST_WARN_FALSE 2466 #define WARN_THROWS DOCTEST_WARN_THROWS 2467 #define WARN_THROWS_AS DOCTEST_WARN_THROWS_AS 2468 #define WARN_THROWS_WITH DOCTEST_WARN_THROWS_WITH 2469 #define WARN_THROWS_WITH_AS DOCTEST_WARN_THROWS_WITH_AS 2470 #define WARN_NOTHROW DOCTEST_WARN_NOTHROW 2471 #define CHECK DOCTEST_CHECK 2472 #define CHECK_FALSE DOCTEST_CHECK_FALSE 2473 #define CHECK_THROWS DOCTEST_CHECK_THROWS 2474 #define CHECK_THROWS_AS DOCTEST_CHECK_THROWS_AS 2475 #define CHECK_THROWS_WITH DOCTEST_CHECK_THROWS_WITH 2476 #define CHECK_THROWS_WITH_AS DOCTEST_CHECK_THROWS_WITH_AS 2477 #define CHECK_NOTHROW DOCTEST_CHECK_NOTHROW 2478 #define REQUIRE DOCTEST_REQUIRE 2479 #define REQUIRE_FALSE DOCTEST_REQUIRE_FALSE 2480 #define REQUIRE_THROWS DOCTEST_REQUIRE_THROWS 2481 #define REQUIRE_THROWS_AS DOCTEST_REQUIRE_THROWS_AS 2482 #define REQUIRE_THROWS_WITH DOCTEST_REQUIRE_THROWS_WITH 2483 #define REQUIRE_THROWS_WITH_AS DOCTEST_REQUIRE_THROWS_WITH_AS 2484 #define REQUIRE_NOTHROW DOCTEST_REQUIRE_NOTHROW 2486 #define WARN_MESSAGE DOCTEST_WARN_MESSAGE 2487 #define WARN_FALSE_MESSAGE DOCTEST_WARN_FALSE_MESSAGE 2488 #define WARN_THROWS_MESSAGE DOCTEST_WARN_THROWS_MESSAGE 2489 #define WARN_THROWS_AS_MESSAGE DOCTEST_WARN_THROWS_AS_MESSAGE 2490 #define WARN_THROWS_WITH_MESSAGE DOCTEST_WARN_THROWS_WITH_MESSAGE 2491 #define WARN_THROWS_WITH_AS_MESSAGE DOCTEST_WARN_THROWS_WITH_AS_MESSAGE 2492 #define WARN_NOTHROW_MESSAGE DOCTEST_WARN_NOTHROW_MESSAGE 2493 #define CHECK_MESSAGE DOCTEST_CHECK_MESSAGE 2494 #define CHECK_FALSE_MESSAGE DOCTEST_CHECK_FALSE_MESSAGE 2495 #define CHECK_THROWS_MESSAGE DOCTEST_CHECK_THROWS_MESSAGE 2496 #define CHECK_THROWS_AS_MESSAGE DOCTEST_CHECK_THROWS_AS_MESSAGE 2497 #define CHECK_THROWS_WITH_MESSAGE DOCTEST_CHECK_THROWS_WITH_MESSAGE 2498 #define CHECK_THROWS_WITH_AS_MESSAGE DOCTEST_CHECK_THROWS_WITH_AS_MESSAGE 2499 #define CHECK_NOTHROW_MESSAGE DOCTEST_CHECK_NOTHROW_MESSAGE 2500 #define REQUIRE_MESSAGE DOCTEST_REQUIRE_MESSAGE 2501 #define REQUIRE_FALSE_MESSAGE DOCTEST_REQUIRE_FALSE_MESSAGE 2502 #define REQUIRE_THROWS_MESSAGE DOCTEST_REQUIRE_THROWS_MESSAGE 2503 #define REQUIRE_THROWS_AS_MESSAGE DOCTEST_REQUIRE_THROWS_AS_MESSAGE 2504 #define REQUIRE_THROWS_WITH_MESSAGE DOCTEST_REQUIRE_THROWS_WITH_MESSAGE 2505 #define REQUIRE_THROWS_WITH_AS_MESSAGE DOCTEST_REQUIRE_THROWS_WITH_AS_MESSAGE 2506 #define REQUIRE_NOTHROW_MESSAGE DOCTEST_REQUIRE_NOTHROW_MESSAGE 2508 #define SCENARIO DOCTEST_SCENARIO 2509 #define SCENARIO_CLASS DOCTEST_SCENARIO_CLASS 2510 #define SCENARIO_TEMPLATE DOCTEST_SCENARIO_TEMPLATE 2511 #define SCENARIO_TEMPLATE_DEFINE DOCTEST_SCENARIO_TEMPLATE_DEFINE 2512 #define GIVEN DOCTEST_GIVEN 2513 #define WHEN DOCTEST_WHEN 2514 #define AND_WHEN DOCTEST_AND_WHEN 2515 #define THEN DOCTEST_THEN 2516 #define AND_THEN DOCTEST_AND_THEN 2518 #define WARN_EQ DOCTEST_WARN_EQ 2519 #define CHECK_EQ DOCTEST_CHECK_EQ 2520 #define REQUIRE_EQ DOCTEST_REQUIRE_EQ 2521 #define WARN_NE DOCTEST_WARN_NE 2522 #define CHECK_NE DOCTEST_CHECK_NE 2523 #define REQUIRE_NE DOCTEST_REQUIRE_NE 2524 #define WARN_GT DOCTEST_WARN_GT 2525 #define CHECK_GT DOCTEST_CHECK_GT 2526 #define REQUIRE_GT DOCTEST_REQUIRE_GT 2527 #define WARN_LT DOCTEST_WARN_LT 2528 #define CHECK_LT DOCTEST_CHECK_LT 2529 #define REQUIRE_LT DOCTEST_REQUIRE_LT 2530 #define WARN_GE DOCTEST_WARN_GE 2531 #define CHECK_GE DOCTEST_CHECK_GE 2532 #define REQUIRE_GE DOCTEST_REQUIRE_GE 2533 #define WARN_LE DOCTEST_WARN_LE 2534 #define CHECK_LE DOCTEST_CHECK_LE 2535 #define REQUIRE_LE DOCTEST_REQUIRE_LE 2536 #define WARN_UNARY DOCTEST_WARN_UNARY 2537 #define CHECK_UNARY DOCTEST_CHECK_UNARY 2538 #define REQUIRE_UNARY DOCTEST_REQUIRE_UNARY 2539 #define WARN_UNARY_FALSE DOCTEST_WARN_UNARY_FALSE 2540 #define CHECK_UNARY_FALSE DOCTEST_CHECK_UNARY_FALSE 2541 #define REQUIRE_UNARY_FALSE DOCTEST_REQUIRE_UNARY_FALSE 2544 #define FAST_WARN_EQ DOCTEST_FAST_WARN_EQ 2545 #define FAST_CHECK_EQ DOCTEST_FAST_CHECK_EQ 2546 #define FAST_REQUIRE_EQ DOCTEST_FAST_REQUIRE_EQ 2547 #define FAST_WARN_NE DOCTEST_FAST_WARN_NE 2548 #define FAST_CHECK_NE DOCTEST_FAST_CHECK_NE 2549 #define FAST_REQUIRE_NE DOCTEST_FAST_REQUIRE_NE 2550 #define FAST_WARN_GT DOCTEST_FAST_WARN_GT 2551 #define FAST_CHECK_GT DOCTEST_FAST_CHECK_GT 2552 #define FAST_REQUIRE_GT DOCTEST_FAST_REQUIRE_GT 2553 #define FAST_WARN_LT DOCTEST_FAST_WARN_LT 2554 #define FAST_CHECK_LT DOCTEST_FAST_CHECK_LT 2555 #define FAST_REQUIRE_LT DOCTEST_FAST_REQUIRE_LT 2556 #define FAST_WARN_GE DOCTEST_FAST_WARN_GE 2557 #define FAST_CHECK_GE DOCTEST_FAST_CHECK_GE 2558 #define FAST_REQUIRE_GE DOCTEST_FAST_REQUIRE_GE 2559 #define FAST_WARN_LE DOCTEST_FAST_WARN_LE 2560 #define FAST_CHECK_LE DOCTEST_FAST_CHECK_LE 2561 #define FAST_REQUIRE_LE DOCTEST_FAST_REQUIRE_LE 2563 #define FAST_WARN_UNARY DOCTEST_FAST_WARN_UNARY 2564 #define FAST_CHECK_UNARY DOCTEST_FAST_CHECK_UNARY 2565 #define FAST_REQUIRE_UNARY DOCTEST_FAST_REQUIRE_UNARY 2566 #define FAST_WARN_UNARY_FALSE DOCTEST_FAST_WARN_UNARY_FALSE 2567 #define FAST_CHECK_UNARY_FALSE DOCTEST_FAST_CHECK_UNARY_FALSE 2568 #define FAST_REQUIRE_UNARY_FALSE DOCTEST_FAST_REQUIRE_UNARY_FALSE 2570 #define TEST_CASE_TEMPLATE_INSTANTIATE DOCTEST_TEST_CASE_TEMPLATE_INSTANTIATE 2572 #endif // DOCTEST_CONFIG_NO_SHORT_MACRO_NAMES 2574 #if !defined(DOCTEST_CONFIG_DISABLE) 2580 namespace doctest {
namespace detail {
2588 #if !DOCTEST_MSVC || defined(_NATIVE_WCHAR_T_DEFINED) 2590 #endif // not MSVC or wchar_t support enabled 2601 #endif // DOCTEST_CONFIG_DISABLE 2607 #endif // DOCTEST_LIBRARY_INCLUDED 2609 #ifndef DOCTEST_SINGLE_HEADER 2610 #define DOCTEST_SINGLE_HEADER 2611 #endif // DOCTEST_SINGLE_HEADER 2613 #if defined(DOCTEST_CONFIG_IMPLEMENT) || !defined(DOCTEST_SINGLE_HEADER) 2615 #ifndef DOCTEST_SINGLE_HEADER 2616 #include "doctest_fwd.h" 2617 #endif // DOCTEST_SINGLE_HEADER 2621 #ifndef DOCTEST_LIBRARY_IMPLEMENTATION 2622 #define DOCTEST_LIBRARY_IMPLEMENTATION 2708 #endif // __BORLANDC__ 2718 #include <algorithm> 2725 #include <exception> 2726 #include <stdexcept> 2727 #ifdef DOCTEST_CONFIG_POSIX_SIGNALS 2729 #endif // DOCTEST_CONFIG_POSIX_SIGNALS 2734 #ifdef DOCTEST_PLATFORM_MAC 2735 #include <sys/types.h> 2737 #include <sys/sysctl.h> 2738 #endif // DOCTEST_PLATFORM_MAC 2740 #ifdef DOCTEST_PLATFORM_WINDOWS 2743 #ifndef WIN32_LEAN_AND_MEAN 2744 #define WIN32_LEAN_AND_MEAN 2745 #endif // WIN32_LEAN_AND_MEAN 2754 #include <Windows.h> 2758 #else // DOCTEST_PLATFORM_WINDOWS 2760 #include <sys/time.h> 2763 #endif // DOCTEST_PLATFORM_WINDOWS 2768 #define DOCTEST_COUNTOF(x) (sizeof(x) / sizeof(x[0])) 2770 #ifdef DOCTEST_CONFIG_DISABLE 2771 #define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_disabled 2772 #else // DOCTEST_CONFIG_DISABLE 2773 #define DOCTEST_BRANCH_ON_DISABLED(if_disabled, if_not_disabled) if_not_disabled 2774 #endif // DOCTEST_CONFIG_DISABLE 2776 #ifndef DOCTEST_CONFIG_OPTIONS_PREFIX 2777 #define DOCTEST_CONFIG_OPTIONS_PREFIX "dt-" 2780 #ifndef DOCTEST_THREAD_LOCAL 2781 #define DOCTEST_THREAD_LOCAL thread_local 2784 #ifdef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS 2785 #define DOCTEST_OPTIONS_PREFIX_DISPLAY DOCTEST_CONFIG_OPTIONS_PREFIX 2787 #define DOCTEST_OPTIONS_PREFIX_DISPLAY "" 2792 bool is_running_in_test =
false;
2795 using namespace detail;
2797 int stricmp(
const char* a,
const char* b) {
2799 const int d = tolower(*a) - tolower(*b);
2805 template <
typename T>
2806 String fpToString(T value,
int precision) {
2807 std::ostringstream oss;
2808 oss << std::setprecision(precision) << std::fixed << value;
2809 std::string
d = oss.str();
2810 size_t i = d.find_last_not_of(
'0');
2811 if(i != std::string::npos && i != d.size() - 1) {
2814 d = d.substr(0, i + 1);
2827 static Arch which() {
2830 auto ptr =
reinterpret_cast<char*
>(&x);
2839 void my_memcpy(
void* dest,
const void* src,
unsigned num) { memcpy(dest, src, num); }
2843 int i = 0, end =
static_cast<int>(size), inc = 1;
2844 if(Endianness::which() == Endianness::Little) {
2849 unsigned const char* bytes =
static_cast<unsigned const char*
>(object);
2850 std::ostringstream oss;
2851 oss <<
"0x" << std::setfill(
'0') << std::hex;
2852 for(; i != end; i += inc)
2853 oss << std::setw(2) <<
static_cast<unsigned>(bytes[i]);
2854 return oss.str().
c_str();
2857 DOCTEST_THREAD_LOCAL std::ostringstream g_oss;
2868 return g_oss.str().
c_str();
2871 #ifndef DOCTEST_CONFIG_DISABLE 2873 namespace timer_large_integer
2876 #if defined(DOCTEST_PLATFORM_WINDOWS) 2877 typedef ULONGLONG
type;
2878 #else // DOCTEST_PLATFORM_WINDOWS 2879 using namespace std;
2880 typedef uint64_t
type;
2881 #endif // DOCTEST_PLATFORM_WINDOWS 2886 #ifdef DOCTEST_CONFIG_GETCURRENTTICKS 2887 ticks_t getCurrentTicks() {
return DOCTEST_CONFIG_GETCURRENTTICKS(); }
2888 #elif defined(DOCTEST_PLATFORM_WINDOWS) 2889 ticks_t getCurrentTicks() {
2890 static LARGE_INTEGER hz = {0}, hzo = {0};
2892 QueryPerformanceFrequency(&hz);
2893 QueryPerformanceCounter(&hzo);
2896 QueryPerformanceCounter(&t);
2897 return ((t.QuadPart - hzo.QuadPart) * LONGLONG(1000000)) / hz.QuadPart;
2899 #else // DOCTEST_PLATFORM_WINDOWS 2900 ticks_t getCurrentTicks() {
2902 gettimeofday(&t,
nullptr);
2903 return static_cast<ticks_t
>(t.tv_sec) * 1000000 + static_cast<ticks_t>(t.tv_usec);
2905 #endif // DOCTEST_PLATFORM_WINDOWS 2909 void start() { m_ticks = getCurrentTicks(); }
2910 unsigned int getElapsedMicroseconds()
const {
2911 return static_cast<unsigned int>(getCurrentTicks() - m_ticks);
2916 double getElapsedSeconds()
const {
return (getCurrentTicks() - m_ticks) / 1000000.0; }
2919 ticks_t m_ticks = 0;
2923 struct ContextState : ContextOptions, TestRunStats, CurrentTestCaseStats
2925 std::atomic<int> numAssertsCurrentTest_atomic;
2926 std::atomic<int> numAssertsFailedCurrentTest_atomic;
2928 std::vector<std::vector<String>> filters = decltype(filters)(9);
2930 std::vector<IReporter*> reporters_currently_used;
2932 const TestCase* currentTest =
nullptr;
2938 std::vector<String> stringifiedContexts;
2941 std::vector<SubcaseSignature> subcasesStack;
2942 std::set<decltype(subcasesStack)> subcasesPassed;
2943 int subcasesCurrentMaxLevel;
2944 bool should_reenter;
2945 std::atomic<bool> shouldLogCurrentException;
2947 void resetRunData() {
2949 numTestCasesPassingFilters = 0;
2950 numTestSuitesPassingFilters = 0;
2951 numTestCasesFailed = 0;
2953 numAssertsFailed = 0;
2954 numAssertsCurrentTest = 0;
2955 numAssertsFailedCurrentTest = 0;
2958 void finalizeTestCaseData() {
2959 seconds = timer.getElapsedSeconds();
2962 numAsserts += numAssertsCurrentTest_atomic;
2963 numAssertsFailed += numAssertsFailedCurrentTest_atomic;
2964 numAssertsCurrentTest = numAssertsCurrentTest_atomic;
2965 numAssertsFailedCurrentTest = numAssertsFailedCurrentTest_atomic;
2967 if(numAssertsFailedCurrentTest)
2970 if(Approx(currentTest->m_timeout).epsilon(DBL_EPSILON) != 0 &&
2971 Approx(seconds).epsilon(DBL_EPSILON) > currentTest->m_timeout)
2974 if(currentTest->m_should_fail) {
2980 }
else if(failure_flags && currentTest->m_may_fail) {
2982 }
else if(currentTest->m_expected_failures > 0) {
2983 if(numAssertsFailedCurrentTest == currentTest->m_expected_failures) {
2995 if(failure_flags && !ok_to_fail)
2996 numTestCasesFailed++;
3000 ContextState* g_cs =
nullptr;
3005 DOCTEST_THREAD_LOCAL
bool g_no_colors;
3007 #endif // DOCTEST_CONFIG_DISABLE 3010 void String::setOnHeap() { *
reinterpret_cast<unsigned char*
>(&buf[last]) = 128; }
3014 using namespace std;
3015 if(other.isOnStack()) {
3016 memcpy(buf, other.buf, len);
3019 data.size = other.data.size;
3020 data.capacity = data.size + 1;
3021 data.ptr =
new char[data.capacity];
3022 memcpy(data.ptr, other.data.ptr, data.size + 1);
3037 : String(in, strlen(in)) {}
3040 using namespace std;
3041 if(in_size <= last) {
3042 memcpy(buf, in, in_size + 1);
3043 setLast(last - in_size);
3046 data.size = in_size;
3047 data.capacity = data.size + 1;
3048 data.ptr =
new char[data.capacity];
3049 memcpy(data.ptr, in, in_size + 1);
3056 if(
this != &other) {
3067 const unsigned my_old_size = size();
3068 const unsigned other_size = other.size();
3069 const unsigned total_size = my_old_size + other_size;
3070 using namespace std;
3072 if(total_size < len) {
3074 memcpy(buf + my_old_size, other.c_str(), other_size + 1);
3075 setLast(last - total_size);
3078 char* temp =
new char[total_size + 1];
3080 memcpy(temp, buf, my_old_size);
3083 data.size = total_size;
3084 data.capacity = data.size + 1;
3087 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
3090 if(data.capacity > total_size) {
3092 data.size = total_size;
3093 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
3097 if(data.capacity <= total_size)
3098 data.capacity = total_size + 1;
3100 char* temp =
new char[data.capacity];
3102 memcpy(temp, data.ptr, my_old_size);
3106 data.size = total_size;
3109 memcpy(data.ptr + my_old_size, other.c_str(), other_size + 1);
3116 String
String::operator+(
const String& other)
const {
return String(*
this) += other; }
3119 using namespace std;
3120 memcpy(buf, other.buf, len);
3121 other.buf[0] =
'\0';
3126 using namespace std;
3127 if(
this != &other) {
3130 memcpy(buf, other.buf, len);
3131 other.buf[0] =
'\0';
3138 return const_cast<String*
>(
this)->
operator[](i);
3143 return reinterpret_cast<char*
>(buf)[i];
3150 return last - (unsigned(buf[last]) & 31);
3158 return data.capacity;
3163 return doctest::stricmp(c_str(), other);
3164 return std::strcmp(c_str(), other);
3168 return compare(other.c_str(), no_case);
3172 bool operator==(
const String& lhs,
const String& rhs) {
return lhs.compare(rhs) == 0; }
3173 bool operator!=(
const String& lhs,
const String& rhs) {
return lhs.compare(rhs) != 0; }
3174 bool operator< (
const String& lhs,
const String& rhs) {
return lhs.compare(rhs) < 0; }
3175 bool operator> (
const String& lhs,
const String& rhs) {
return lhs.compare(rhs) > 0; }
3176 bool operator<=(
const String& lhs,
const String& rhs) {
return (lhs != rhs) ? lhs.compare(rhs) < 0 :
true; }
3177 bool operator>=(
const String& lhs,
const String& rhs) {
return (lhs != rhs) ? lhs.compare(rhs) > 0 :
true; }
3188 color_to_stream(s, code);
3262 return "FATAL ERROR";
3271 auto back = std::strrchr(file,
'\\');
3272 auto forward = std::strrchr(file,
'/');
3273 if(back || forward) {
3285 if(m_line != other.m_line)
3286 return m_line < other.m_line;
3287 if(std::strcmp(m_file, other.m_file) != 0)
3288 return std::strcmp(m_file, other.m_file) < 0;
3289 return m_name.compare(other.m_name) < 0;
3295 #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 3296 String
toString(
char* in) {
return toString(static_cast<const char*>(in)); }
3297 String
toString(
const char* in) {
return String(
"\"") + (in ? in :
"{null string}") +
"\""; }
3298 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 3299 String
toString(
bool in) {
return in ?
"true" :
"false"; }
3300 String
toString(
float in) {
return fpToString(in, 5) +
"f"; }
3301 String
toString(
double in) {
return fpToString(in, 10); }
3302 String
toString(
double long in) {
return fpToString(in, 15); }
3304 #define DOCTEST_TO_STRING_OVERLOAD(type, fmt) \ 3305 String toString(type in) { \ 3307 std::sprintf(buf, fmt, in); \ 3311 DOCTEST_TO_STRING_OVERLOAD(
char,
"%d")
3312 DOCTEST_TO_STRING_OVERLOAD(
char signed,
"%d")
3313 DOCTEST_TO_STRING_OVERLOAD(
char unsigned,
"%u")
3314 DOCTEST_TO_STRING_OVERLOAD(
int short,
"%d")
3315 DOCTEST_TO_STRING_OVERLOAD(
int short unsigned,
"%u")
3316 DOCTEST_TO_STRING_OVERLOAD(
int,
"%d")
3317 DOCTEST_TO_STRING_OVERLOAD(
unsigned,
"%u")
3318 DOCTEST_TO_STRING_OVERLOAD(
int long,
"%ld")
3319 DOCTEST_TO_STRING_OVERLOAD(
int long unsigned,
"%lu")
3320 DOCTEST_TO_STRING_OVERLOAD(
int long long,
"%lld")
3321 DOCTEST_TO_STRING_OVERLOAD(
int long long unsigned,
"%llu")
3323 String
toString(std::nullptr_t) {
return "NULL"; }
3325 #if DOCTEST_MSVC >= DOCTEST_COMPILER(19, 20, 0) 3327 String
toString(
const std::string& in) {
return in.
c_str(); }
3331 : m_epsilon(static_cast<double>(std::numeric_limits<float>::epsilon()) * 100)
3336 Approx approx(value);
3337 approx.epsilon(m_epsilon);
3338 approx.scale(m_scale);
3343 m_epsilon = newEpsilon;
3351 bool operator==(
double lhs,
const Approx& rhs) {
3353 return std::fabs(lhs - rhs.m_value) <
3354 rhs.m_epsilon * (rhs.m_scale + std::max<double>(std::fabs(lhs), std::fabs(rhs.m_value)));
3359 bool operator<=(
double lhs,
const Approx& rhs) {
return lhs < rhs.m_value || lhs == rhs; }
3360 bool operator<=(
const Approx& lhs,
double rhs) {
return lhs.m_value < rhs || lhs == rhs; }
3361 bool operator>=(
double lhs,
const Approx& rhs) {
return lhs > rhs.m_value || lhs == rhs; }
3362 bool operator>=(
const Approx& lhs,
double rhs) {
return lhs.m_value > rhs || lhs == rhs; }
3363 bool operator<(
double lhs,
const Approx& rhs) {
return lhs < rhs.m_value && lhs != rhs; }
3364 bool operator<(
const Approx& lhs,
double rhs) {
return lhs.m_value < rhs && lhs != rhs; }
3365 bool operator>(
double lhs,
const Approx& rhs) {
return lhs > rhs.m_value && lhs != rhs; }
3366 bool operator>(
const Approx& lhs,
double rhs) {
return lhs.m_value > rhs && lhs != rhs; }
3368 String
toString(
const Approx& in) {
3371 const ContextOptions*
getContextOptions() {
return DOCTEST_BRANCH_ON_DISABLED(
nullptr, g_cs); }
3375 #ifdef DOCTEST_CONFIG_DISABLE 3399 #else // DOCTEST_CONFIG_DISABLE 3401 #if !defined(DOCTEST_CONFIG_COLORS_NONE) 3402 #if !defined(DOCTEST_CONFIG_COLORS_WINDOWS) && !defined(DOCTEST_CONFIG_COLORS_ANSI) 3403 #ifdef DOCTEST_PLATFORM_WINDOWS 3404 #define DOCTEST_CONFIG_COLORS_WINDOWS 3406 #define DOCTEST_CONFIG_COLORS_ANSI 3408 #endif // DOCTEST_CONFIG_COLORS_WINDOWS && DOCTEST_CONFIG_COLORS_ANSI 3409 #endif // DOCTEST_CONFIG_COLORS_NONE 3425 reporterMap& getReporters() {
3426 static reporterMap data;
3429 reporterMap& getListeners() {
3430 static reporterMap data;
3435 #define DOCTEST_ITERATE_THROUGH_REPORTERS(function, ...) \ 3436 for(auto& curr_rep : g_cs->reporters_currently_used) \ 3437 curr_rep->function(__VA_ARGS__) 3445 (g_cs->numAssertsFailed + g_cs->numAssertsFailedCurrentTest_atomic) >=
3452 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 3454 g_cs->shouldLogCurrentException =
false;
3455 throw TestFailureException();
3457 #else // DOCTEST_CONFIG_NO_EXCEPTIONS 3459 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 3463 using namespace detail;
3466 int wildcmp(
const char* str,
const char* wild,
bool caseSensitive) {
3467 const char* cp =
nullptr;
3468 const char* mp =
nullptr;
3470 while((*str) && (*wild !=
'*')) {
3471 if((caseSensitive ? (*wild != *str) : (tolower(*wild) != tolower(*str))) &&
3486 }
else if((caseSensitive ? (*wild == *str) : (tolower(*wild) == tolower(*str))) ||
3496 while(*wild ==
'*') {
3512 bool matchesAny(
const char* name,
const std::vector<String>& filters,
bool matchEmpty,
3513 bool caseSensitive) {
3514 if(filters.empty() && matchEmpty)
3516 for(
auto& curr : filters)
3517 if(wildcmp(name, curr.c_str(), caseSensitive))
3524 Subcase::Subcase(
const String& name,
const char* file,
int line)
3525 : m_signature({name, file, line}) {
3526 ContextState* s = g_cs;
3529 if(s->subcasesStack.size() < size_t(s->subcase_filter_levels)) {
3530 if(!matchesAny(m_signature.m_name.c_str(), s->filters[6],
true, s->case_sensitive))
3532 if(matchesAny(m_signature.m_name.c_str(), s->filters[7],
false, s->case_sensitive))
3537 if(s->subcasesStack.size() < size_t(s->subcasesCurrentMaxLevel)) {
3538 s->should_reenter =
true;
3544 s->subcasesStack.push_back(m_signature);
3545 if(s->subcasesPassed.count(s->subcasesStack) != 0) {
3547 s->subcasesStack.pop_back();
3551 s->subcasesCurrentMaxLevel = s->subcasesStack.size();
3554 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_start, m_signature);
3557 Subcase::~Subcase() {
3560 if(g_cs->should_reenter ==
false)
3561 g_cs->subcasesPassed.insert(g_cs->subcasesStack);
3562 g_cs->subcasesStack.pop_back();
3564 #if __cplusplus >= 201703L && defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411 3565 if(std::uncaught_exceptions() > 0
3567 if(std::uncaught_exception()
3569 && g_cs->shouldLogCurrentException) {
3570 DOCTEST_ITERATE_THROUGH_REPORTERS(
3571 test_case_exception, {
"exception thrown in subcase - will translate later " 3572 "when the whole test case has been exited (cannot " 3573 "translate while there is an active exception)",
3575 g_cs->shouldLogCurrentException =
false;
3577 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end,
DOCTEST_EMPTY);
3581 Subcase::operator bool()
const {
return m_entered; }
3583 Result::Result(
bool passed,
const String& decomposition)
3585 , m_decomp(decomposition) {}
3593 m_description =
nullptr;
3596 m_should_fail =
false;
3597 m_expected_failures = 0;
3602 TestCase::TestCase(
funcType test,
const char* file,
unsigned line,
const TestSuite& test_suite,
3603 const char*
type,
int template_id) {
3607 m_test_suite = test_suite.m_test_suite;
3608 m_description = test_suite.m_description;
3609 m_skip = test_suite.m_skip;
3610 m_may_fail = test_suite.m_may_fail;
3611 m_should_fail = test_suite.m_should_fail;
3612 m_expected_failures = test_suite.m_expected_failures;
3613 m_timeout = test_suite.m_timeout;
3617 m_template_id = template_id;
3620 TestCase::TestCase(
const TestCase& other)
3627 TestCase& TestCase::operator=(
const TestCase& other) {
3628 static_cast<TestCaseData&
>(*this) =
static_cast<const TestCaseData&
>(other);
3630 m_test = other.m_test;
3631 m_type = other.m_type;
3632 m_template_id = other.m_template_id;
3633 m_full_name = other.m_full_name;
3635 if(m_template_id != -1)
3636 m_name = m_full_name.c_str();
3644 if(m_template_id != -1) {
3645 m_full_name = String(m_name) + m_type;
3647 m_name = m_full_name.c_str();
3653 if(m_line != other.m_line)
3654 return m_line < other.m_line;
3655 const int file_cmp = std::strcmp(m_file, other.m_file);
3657 return file_cmp < 0;
3658 return m_template_id < other.m_template_id;
3662 using namespace detail;
3664 bool fileOrderComparator(
const TestCase* lhs,
const TestCase* rhs) {
3668 const int res = doctest::stricmp(lhs->m_file, rhs->m_file);
3670 const int res = std::strcmp(lhs->m_file, rhs->m_file);
3674 if(lhs->m_line != rhs->m_line)
3675 return lhs->m_line < rhs->m_line;
3676 return lhs->m_template_id < rhs->m_template_id;
3680 bool suiteOrderComparator(
const TestCase* lhs,
const TestCase* rhs) {
3681 const int res = std::strcmp(lhs->m_test_suite, rhs->m_test_suite);
3684 return fileOrderComparator(lhs, rhs);
3688 bool nameOrderComparator(
const TestCase* lhs,
const TestCase* rhs) {
3689 const int res = std::strcmp(lhs->m_name, rhs->m_name);
3692 return suiteOrderComparator(lhs, rhs);
3696 std::set<TestCase>& getRegisteredTests() {
3697 static std::set<TestCase> data;
3701 #ifdef DOCTEST_CONFIG_COLORS_WINDOWS 3702 HANDLE g_stdoutHandle;
3705 bool g_attrsInitted =
false;
3708 if(!g_attrsInitted) {
3709 g_stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE);
3710 g_attrsInitted =
true;
3711 CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
3712 GetConsoleScreenBufferInfo(g_stdoutHandle, &csbiInfo);
3713 g_origFgAttrs = csbiInfo.wAttributes & ~(BACKGROUND_GREEN | BACKGROUND_RED |
3714 BACKGROUND_BLUE | BACKGROUND_INTENSITY);
3715 g_origBgAttrs = csbiInfo.wAttributes & ~(FOREGROUND_GREEN | FOREGROUND_RED |
3716 FOREGROUND_BLUE | FOREGROUND_INTENSITY);
3721 int dumy_init_console_colors = colors_init();
3722 #endif // DOCTEST_CONFIG_COLORS_WINDOWS 3728 #ifdef DOCTEST_CONFIG_COLORS_ANSI 3749 default: col =
"[0m";
3753 #endif // DOCTEST_CONFIG_COLORS_ANSI 3755 #ifdef DOCTEST_CONFIG_COLORS_WINDOWS 3760 #define DOCTEST_SET_ATTR(x) SetConsoleTextAttribute(g_stdoutHandle, x | g_origBgAttrs) 3764 case Color::White: DOCTEST_SET_ATTR(FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
break;
3765 case Color::Red: DOCTEST_SET_ATTR(FOREGROUND_RED);
break;
3766 case Color::Green: DOCTEST_SET_ATTR(FOREGROUND_GREEN);
break;
3767 case Color::Blue: DOCTEST_SET_ATTR(FOREGROUND_BLUE);
break;
3768 case Color::Cyan: DOCTEST_SET_ATTR(FOREGROUND_BLUE | FOREGROUND_GREEN);
break;
3769 case Color::Yellow: DOCTEST_SET_ATTR(FOREGROUND_RED | FOREGROUND_GREEN);
break;
3772 case Color::BrightRed: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_RED);
break;
3773 case Color::BrightGreen: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN);
break;
3774 case Color::BrightWhite: DOCTEST_SET_ATTR(FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
break;
3777 default: DOCTEST_SET_ATTR(g_origFgAttrs);
3780 #endif // DOCTEST_CONFIG_COLORS_WINDOWS 3784 std::vector<const IExceptionTranslator*>& getExceptionTranslators() {
3785 static std::vector<const IExceptionTranslator*> data;
3789 String translateActiveException() {
3790 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 3792 auto& translators = getExceptionTranslators();
3793 for(
auto& curr : translators)
3794 if(curr->translate(res))
3800 }
catch(std::exception& ex) {
3802 }
catch(std::string& msg) {
3804 }
catch(
const char* msg) {
3807 return "unknown exception";
3811 #else // DOCTEST_CONFIG_NO_EXCEPTIONS 3813 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 3819 int regTest(
const TestCase& tc) {
3820 getRegisteredTests().insert(tc);
3830 #ifdef DOCTEST_IS_DEBUGGER_ACTIVE 3832 #else // DOCTEST_IS_DEBUGGER_ACTIVE 3833 #ifdef DOCTEST_PLATFORM_MAC 3844 info.kp_proc.p_flag = 0;
3849 mib[2] = KERN_PROC_PID;
3852 size =
sizeof(info);
3853 if(sysctl(mib, DOCTEST_COUNTOF(mib), &info, &size, 0, 0) != 0) {
3854 std::cerr <<
"\nCall to sysctl failed - unable to determine if debugger is active **\n";
3858 return ((info.kp_proc.p_flag & P_TRACED) != 0);
3860 #elif DOCTEST_MSVC || defined(__MINGW32__) 3865 #endif // DOCTEST_IS_DEBUGGER_ACTIVE 3868 if(std::find(getExceptionTranslators().begin(), getExceptionTranslators().end(), et) ==
3869 getExceptionTranslators().end())
3870 getExceptionTranslators().push_back(et);
3873 #ifdef DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 3876 #endif // DOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING 3894 DOCTEST_THREAD_LOCAL std::vector<IContextScope*> g_infoContexts;
3896 ContextScopeBase::ContextScopeBase() {
3897 g_infoContexts.push_back(
this);
3903 void ContextScopeBase::destroy() {
3904 #if __cplusplus >= 201703L && defined(__cpp_lib_uncaught_exceptions) && __cpp_lib_uncaught_exceptions >= 201411 3905 if(std::uncaught_exceptions() > 0) {
3907 if(std::uncaught_exception()) {
3909 std::ostringstream s;
3910 this->stringify(&s);
3911 g_cs->stringifiedContexts.push_back(s.str().c_str());
3913 g_infoContexts.pop_back();
3918 using namespace detail;
3921 const char* tail =
"") {
3924 << (opt->no_line_numbers ? 0 : line)
3925 << (opt->gnu_file_line ?
":" :
"):") << tail;
3929 #if !defined(DOCTEST_CONFIG_POSIX_SIGNALS) && !defined(DOCTEST_CONFIG_WINDOWS_SEH) 3930 struct FatalConditionHandler
3934 #else // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH 3936 void reportFatal(
const std::string&);
3938 #ifdef DOCTEST_PLATFORM_WINDOWS 3948 SignalDefs signalDefs[] = {
3949 {EXCEPTION_ILLEGAL_INSTRUCTION,
"SIGILL - Illegal instruction signal"},
3950 {EXCEPTION_STACK_OVERFLOW,
"SIGSEGV - Stack overflow"},
3951 {EXCEPTION_ACCESS_VIOLATION,
"SIGSEGV - Segmentation violation signal"},
3952 {EXCEPTION_INT_DIVIDE_BY_ZERO,
"Divide by zero error"},
3955 struct FatalConditionHandler
3957 static LONG CALLBACK handleException(PEXCEPTION_POINTERS ExceptionInfo) {
3958 for(
size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
3959 if(ExceptionInfo->ExceptionRecord->ExceptionCode == signalDefs[i].id) {
3960 reportFatal(signalDefs[i].name);
3966 return EXCEPTION_CONTINUE_SEARCH;
3969 FatalConditionHandler() {
3973 guaranteeSize = 32 * 1024;
3975 previousTop = SetUnhandledExceptionFilter(handleException);
3977 SetThreadStackGuarantee(&guaranteeSize);
3980 static void reset() {
3983 SetUnhandledExceptionFilter(previousTop);
3984 SetThreadStackGuarantee(&guaranteeSize);
3985 previousTop =
nullptr;
3990 ~FatalConditionHandler() { reset(); }
3994 static ULONG guaranteeSize;
3995 static LPTOP_LEVEL_EXCEPTION_FILTER previousTop;
3998 bool FatalConditionHandler::isSet =
false;
3999 ULONG FatalConditionHandler::guaranteeSize = 0;
4000 LPTOP_LEVEL_EXCEPTION_FILTER FatalConditionHandler::previousTop =
nullptr;
4002 #else // DOCTEST_PLATFORM_WINDOWS 4009 SignalDefs signalDefs[] = {{SIGINT,
"SIGINT - Terminal interrupt signal"},
4010 {SIGILL,
"SIGILL - Illegal instruction signal"},
4011 {SIGFPE,
"SIGFPE - Floating point error signal"},
4012 {SIGSEGV,
"SIGSEGV - Segmentation violation signal"},
4013 {SIGTERM,
"SIGTERM - Termination request signal"},
4014 {SIGABRT,
"SIGABRT - Abort (abnormal termination) signal"}};
4016 struct FatalConditionHandler
4019 static struct sigaction oldSigActions[DOCTEST_COUNTOF(signalDefs)];
4020 static stack_t oldSigStack;
4021 static char altStackMem[4 * SIGSTKSZ];
4023 static void handleSignal(
int sig) {
4024 const char* name =
"<unknown signal>";
4025 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
4026 SignalDefs& def = signalDefs[i];
4037 FatalConditionHandler() {
4040 sigStack.ss_sp = altStackMem;
4041 sigStack.ss_size =
sizeof(altStackMem);
4042 sigStack.ss_flags = 0;
4043 sigaltstack(&sigStack, &oldSigStack);
4044 struct sigaction sa = {};
4045 sa.sa_handler = handleSignal;
4046 sa.sa_flags = SA_ONSTACK;
4047 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
4048 sigaction(signalDefs[i].
id, &sa, &oldSigActions[i]);
4052 ~FatalConditionHandler() { reset(); }
4053 static void reset() {
4056 for(std::size_t i = 0; i < DOCTEST_COUNTOF(signalDefs); ++i) {
4057 sigaction(signalDefs[i].
id, &oldSigActions[i],
nullptr);
4060 sigaltstack(&oldSigStack,
nullptr);
4066 bool FatalConditionHandler::isSet =
false;
4067 struct sigaction FatalConditionHandler::oldSigActions[DOCTEST_COUNTOF(signalDefs)] = {};
4068 stack_t FatalConditionHandler::oldSigStack = {};
4069 char FatalConditionHandler::altStackMem[] = {};
4071 #endif // DOCTEST_PLATFORM_WINDOWS 4072 #endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH 4077 using namespace detail;
4079 #ifdef DOCTEST_PLATFORM_WINDOWS 4080 #define DOCTEST_OUTPUT_DEBUG_STRING(text) ::OutputDebugStringA(text) 4083 #define DOCTEST_OUTPUT_DEBUG_STRING(text) // NOLINT(clang-diagnostic-unused-macros) 4088 g_cs->numAssertsCurrentTest_atomic++;
4093 g_cs->numAssertsFailedCurrentTest_atomic++;
4096 #if defined(DOCTEST_CONFIG_POSIX_SIGNALS) || defined(DOCTEST_CONFIG_WINDOWS_SEH) 4097 void reportFatal(
const std::string&
message) {
4100 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception, {message.c_str(),
true});
4102 while(g_cs->subcasesStack.size()) {
4103 g_cs->subcasesStack.pop_back();
4104 DOCTEST_ITERATE_THROUGH_REPORTERS(subcase_end,
DOCTEST_EMPTY);
4107 g_cs->finalizeTestCaseData();
4109 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
4111 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
4113 #endif // DOCTEST_CONFIG_POSIX_SIGNALS || DOCTEST_CONFIG_WINDOWS_SEH 4117 ResultBuilder::ResultBuilder(
assertType::Enum at,
const char* file,
int line,
const char* expr,
4118 const char* exception_type,
const char* exception_string) {
4119 m_test_case = g_cs->currentTest;
4127 m_exception_type = exception_type;
4128 m_exception_string = exception_string;
4130 if(m_expr[0] ==
' ')
4135 void ResultBuilder::setResult(
const Result& res) {
4136 m_decomp = res.m_decomp;
4137 m_failed = !res.m_passed;
4140 void ResultBuilder::translateException() {
4142 m_exception = translateActiveException();
4145 bool ResultBuilder::log() {
4147 m_failed = !m_threw;
4149 m_failed = !m_threw_as || (m_exception != m_exception_string);
4150 }
else if(m_at & assertType::is_throws_as) {
4151 m_failed = !m_threw_as;
4152 }
else if(m_at & assertType::is_throws_with) {
4153 m_failed = m_exception != m_exception_string;
4158 if(m_exception.size())
4159 m_exception = String(
"\"") + m_exception +
"\"";
4161 if(is_running_in_test) {
4163 DOCTEST_ITERATE_THROUGH_REPORTERS(log_assert, *
this);
4166 addFailedAssert(m_at);
4167 }
else if(m_failed) {
4175 void ResultBuilder::react()
const {
4189 bool failed = !result.m_passed;
4206 IExceptionTranslator::IExceptionTranslator() =
default;
4207 IExceptionTranslator::~IExceptionTranslator() =
default;
4209 bool MessageBuilder::log() {
4211 DOCTEST_ITERATE_THROUGH_REPORTERS(log_message, *
this);
4217 addAssert(m_severity);
4218 addFailedAssert(m_severity);
4224 void MessageBuilder::react() {
4229 MessageBuilder::~MessageBuilder() =
default;
4232 using namespace detail;
4234 template <
typename Ex>
4235 [[noreturn]]
void throw_exception(Ex
const& e) {
4236 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 4238 #else // DOCTEST_CONFIG_NO_EXCEPTIONS 4239 std::cerr <<
"doctest will terminate because it needed to throw an exception.\n" 4240 <<
"The message was: " << e.what() <<
'\n';
4242 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 4245 #define DOCTEST_INTERNAL_ERROR(msg) \ 4246 throw_exception(std::logic_error( \ 4247 __FILE__ ":" DOCTEST_TOSTR(__LINE__) ": Internal doctest error: " msg)) 4258 enum ForWhat { ForTextNodes, ForAttributes };
4260 XmlEncode( std::string
const& str, ForWhat forWhat = ForTextNodes );
4274 class ScopedElement {
4276 ScopedElement( XmlWriter* writer );
4278 ScopedElement( ScopedElement&& other ) noexcept;
4279 ScopedElement& operator=( ScopedElement&& other ) noexcept;
4283 ScopedElement& writeText( std::string
const& text,
bool indent =
true );
4285 template<
typename T>
4286 ScopedElement& writeAttribute( std::string
const& name, T
const& attribute ) {
4287 m_writer->writeAttribute( name, attribute );
4292 mutable XmlWriter* m_writer =
nullptr;
4298 XmlWriter( XmlWriter
const& ) =
delete;
4299 XmlWriter& operator=( XmlWriter
const& ) =
delete;
4301 XmlWriter& startElement( std::string
const& name );
4303 ScopedElement scopedElement( std::string
const& name );
4305 XmlWriter& endElement();
4307 XmlWriter& writeAttribute( std::string
const& name, std::string
const& attribute );
4309 XmlWriter& writeAttribute( std::string
const& name,
const char* attribute );
4311 XmlWriter& writeAttribute( std::string
const& name,
bool attribute );
4313 template<
typename T>
4314 XmlWriter& writeAttribute( std::string
const& name, T
const& attribute ) {
4315 std::stringstream rss;
4317 return writeAttribute( name, rss.str() );
4320 XmlWriter& writeText( std::string
const& text,
bool indent =
true );
4328 void ensureTagClosed();
4332 void writeDeclaration();
4334 void newlineIfNecessary();
4336 bool m_tagIsOpen =
false;
4337 bool m_needsNewline =
false;
4338 std::vector<std::string> m_tags;
4339 std::string m_indent;
4348 using uchar =
unsigned char;
4352 size_t trailingBytes(
unsigned char c) {
4353 if ((c & 0xE0) == 0xC0) {
4356 if ((c & 0xF0) == 0xE0) {
4359 if ((c & 0xF8) == 0xF0) {
4362 DOCTEST_INTERNAL_ERROR(
"Invalid multibyte utf-8 start byte encountered");
4365 uint32_t headerValue(
unsigned char c) {
4366 if ((c & 0xE0) == 0xC0) {
4369 if ((c & 0xF0) == 0xE0) {
4372 if ((c & 0xF8) == 0xF0) {
4375 DOCTEST_INTERNAL_ERROR(
"Invalid multibyte utf-8 start byte encountered");
4378 void hexEscapeChar(
std::ostream& os,
unsigned char c) {
4379 std::ios_base::fmtflags
f(os.flags());
4381 << std::uppercase << std::hex << std::setfill(
'0') << std::setw(2)
4382 <<
static_cast<int>(c);
4388 XmlEncode::XmlEncode( std::string
const& str, ForWhat forWhat )
4390 m_forWhat( forWhat )
4397 for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) {
4398 uchar c = m_str[idx];
4400 case '<': os <<
"<";
break;
4401 case '&': os <<
"&";
break;
4405 if (idx > 2 && m_str[idx - 1] ==
']' && m_str[idx - 2] ==
']')
4412 if (m_forWhat == ForAttributes)
4423 if (c < 0x09 || (c > 0x0D && c < 0x20) || c == 0x7F) {
4424 hexEscapeChar(os, c);
4442 hexEscapeChar(os, c);
4446 auto encBytes = trailingBytes(c);
4448 if (idx + encBytes - 1 >= m_str.size()) {
4449 hexEscapeChar(os, c);
4456 uint32_t value = headerValue(c);
4457 for (std::size_t n = 1; n < encBytes; ++n) {
4458 uchar nc = m_str[idx + n];
4459 valid &= ((nc & 0xC0) == 0x80);
4460 value = (value << 6) | (nc & 0x3F);
4468 ( value < 0x800 && encBytes > 2) ||
4469 (0x800 < value && value < 0x10000 && encBytes > 3) ||
4473 hexEscapeChar(os, c);
4478 for (std::size_t n = 0; n < encBytes; ++n) {
4479 os << m_str[idx + n];
4481 idx += encBytes - 1;
4488 xmlEncode.encodeTo( os );
4492 XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer )
4493 : m_writer( writer )
4496 XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept
4497 : m_writer( other.m_writer ){
4498 other.m_writer =
nullptr;
4500 XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept {
4502 m_writer->endElement();
4504 m_writer = other.m_writer;
4505 other.m_writer =
nullptr;
4510 XmlWriter::ScopedElement::~ScopedElement() {
4512 m_writer->endElement();
4515 XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string
const& text,
bool indent ) {
4516 m_writer->writeText( text, indent );
4525 XmlWriter::~XmlWriter() {
4526 while( !m_tags.empty() )
4530 XmlWriter& XmlWriter::startElement( std::string
const& name ) {
4532 newlineIfNecessary();
4533 m_os << m_indent <<
'<' << name;
4534 m_tags.push_back( name );
4540 XmlWriter::ScopedElement XmlWriter::scopedElement( std::string
const& name ) {
4541 ScopedElement scoped(
this );
4542 startElement( name );
4546 XmlWriter& XmlWriter::endElement() {
4547 newlineIfNecessary();
4548 m_indent = m_indent.substr( 0, m_indent.size()-2 );
4551 m_tagIsOpen =
false;
4554 m_os << m_indent <<
"</" << m_tags.back() <<
">";
4561 XmlWriter& XmlWriter::writeAttribute( std::string
const& name, std::string
const& attribute ) {
4562 if( !name.empty() && !attribute.empty() )
4563 m_os <<
' ' << name <<
"=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) <<
'"';
4567 XmlWriter& XmlWriter::writeAttribute( std::string
const& name,
const char* attribute ) {
4568 if( !name.empty() && attribute && attribute[0] !=
'\0' )
4569 m_os <<
' ' << name <<
"=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) <<
'"';
4573 XmlWriter& XmlWriter::writeAttribute( std::string
const& name,
bool attribute ) {
4574 m_os <<
' ' << name <<
"=\"" << ( attribute ?
"true" :
"false" ) <<
'"';
4578 XmlWriter& XmlWriter::writeText( std::string
const& text,
bool indent ) {
4579 if( !text.empty() ){
4580 bool tagWasOpen = m_tagIsOpen;
4582 if( tagWasOpen && indent )
4584 m_os << XmlEncode( text );
4585 m_needsNewline =
true;
4607 void XmlWriter::ensureTagClosed() {
4609 m_os <<
">" << std::endl;
4610 m_tagIsOpen =
false;
4614 void XmlWriter::writeDeclaration() {
4615 m_os <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
4618 void XmlWriter::newlineIfNecessary() {
4619 if( m_needsNewline ) {
4621 m_needsNewline =
false;
4631 struct XmlReporter :
public IReporter
4637 const ContextOptions& opt;
4638 const TestCaseData* tc =
nullptr;
4640 XmlReporter(
const ContextOptions& co)
4644 void log_contexts() {
4645 int num_contexts = get_num_active_contexts();
4647 auto contexts = get_active_contexts();
4648 std::stringstream ss;
4649 for(
int i = 0; i < num_contexts; ++i) {
4650 contexts[i]->stringify(&ss);
4651 xml.scopedElement(
"Info").writeText(ss.str());
4657 unsigned line(
unsigned l)
const {
return opt.no_line_numbers ? 0 : l; }
4659 void test_case_start_impl(
const TestCaseData& in) {
4660 bool open_ts_tag =
false;
4662 if(std::strcmp(tc->m_test_suite, in.m_test_suite) != 0) {
4672 xml.startElement(
"TestSuite");
4673 xml.writeAttribute(
"name", in.m_test_suite);
4677 xml.startElement(
"TestCase")
4678 .writeAttribute(
"name", in.m_name)
4680 .writeAttribute(
"line", line(in.m_line))
4681 .writeAttribute(
"description", in.m_description);
4683 if(Approx(in.m_timeout) != 0)
4684 xml.writeAttribute(
"timeout", in.m_timeout);
4686 xml.writeAttribute(
"may_fail",
true);
4687 if(in.m_should_fail)
4688 xml.writeAttribute(
"should_fail",
true);
4695 void report_query(
const QueryData& in)
override {
4697 if(opt.list_reporters) {
4698 for(
auto& curr : getListeners())
4699 xml.scopedElement(
"Listener")
4700 .writeAttribute(
"priority", curr.first.first)
4701 .writeAttribute(
"name", curr.first.second);
4702 for(
auto& curr : getReporters())
4703 xml.scopedElement(
"Reporter")
4704 .writeAttribute(
"priority", curr.first.first)
4705 .writeAttribute(
"name", curr.first.second);
4706 }
else if(opt.count || opt.list_test_cases) {
4707 for(
unsigned i = 0; i < in.num_data; ++i) {
4708 xml.scopedElement(
"TestCase").writeAttribute(
"name", in.data[i]->m_name)
4709 .writeAttribute(
"testsuite", in.data[i]->m_test_suite)
4711 .writeAttribute(
"line", line(in.data[i]->m_line));
4713 xml.scopedElement(
"OverallResultsTestCases")
4714 .writeAttribute(
"unskipped", in.run_stats->numTestCasesPassingFilters);
4715 }
else if(opt.list_test_suites) {
4716 for(
unsigned i = 0; i < in.num_data; ++i)
4717 xml.scopedElement(
"TestSuite").writeAttribute(
"name", in.data[i]->m_test_suite);
4718 xml.scopedElement(
"OverallResultsTestCases")
4719 .writeAttribute(
"unskipped", in.run_stats->numTestCasesPassingFilters);
4720 xml.scopedElement(
"OverallResultsTestSuites")
4721 .writeAttribute(
"unskipped", in.run_stats->numTestSuitesPassingFilters);
4726 void test_run_start()
override {
4729 #ifdef DOCTEST_PLATFORM_WINDOWS 4730 if(binary_name.rfind(
".exe") != std::string::npos)
4731 binary_name = binary_name.substr(0, binary_name.length() - 4);
4732 #endif // DOCTEST_PLATFORM_WINDOWS 4734 xml.startElement(
"doctest").writeAttribute(
"binary", binary_name);
4735 if(opt.no_version ==
false)
4739 xml.scopedElement(
"Options")
4740 .writeAttribute(
"order_by", opt.order_by.c_str())
4741 .writeAttribute(
"rand_seed", opt.rand_seed)
4742 .writeAttribute(
"first", opt.first)
4743 .writeAttribute(
"last", opt.last)
4744 .writeAttribute(
"abort_after", opt.abort_after)
4745 .writeAttribute(
"subcase_filter_levels", opt.subcase_filter_levels)
4746 .writeAttribute(
"case_sensitive", opt.case_sensitive)
4747 .writeAttribute(
"no_throw", opt.no_throw)
4748 .writeAttribute(
"no_skip", opt.no_skip);
4751 void test_run_end(
const TestRunStats& p)
override {
4755 xml.scopedElement(
"OverallResultsAsserts")
4756 .writeAttribute(
"successes", p.numAsserts - p.numAssertsFailed)
4757 .writeAttribute(
"failures", p.numAssertsFailed);
4759 xml.startElement(
"OverallResultsTestCases")
4760 .writeAttribute(
"successes",
4761 p.numTestCasesPassingFilters - p.numTestCasesFailed)
4762 .writeAttribute(
"failures", p.numTestCasesFailed);
4763 if(opt.no_skipped_summary ==
false)
4764 xml.writeAttribute(
"skipped", p.numTestCases - p.numTestCasesPassingFilters);
4770 void test_case_start(
const TestCaseData& in)
override {
4771 test_case_start_impl(in);
4772 xml.ensureTagClosed();
4775 void test_case_reenter(
const TestCaseData&)
override {}
4777 void test_case_end(
const CurrentTestCaseStats& st)
override {
4778 xml.startElement(
"OverallResultsAsserts")
4779 .writeAttribute(
"successes",
4780 st.numAssertsCurrentTest - st.numAssertsFailedCurrentTest)
4781 .writeAttribute(
"failures", st.numAssertsFailedCurrentTest);
4783 xml.writeAttribute(
"duration", st.seconds);
4784 if(tc->m_expected_failures)
4785 xml.writeAttribute(
"expected_failures", tc->m_expected_failures);
4791 void test_case_exception(
const TestCaseException& e)
override {
4792 std::lock_guard<std::mutex> lock(mutex);
4794 xml.scopedElement(
"Exception")
4795 .writeAttribute(
"crash", e.is_crash)
4796 .writeText(e.error_string.c_str());
4799 void subcase_start(
const SubcaseSignature& in)
override {
4800 std::lock_guard<std::mutex> lock(mutex);
4802 xml.startElement(
"SubCase")
4803 .writeAttribute(
"name", in.m_name)
4805 .writeAttribute(
"line", line(in.m_line));
4806 xml.ensureTagClosed();
4809 void subcase_end()
override { xml.endElement(); }
4811 void log_assert(
const AssertData& rb)
override {
4812 if(!rb.m_failed && !opt.success)
4815 std::lock_guard<std::mutex> lock(mutex);
4817 xml.startElement(
"Expression")
4818 .writeAttribute(
"success", !rb.m_failed)
4821 .writeAttribute(
"line", line(rb.m_line));
4823 xml.scopedElement(
"Original").writeText(rb.m_expr);
4826 xml.scopedElement(
"Exception").writeText(rb.m_exception.c_str());
4829 xml.scopedElement(
"ExpectedException").writeText(rb.m_exception_type);
4831 xml.scopedElement(
"ExpectedExceptionString").writeText(rb.m_exception_string);
4833 xml.scopedElement(
"Expanded").writeText(rb.m_decomp.c_str());
4840 void log_message(
const MessageData& mb)
override {
4841 std::lock_guard<std::mutex> lock(mutex);
4843 xml.startElement(
"Message")
4846 .writeAttribute(
"line", line(mb.m_line));
4848 xml.scopedElement(
"Text").writeText(mb.m_string.c_str());
4855 void test_case_skipped(
const TestCaseData& in)
override {
4856 if(opt.no_skipped_summary ==
false) {
4857 test_case_start_impl(in);
4858 xml.writeAttribute(
"skipped",
"true");
4869 explicit Whitespace(
int nr)
4874 if(ws.nrSpaces != 0)
4875 out << std::setw(ws.nrSpaces) <<
' ';
4879 struct ConsoleReporter :
public IReporter
4882 bool hasLoggedCurrentTestStart;
4883 std::vector<SubcaseSignature> subcasesStack;
4887 const ContextOptions& opt;
4888 const TestCaseData* tc;
4890 ConsoleReporter(
const ContextOptions& co)
4894 ConsoleReporter(
const ContextOptions& co,
std::ostream& ostr)
4902 void separator_to_stream() {
4904 <<
"===============================================================================" 4909 const char* success_str) {
4921 const char* success_str =
"SUCCESS") {
4922 s << getSuccessOrFailColor(success, at)
4923 << getSuccessOrFailString(success, at, success_str) <<
": ";
4926 void log_contexts() {
4927 int num_contexts = get_num_active_contexts();
4929 auto contexts = get_active_contexts();
4932 for(
int i = 0; i < num_contexts; ++i) {
4933 s << (i == 0 ?
"" :
" ");
4934 contexts[i]->stringify(&s);
4942 void logTestStart() {
4943 if(hasLoggedCurrentTestStart)
4946 separator_to_stream();
4947 file_line_to_stream(s, tc->m_file, tc->m_line,
"\n");
4948 if(tc->m_description)
4950 if(tc->m_test_suite && tc->m_test_suite[0] !=
'\0')
4952 if(strncmp(tc->m_name,
" Scenario:", 11) != 0)
4954 s << Color::None << tc->m_name <<
"\n";
4956 for(
auto& curr : subcasesStack)
4957 if(curr.m_name[0] !=
'\0')
4958 s <<
" " << curr.m_name <<
"\n";
4962 hasLoggedCurrentTestStart =
true;
4966 if(opt.no_version ==
false)
4974 <<
"run with \"--" DOCTEST_OPTIONS_PREFIX_DISPLAY
"help\" for options\n";
4978 int sizePrefixDisplay =
static_cast<int>(strlen(DOCTEST_OPTIONS_PREFIX_DISPLAY));
4983 s <<
"boolean values: \"1/on/yes/true\" or \"0/off/no/false\"\n";
4985 s <<
"filter values: \"str1,str2,str3\" (comma separated strings)\n";
4988 s <<
"filters use wildcards for matching strings\n";
4990 s <<
"something passes a filter if any of the strings in a filter matches\n";
4991 #ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS 4994 s <<
"ALL FLAGS, OPTIONS AND FILTERS ALSO AVAILABLE WITH A \"" DOCTEST_CONFIG_OPTIONS_PREFIX
"\" PREFIX!!!\n";
4998 s <<
"Query flags - the program quits after them. Available:\n\n";
4999 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"?, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"help, -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"h " 5000 << Whitespace(sizePrefixDisplay*0) <<
"prints this message\n";
5001 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"v, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"version " 5002 << Whitespace(sizePrefixDisplay*1) <<
"prints the version\n";
5003 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"c, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"count " 5004 << Whitespace(sizePrefixDisplay*1) <<
"prints the number of matching tests\n";
5005 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ltc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"list-test-cases " 5006 << Whitespace(sizePrefixDisplay*1) <<
"lists all matching tests by name\n";
5007 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"lts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"list-test-suites " 5008 << Whitespace(sizePrefixDisplay*1) <<
"lists all matching test suites\n";
5009 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"lr, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"list-reporters " 5010 << Whitespace(sizePrefixDisplay*1) <<
"lists all registered reporters\n\n";
5013 s <<
"The available <int>/<string> options/filters are:\n\n";
5014 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"tc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"test-case=<filters> " 5015 << Whitespace(sizePrefixDisplay*1) <<
"filters tests by their name\n";
5016 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"tce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"test-case-exclude=<filters> " 5017 << Whitespace(sizePrefixDisplay*1) <<
"filters OUT tests by their name\n";
5018 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"sf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"source-file=<filters> " 5019 << Whitespace(sizePrefixDisplay*1) <<
"filters tests by their file\n";
5020 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"sfe, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"source-file-exclude=<filters> " 5021 << Whitespace(sizePrefixDisplay*1) <<
"filters OUT tests by their file\n";
5022 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ts, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"test-suite=<filters> " 5023 << Whitespace(sizePrefixDisplay*1) <<
"filters tests by their test suite\n";
5024 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"tse, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"test-suite-exclude=<filters> " 5025 << Whitespace(sizePrefixDisplay*1) <<
"filters OUT tests by their test suite\n";
5026 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"sc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"subcase=<filters> " 5027 << Whitespace(sizePrefixDisplay*1) <<
"filters subcases by their name\n";
5028 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"sce, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"subcase-exclude=<filters> " 5029 << Whitespace(sizePrefixDisplay*1) <<
"filters OUT subcases by their name\n";
5030 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"r, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"reporters=<filters> " 5031 << Whitespace(sizePrefixDisplay*1) <<
"reporters to use (console is default)\n";
5032 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"o, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"out=<string> " 5033 << Whitespace(sizePrefixDisplay*1) <<
"output filename\n";
5034 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ob, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"order-by=<string> " 5035 << Whitespace(sizePrefixDisplay*1) <<
"how the tests should be ordered\n";
5036 s << Whitespace(sizePrefixDisplay*3) <<
" <string> - by [file/suite/name/rand]\n";
5037 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"rs, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"rand-seed=<int> " 5038 << Whitespace(sizePrefixDisplay*1) <<
"seed for random ordering\n";
5039 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"f, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"first=<int> " 5040 << Whitespace(sizePrefixDisplay*1) <<
"the first test passing the filters to\n";
5041 s << Whitespace(sizePrefixDisplay*3) <<
" execute - for range-based execution\n";
5042 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"l, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"last=<int> " 5043 << Whitespace(sizePrefixDisplay*1) <<
"the last test passing the filters to\n";
5044 s << Whitespace(sizePrefixDisplay*3) <<
" execute - for range-based execution\n";
5045 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"aa, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"abort-after=<int> " 5046 << Whitespace(sizePrefixDisplay*1) <<
"stop after <int> failed assertions\n";
5047 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"scfl,--" DOCTEST_OPTIONS_PREFIX_DISPLAY
"subcase-filter-levels=<int> " 5048 << Whitespace(sizePrefixDisplay*1) <<
"apply filters for the first <int> levels\n";
5050 s <<
"Bool options - can be used like flags and true is assumed. Available:\n\n";
5051 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"s, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"success=<bool> " 5052 << Whitespace(sizePrefixDisplay*1) <<
"include successful assertions in output\n";
5053 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"cs, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"case-sensitive=<bool> " 5054 << Whitespace(sizePrefixDisplay*1) <<
"filters being treated as case sensitive\n";
5055 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"e, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"exit=<bool> " 5056 << Whitespace(sizePrefixDisplay*1) <<
"exits after the tests finish\n";
5057 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"d, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"duration=<bool> " 5058 << Whitespace(sizePrefixDisplay*1) <<
"prints the time duration of each test\n";
5059 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nt, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-throw=<bool> " 5060 << Whitespace(sizePrefixDisplay*1) <<
"skips exceptions-related assert checks\n";
5061 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ne, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-exitcode=<bool> " 5062 << Whitespace(sizePrefixDisplay*1) <<
"returns (or exits) always with success\n";
5063 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nr, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-run=<bool> " 5064 << Whitespace(sizePrefixDisplay*1) <<
"skips all runtime doctest operations\n";
5065 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nv, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-version=<bool> " 5066 << Whitespace(sizePrefixDisplay*1) <<
"omit the framework version in the output\n";
5067 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-colors=<bool> " 5068 << Whitespace(sizePrefixDisplay*1) <<
"disables colors in output\n";
5069 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"fc, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"force-colors=<bool> " 5070 << Whitespace(sizePrefixDisplay*1) <<
"use colors even when not in a tty\n";
5071 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nb, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-breaks=<bool> " 5072 << Whitespace(sizePrefixDisplay*1) <<
"disables breakpoints in debuggers\n";
5073 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"ns, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-skip=<bool> " 5074 << Whitespace(sizePrefixDisplay*1) <<
"don't skip test cases marked as skip\n";
5075 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"gfl, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"gnu-file-line=<bool> " 5076 << Whitespace(sizePrefixDisplay*1) <<
":n: vs (n): for line numbers in output\n";
5077 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"npf, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-path-filenames=<bool> " 5078 << Whitespace(sizePrefixDisplay*1) <<
"only filenames and no paths in output\n";
5079 s <<
" -" DOCTEST_OPTIONS_PREFIX_DISPLAY
"nln, --" DOCTEST_OPTIONS_PREFIX_DISPLAY
"no-line-numbers=<bool> " 5080 << Whitespace(sizePrefixDisplay*1) <<
"0 instead of real line numbers in output\n";
5085 s <<
"for more information visit the project documentation\n\n";
5088 void printRegisteredReporters() {
5090 auto printReporters = [
this] (
const reporterMap& reporters,
const char*
type) {
5091 if(reporters.size()) {
5093 for(
auto& curr : reporters)
5094 s <<
"priority: " << std::setw(5) << curr.first.first
5095 <<
" name: " << curr.first.second <<
"\n";
5098 printReporters(getListeners(),
"listeners");
5099 printReporters(getReporters(),
"reporters");
5102 void list_query_results() {
5103 separator_to_stream();
5104 if(opt.count || opt.list_test_cases) {
5106 <<
"unskipped test cases passing the current filters: " 5107 << g_cs->numTestCasesPassingFilters <<
"\n";
5108 }
else if(opt.list_test_suites) {
5110 <<
"unskipped test cases passing the current filters: " 5111 << g_cs->numTestCasesPassingFilters <<
"\n";
5113 <<
"test suites with unskipped test cases passing the current filters: " 5114 << g_cs->numTestSuitesPassingFilters <<
"\n";
5122 void report_query(
const QueryData& in)
override {
5125 }
else if(opt.help) {
5127 }
else if(opt.list_reporters) {
5128 printRegisteredReporters();
5129 }
else if(opt.count || opt.list_test_cases) {
5130 if(opt.list_test_cases) {
5132 <<
"listing all test case names\n";
5133 separator_to_stream();
5136 for(
unsigned i = 0; i < in.num_data; ++i)
5139 separator_to_stream();
5142 <<
"unskipped test cases passing the current filters: " 5143 << g_cs->numTestCasesPassingFilters <<
"\n";
5145 }
else if(opt.list_test_suites) {
5147 separator_to_stream();
5149 for(
unsigned i = 0; i < in.num_data; ++i)
5150 s << Color::None << in.data[i]->m_test_suite <<
"\n";
5152 separator_to_stream();
5155 <<
"unskipped test cases passing the current filters: " 5156 << g_cs->numTestCasesPassingFilters <<
"\n";
5158 <<
"test suites with unskipped test cases passing the current filters: " 5159 << g_cs->numTestSuitesPassingFilters <<
"\n";
5163 void test_run_start()
override { printIntro(); }
5165 void test_run_end(
const TestRunStats& p)
override {
5166 separator_to_stream();
5169 const bool anythingFailed = p.numTestCasesFailed > 0 || p.numAssertsFailed > 0;
5171 << p.numTestCasesPassingFilters <<
" | " 5172 << ((p.numTestCasesPassingFilters == 0 || anythingFailed) ?
Color::None :
5174 << std::setw(6) << p.numTestCasesPassingFilters - p.numTestCasesFailed <<
" passed" 5176 << std::setw(6) << p.numTestCasesFailed <<
" failed" <<
Color::None <<
" | ";
5177 if(opt.no_skipped_summary ==
false) {
5178 const int numSkipped = p.numTestCases - p.numTestCasesPassingFilters;
5184 << p.numAsserts <<
" | " 5185 << ((p.numAsserts == 0 || anythingFailed) ?
Color::None : Color::Green)
5186 << std::setw(6) << (p.numAsserts - p.numAssertsFailed) <<
" passed" <<
Color::None 5188 << p.numAssertsFailed <<
" failed" << Color::None <<
" |\n";
5191 << ((p.numTestCasesFailed > 0) ?
"FAILURE!" :
"SUCCESS!") << Color::None << std::endl;
5194 void test_case_start(
const TestCaseData& in)
override {
5195 hasLoggedCurrentTestStart =
false;
5199 void test_case_reenter(
const TestCaseData&)
override {}
5201 void test_case_end(
const CurrentTestCaseStats& st)
override {
5209 s <<
Color::None << std::setprecision(6) << std::fixed << st.seconds
5210 <<
" s: " << tc->m_name <<
"\n";
5213 s <<
Color::Red <<
"Test case exceeded time limit of " << std::setprecision(6)
5214 << std::fixed << tc->m_timeout <<
"!\n";
5217 s <<
Color::Red <<
"Should have failed but didn't! Marking it as failed!\n";
5219 s <<
Color::Yellow <<
"Failed as expected so marking it as not failed\n";
5221 s <<
Color::Yellow <<
"Allowed to fail so marking it as not failed\n";
5223 s <<
Color::Red <<
"Didn't fail exactly " << tc->m_expected_failures
5224 <<
" times so marking it as failed!\n";
5226 s <<
Color::Yellow <<
"Failed exactly " << tc->m_expected_failures
5227 <<
" times as expected so marking it as not failed!\n";
5230 s <<
Color::Red <<
"Aborting - too many failed asserts!\n";
5235 void test_case_exception(
const TestCaseException& e)
override {
5238 file_line_to_stream(s, tc->m_file, tc->m_line,
" ");
5241 s <<
Color::Red << (e.is_crash ?
"test case CRASHED: " :
"test case THREW exception: ")
5244 int num_stringified_contexts = get_num_stringified_contexts();
5245 if(num_stringified_contexts) {
5246 auto stringified_contexts = get_stringified_contexts();
5248 for(
int i = num_stringified_contexts; i > 0; --i) {
5249 s << (i == num_stringified_contexts ?
"" :
" ")
5250 << stringified_contexts[i - 1] <<
"\n";
5256 void subcase_start(
const SubcaseSignature& subc)
override {
5257 std::lock_guard<std::mutex> lock(mutex);
5258 subcasesStack.push_back(subc);
5259 hasLoggedCurrentTestStart =
false;
5262 void subcase_end()
override {
5263 std::lock_guard<std::mutex> lock(mutex);
5264 subcasesStack.pop_back();
5265 hasLoggedCurrentTestStart =
false;
5268 void log_assert(
const AssertData& rb)
override {
5269 if(!rb.m_failed && !opt.success)
5272 std::lock_guard<std::mutex> lock(mutex);
5276 file_line_to_stream(s, rb.m_file, rb.m_line,
" ");
5277 successOrFailColoredStringToStream(!rb.m_failed, rb.m_at);
5284 s << (rb.m_threw ?
"threw as expected!" :
"did NOT throw at all!") <<
"\n";
5288 << rb.m_exception_string <<
"\", " << rb.m_exception_type <<
" ) " <<
Color::None;
5291 s <<
"threw as expected!\n";
5293 s <<
"threw a DIFFERENT exception! (contents: " << rb.m_exception <<
")\n";
5296 s <<
"did NOT throw at all!\n";
5302 << (rb.m_threw ? (rb.m_threw_as ?
"threw as expected!" :
5303 "threw a DIFFERENT exception: ") :
5304 "did NOT throw at all!")
5309 << rb.m_exception_string <<
"\" ) " <<
Color::None 5310 << (rb.m_threw ? (!rb.m_failed ?
"threw as expected!" :
5311 "threw a DIFFERENT exception: ") :
5312 "did NOT throw at all!")
5315 s << (rb.m_threw ?
"THREW exception: " :
"didn't throw!") <<
Color::Cyan 5316 << rb.m_exception <<
"\n";
5318 s << (rb.m_threw ?
"THREW exception: " :
5319 (!rb.m_failed ?
"is correct!\n" :
"is NOT correct!\n"));
5321 s << rb.m_exception <<
"\n";
5323 s <<
" values: " <<
assertString(rb.m_at) <<
"( " << rb.m_decomp <<
" )\n";
5329 void log_message(
const MessageData& mb)
override {
5330 std::lock_guard<std::mutex> lock(mutex);
5334 file_line_to_stream(s, mb.m_file, mb.m_line,
" ");
5335 s << getSuccessOrFailColor(
false, mb.m_severity)
5342 void test_case_skipped(
const TestCaseData&)
override {}
5347 #ifdef DOCTEST_PLATFORM_WINDOWS 5348 struct DebugOutputWindowReporter :
public ConsoleReporter
5350 DOCTEST_THREAD_LOCAL
static std::ostringstream oss;
5352 DebugOutputWindowReporter(
const ContextOptions& co)
5353 : ConsoleReporter(co, oss) {}
5355 #define DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(func, type, arg) \ 5356 void func(type arg) override { \ 5357 bool with_col = g_no_colors; \ 5358 g_no_colors = false; \ 5359 ConsoleReporter::func(arg); \ 5360 DOCTEST_OUTPUT_DEBUG_STRING(oss.str().c_str()); \ 5362 g_no_colors = with_col; \ 5366 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_run_end,
const TestRunStats&, in)
5367 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_start,
const TestCaseData&, in)
5368 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_reenter,
const TestCaseData&, in)
5369 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_end,
const CurrentTestCaseStats&, in)
5370 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_exception,
const TestCaseException&, in)
5371 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(subcase_start,
const SubcaseSignature&, in)
5373 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_assert,
const AssertData&, in)
5374 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(log_message,
const MessageData&, in)
5375 DOCTEST_DEBUG_OUTPUT_REPORTER_OVERRIDE(test_case_skipped,
const TestCaseData&, in)
5378 DOCTEST_THREAD_LOCAL std::ostringstream DebugOutputWindowReporter::oss;
5379 #endif // DOCTEST_PLATFORM_WINDOWS 5382 bool parseOptionImpl(
int argc,
const char*
const* argv,
const char* pattern, String* value) {
5384 for(
int i = argc; i > 0; --i) {
5386 auto temp = std::strstr(argv[index], pattern);
5387 if(temp && (value || strlen(temp) == strlen(pattern))) {
5389 bool noBadCharsFound =
true;
5390 auto curr = argv[index];
5391 while(curr != temp) {
5392 if(*curr++ !=
'-') {
5393 noBadCharsFound =
false;
5397 if(noBadCharsFound && argv[index][0] ==
'-') {
5400 temp += strlen(pattern);
5401 const unsigned len = strlen(temp);
5417 bool parseOption(
int argc,
const char*
const* argv,
const char* pattern, String* value =
nullptr,
5418 const String& defaultVal = String()) {
5420 *value = defaultVal;
5421 #ifndef DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS 5423 if(parseOptionImpl(argc, argv, pattern + strlen(DOCTEST_CONFIG_OPTIONS_PREFIX), value))
5425 #endif // DOCTEST_CONFIG_NO_UNPREFIXED_OPTIONS 5426 return parseOptionImpl(argc, argv, pattern, value);
5430 bool parseFlag(
int argc,
const char*
const* argv,
const char* pattern) {
5431 return parseOption(argc, argv, pattern);
5435 bool parseCommaSepArgs(
int argc,
const char*
const* argv,
const char* pattern,
5436 std::vector<String>& res) {
5437 String filtersString;
5438 if(parseOption(argc, argv, pattern, &filtersString)) {
5442 auto pch = std::strtok(filtersString.c_str(),
",");
5443 while(pch !=
nullptr) {
5448 pch = std::strtok(
nullptr,
",");
5463 bool parseIntOption(
int argc,
const char*
const* argv,
const char* pattern, optionType
type,
5466 if(!parseOption(argc, argv, pattern, &parsedValue))
5471 const char positive[][5] = {
"1",
"true",
"on",
"yes"};
5472 const char negative[][6] = {
"0",
"false",
"off",
"no"};
5475 for(
unsigned i = 0; i < 4; i++) {
5476 if(parsedValue.compare(positive[i],
true) == 0) {
5480 if(parsedValue.compare(negative[i],
true) == 0) {
5488 int theInt = std::atoi(parsedValue.c_str());
5499 : p(
new detail::ContextState) {
5500 parseArgs(argc, argv,
true);
5502 p->binary_name = argv[0];
5512 parseArgs(argc, argv);
5514 p->binary_name = argv[0];
5519 using namespace detail;
5522 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"source-file=", p->filters[0]);
5523 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"sf=", p->filters[0]);
5524 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"source-file-exclude=",p->filters[1]);
5525 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"sfe=", p->filters[1]);
5526 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"test-suite=", p->filters[2]);
5527 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"ts=", p->filters[2]);
5528 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"test-suite-exclude=", p->filters[3]);
5529 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"tse=", p->filters[3]);
5530 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"test-case=", p->filters[4]);
5531 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"tc=", p->filters[4]);
5532 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"test-case-exclude=", p->filters[5]);
5533 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"tce=", p->filters[5]);
5534 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"subcase=", p->filters[6]);
5535 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"sc=", p->filters[6]);
5536 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"subcase-exclude=", p->filters[7]);
5537 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"sce=", p->filters[7]);
5538 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"reporters=", p->filters[8]);
5539 parseCommaSepArgs(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"r=", p->filters[8]);
5545 #define DOCTEST_PARSE_AS_BOOL_OR_FLAG(name, sname, var, default) \ 5546 if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_bool, intRes) || \ 5547 parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_bool, intRes)) \ 5548 p->var = !!intRes; \ 5549 else if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name) || \ 5550 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname)) \ 5552 else if(withDefaults) \ 5555 #define DOCTEST_PARSE_INT_OPTION(name, sname, var, default) \ 5556 if(parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", option_int, intRes) || \ 5557 parseIntOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", option_int, intRes)) \ 5559 else if(withDefaults) \ 5562 #define DOCTEST_PARSE_STR_OPTION(name, sname, var, default) \ 5563 if(parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX name "=", &strRes, default) || \ 5564 parseOption(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX sname "=", &strRes, default) || \ 5569 DOCTEST_PARSE_STR_OPTION(
"out",
"o", out,
"");
5570 DOCTEST_PARSE_STR_OPTION(
"order-by",
"ob", order_by,
"file");
5571 DOCTEST_PARSE_INT_OPTION(
"rand-seed",
"rs", rand_seed, 0);
5573 DOCTEST_PARSE_INT_OPTION(
"first",
"f", first, 0);
5574 DOCTEST_PARSE_INT_OPTION(
"last",
"l", last, UINT_MAX);
5576 DOCTEST_PARSE_INT_OPTION(
"abort-after",
"aa", abort_after, 0);
5577 DOCTEST_PARSE_INT_OPTION(
"subcase-filter-levels",
"scfl", subcase_filter_levels, INT_MAX);
5579 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"success",
"s", success,
false);
5580 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"case-sensitive",
"cs", case_sensitive,
false);
5581 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"exit",
"e", exit,
false);
5582 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"duration",
"d", duration,
false);
5583 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-throw",
"nt", no_throw,
false);
5584 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-exitcode",
"ne", no_exitcode,
false);
5585 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-run",
"nr", no_run,
false);
5586 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-version",
"nv", no_version,
false);
5587 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-colors",
"nc", no_colors,
false);
5588 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"force-colors",
"fc", force_colors,
false);
5589 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-breaks",
"nb", no_breaks,
false);
5590 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-skip",
"ns", no_skip,
false);
5591 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"gnu-file-line",
"gfl", gnu_file_line, !
bool(
DOCTEST_MSVC));
5592 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-path-filenames",
"npf", no_path_in_filenames,
false);
5593 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-line-numbers",
"nln", no_line_numbers,
false);
5594 DOCTEST_PARSE_AS_BOOL_OR_FLAG(
"no-skipped-summary",
"nss", no_skipped_summary,
false);
5601 p->list_test_cases =
false;
5602 p->list_test_suites =
false;
5603 p->list_reporters =
false;
5605 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"help") ||
5606 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"h") ||
5607 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"?")) {
5611 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"version") ||
5612 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"v")) {
5616 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"count") ||
5617 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"c")) {
5621 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"list-test-cases") ||
5622 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"ltc")) {
5623 p->list_test_cases =
true;
5626 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"list-test-suites") ||
5627 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"lts")) {
5628 p->list_test_suites =
true;
5631 if(parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"list-reporters") ||
5632 parseFlag(argc, argv, DOCTEST_CONFIG_OPTIONS_PREFIX
"lr")) {
5633 p->list_reporters =
true;
5639 void Context::addFilter(
const char* filter,
const char* value) { setOption(filter, value); }
5643 for(
auto& curr : p->filters)
5649 setOption(option,
toString(value).c_str());
5654 auto argv = String(
"-") + option +
"=" + value;
5655 auto lvalue = argv.c_str();
5656 parseArgs(1, &lvalue);
5668 using namespace detail;
5674 is_running_in_test =
true;
5676 g_no_colors = p->no_colors;
5680 p->cout = &std::cout;
5681 p->cerr = &std::cerr;
5686 fstr.open(p->out.c_str(), std::fstream::out);
5690 auto cleanup_and_return = [&]() {
5696 is_running_in_test =
false;
5699 for(
auto& curr : p->reporters_currently_used)
5701 p->reporters_currently_used.clear();
5703 if(p->numTestCasesFailed && !p->no_exitcode)
5704 return EXIT_FAILURE;
5705 return EXIT_SUCCESS;
5709 if(p->filters[8].empty())
5710 p->filters[8].push_back(
"console");
5713 for(
auto& curr : getReporters()) {
5714 if(matchesAny(curr.first.second.c_str(), p->filters[8],
false, p->case_sensitive))
5715 p->reporters_currently_used.push_back(curr.second(*g_cs));
5721 for(
auto& curr : getListeners())
5722 p->reporters_currently_used.insert(p->reporters_currently_used.begin(), curr.second(*g_cs));
5724 #ifdef DOCTEST_PLATFORM_WINDOWS 5726 p->reporters_currently_used.push_back(
new DebugOutputWindowReporter(*g_cs));
5727 #endif // DOCTEST_PLATFORM_WINDOWS 5730 if(p->no_run || p->version || p->help || p->list_reporters) {
5731 DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, QueryData());
5733 return cleanup_and_return();
5737 for(
auto& curr : getRegisteredTests())
5738 testArray.push_back(&curr);
5739 p->numTestCases = testArray.size();
5742 if(!testArray.empty()) {
5743 if(p->order_by.compare(
"file",
true) == 0) {
5744 std::sort(testArray.begin(), testArray.end(), fileOrderComparator);
5745 }
else if(p->order_by.compare(
"suite",
true) == 0) {
5746 std::sort(testArray.begin(), testArray.end(), suiteOrderComparator);
5747 }
else if(p->order_by.compare(
"name",
true) == 0) {
5748 std::sort(testArray.begin(), testArray.end(), nameOrderComparator);
5749 }
else if(p->order_by.compare(
"rand",
true) == 0) {
5750 std::srand(p->rand_seed);
5753 const auto first = &testArray[0];
5754 for(
size_t i = testArray.size() - 1; i > 0; --i) {
5755 int idxToSwap = std::rand() % (i + 1);
5757 const auto temp = first[i];
5759 first[i] = first[idxToSwap];
5760 first[idxToSwap] = temp;
5765 std::set<String> testSuitesPassingFilt;
5767 bool query_mode = p->count || p->list_test_cases || p->list_test_suites;
5768 std::vector<const TestCaseData*> queryResults;
5771 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_start,
DOCTEST_EMPTY);
5774 for(
auto& curr : testArray) {
5775 const auto& tc = *curr;
5777 bool skip_me =
false;
5778 if(tc.m_skip && !p->no_skip)
5781 if(!matchesAny(tc.m_file, p->filters[0],
true, p->case_sensitive))
5783 if(matchesAny(tc.m_file, p->filters[1],
false, p->case_sensitive))
5785 if(!matchesAny(tc.m_test_suite, p->filters[2],
true, p->case_sensitive))
5787 if(matchesAny(tc.m_test_suite, p->filters[3],
false, p->case_sensitive))
5789 if(!matchesAny(tc.m_name, p->filters[4],
true, p->case_sensitive))
5791 if(matchesAny(tc.m_name, p->filters[5],
false, p->case_sensitive))
5795 p->numTestCasesPassingFilters++;
5798 if((p->last < p->numTestCasesPassingFilters && p->first <= p->last) ||
5799 (p->first > p->numTestCasesPassingFilters))
5804 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_skipped, tc);
5813 if(p->list_test_cases) {
5814 queryResults.push_back(&tc);
5819 if(p->list_test_suites) {
5820 if((testSuitesPassingFilt.count(tc.m_test_suite) == 0) && tc.m_test_suite[0] !=
'\0') {
5821 queryResults.push_back(&tc);
5822 testSuitesPassingFilt.insert(tc.m_test_suite);
5823 p->numTestSuitesPassingFilters++;
5830 p->currentTest = &tc;
5836 p->numAssertsFailedCurrentTest_atomic = 0;
5837 p->numAssertsCurrentTest_atomic = 0;
5839 p->subcasesPassed.clear();
5841 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_start, tc);
5845 bool run_test =
true;
5849 p->should_reenter =
false;
5850 p->subcasesCurrentMaxLevel = 0;
5851 p->subcasesStack.clear();
5853 p->shouldLogCurrentException =
true;
5856 p->stringifiedContexts.clear();
5858 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 5860 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 5861 FatalConditionHandler fatalConditionHandler;
5864 fatalConditionHandler.reset();
5865 #ifndef DOCTEST_CONFIG_NO_EXCEPTIONS 5866 }
catch(
const TestFailureException&) {
5869 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_exception,
5870 {translateActiveException(),
false});
5873 #endif // DOCTEST_CONFIG_NO_EXCEPTIONS 5876 if(p->abort_after > 0 &&
5877 p->numAssertsFailed + p->numAssertsFailedCurrentTest_atomic >= p->abort_after) {
5882 if(p->should_reenter && run_test)
5883 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_reenter, tc);
5884 if(!p->should_reenter)
5888 p->finalizeTestCaseData();
5890 DOCTEST_ITERATE_THROUGH_REPORTERS(test_case_end, *g_cs);
5892 p->currentTest =
nullptr;
5895 if(p->abort_after > 0 && p->numAssertsFailed >= p->abort_after)
5901 DOCTEST_ITERATE_THROUGH_REPORTERS(test_run_end, *g_cs);
5904 qdata.run_stats = g_cs;
5905 qdata.data = queryResults.data();
5906 qdata.num_data = unsigned(queryResults.size());
5907 DOCTEST_ITERATE_THROUGH_REPORTERS(report_query, qdata);
5913 auto DOCTEST_FIX_FOR_MACOS_LIBCPP_IOSFWD_STRING_LINK_ERRORS = []()
DOCTEST_NOINLINE 5914 { std::cout << std::string(); };
5915 DOCTEST_FIX_FOR_MACOS_LIBCPP_IOSFWD_STRING_LINK_ERRORS();
5917 return cleanup_and_return();
5924 return get_num_active_contexts() ? &detail::g_infoContexts[0] :
nullptr;
5929 return get_num_stringified_contexts() ? &detail::g_cs->stringifiedContexts[0] :
nullptr;
5935 getReporters().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));
5937 getListeners().insert(reporterMap::value_type(reporterMap::key_type(priority, name), c));
5943 #endif // DOCTEST_CONFIG_DISABLE 5945 #ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN 5949 #endif // DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN 5955 #endif // DOCTEST_LIBRARY_IMPLEMENTATION 5956 #endif // DOCTEST_CONFIG_IMPLEMENT
Context(int argc=0, const char *const *argv=nullptr)
#define DOCTEST_FORBIT_EXPRESSION(rt, op)
#define DOCTEST_CLANG_SUPPRESS_WARNING_PUSH
Approx & scale(double newScale)
String toString(const DOCTEST_REF_WRAP(T) value)
int registerExceptionTranslator(String(*translateFunction)(T))
static void convert(std::ostream *s, const T &in)
assertType::Enum m_severity
#define DOCTEST_GCC_SUPPRESS_WARNING_PUSH
#define DOCTEST_CLANG_SUPPRESS_WARNING_WITH_PUSH(w)
static const IContextScope *const * get_active_contexts()
const char * m_exception_string
String & operator+=(const String &other)
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)
DOCTEST_INTERFACE bool operator!=(const String &lhs, const String &rhs)
DOCTEST_NOINLINE void unary_assert(const DOCTEST_REF_WRAP(L) val)
#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_END
#define DOCTEST_CMP_EQ(l, r)
void testArray(XmlRpcValue const &d)
INLINE Rall1d< T, V, S > log(const Rall1d< T, V, S > &arg)
MessageBuilder & operator<<(const T &in)
const char * type_to_string()
#define DOCTEST_ASSERT_IN_TESTS(decomp)
static void convert(std::ostream *s, const T &in)
DOCTEST_INTERFACE bool operator>=(const String &lhs, const String &rhs)
int numAssertsCurrentTest
DOCTEST_INTERFACE void throwException()
void setAssertHandler(detail::assert_handler ah)
b2Vec2 operator*(float s, const b2Vec2 &a)
ExceptionTranslator(String(*translateFunction)(T))
static int get_num_active_contexts()
String operator+(const String &other) const
ContextScope(ContextScope &&other)
GLenum GLuint GLenum severity
#define DOCTEST_GCC_SUPPRESS_WARNING(w)
#define DOCTEST_STD_NAMESPACE_BEGIN
const char * m_exception_type
DOCTEST_INTERFACE int setTestSuite(const TestSuite &ts)
static void convert(std::ostream *s, const char *in)
#define DOCTEST_GCC_SUPPRESS_WARNING_WITH_PUSH(w)
static const String * get_stringified_contexts()
#define DOCTEST_CLANG_SUPPRESS_WARNING_POP
#define DOCTEST_MSVC_SUPPRESS_WARNING(w)
static String convert(R C::*p)
bool translate(String &res) const override
geometry_msgs::TransformStamped t
static String convert(const DOCTEST_REF_WRAP(T) in)
IReporter * reporterCreator(const ContextOptions &o)
DOCTEST_INTERFACE std::ostream * getTlsOss()
static String convert(U *p)
#define DOCTEST_MAKE_STD_HEADERS_CLEAN_FROM_WARNINGS_ON_WALL_BEGIN
DOCTEST_INTERFACE void my_memcpy(void *dest, const void *src, unsigned num)
bool operator()(const DOCTEST_REF_WRAP(L), const DOCTEST_REF_WRAP(R)) const
DOCTEST_INTERFACE bool isDebuggerActive()
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
basic_ostream< char, char_traits< char > > ostream
void setLast(unsigned in=last)
#define DOCTEST_INTERFACE
DOCTEST_INTERFACE bool operator<(const String &lhs, const String &rhs)
b2Vec2 operator+(const b2Vec2 &a, const b2Vec2 &b)
Add two vectors component-wise.
Approx operator()(double value) const
DOCTEST_INTERFACE void registerReporterImpl(const char *name, int prio, reporterCreatorFunc c, bool isReporter)
#define DOCTEST_RELATIONAL_OP(name, op)
#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_INTERFACE String rawMemoryToString(const void *object, unsigned size)
void setOption(const char *option, int value)
DOCTEST_INTERFACE String getTlsOssResult()
void copy(const String &other)
#define DOCTEST_CMP_NE(l, r)
#define DOCTEST_VERSION_STR
GLenum GLuint GLenum GLsizei const GLchar * message
DOCTEST_INTERFACE bool operator<=(const String &lhs, const String &rhs)
unsigned capacity() const
DOCTEST_INTERFACE void failed_out_of_a_testing_context(const AssertData &ad)
#define DOCTEST_TYPE_TO_STRING_IMPL(...)
const char * m_description
ContextScope< L > MakeContextScope(const L &lambda)
void applyCommandLine(int argc, const char *const *argv)
OCLINT destructor of virtual class.
#define DOCTEST_STD_NAMESPACE_END
DOCTEST_INTERFACE bool operator==(const String &lhs, const String &rhs)
void(* assert_handler)(const AssertData &)
typedef void(GLAD_API_PTR *GLDEBUGPROC)(GLenum source
#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
ContextScope(const L &lambda)
const char * m_description
#define DOCTEST_CMP_LT(l, r)
const char * m_test_suite
String & operator=(const String &other)
DOCTEST_INTERFACE void registerExceptionTranslatorImpl(const IExceptionTranslator *et)
void addFilter(const char *filter, const char *value)
DOCTEST_NOINLINE void 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)
char operator[](unsigned i) const
unsigned numTestCasesPassingFilters
#define DOCTEST_MSVC_SUPPRESS_WARNING_POP
const char * m_test_suite
const char * c_str() const
#define DOCTEST_CLANG_SUPPRESS_WARNING(w)
DOCTEST_INTERFACE bool is_running_in_test
static void terminate(void)
String rawMemoryToString(const DOCTEST_REF_WRAP(T) object)
static int get_num_stringified_contexts()
#define DOCTEST_TEST_SUITE_END
DOCTEST_DEFINE_DECORATOR(test_suite, const char *, "")
int subcase_filter_levels
DOCTEST_INTERFACE void decomp_assert(assertType::Enum at, const char *file, int line, const char *expr, Result result)
#define DOCTEST_ASSERT_OUT_OF_TESTS(decomp)
#define DOCTEST_MSVC_SUPPRESS_WARNING_WITH_PUSH(w)
DOCTEST_INTERFACE void toStream(std::ostream *s, int long long unsigned in)
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
DOCTEST_NOINLINE void binary_assert(const DOCTEST_REF_WRAP(L) lhs, const DOCTEST_REF_WRAP(R) rhs)
static String convert(const DOCTEST_REF_WRAP(T))
Approx & epsilon(double newEpsilon)
DOCTEST_NOINLINE void unary_assert(assertType::Enum at, const char *file, int line, const char *expr, const DOCTEST_REF_WRAP(L) val)
const TestCaseData * m_test_case
#define DOCTEST_DO_BINARY_EXPRESSION_COMPARISON(op, op_str, op_macro)
DOCTEST_INTERFACE doctest::detail::TestSuite & getCurrentTestSuite()
DOCTEST_INTERFACE int regTest(const TestCase &tc)
void setAsDefaultForAssertsOutOfTestCases()
IReporter *(* reporterCreatorFunc)(const ContextOptions &)
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)
DOCTEST_INTERFACE std::ostream & operator<<(std::ostream &s, const String &in)