11 #ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED 12 #define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED 16 #define CATCH_VERSION_MAJOR 2 17 #define CATCH_VERSION_MINOR 9 18 #define CATCH_VERSION_PATCH 2 21 # pragma clang system_header 22 #elif defined __GNUC__ 23 # pragma GCC system_header 29 # ifdef __ICC // icpc defines the __clang__ macro 30 # pragma warning(push) 31 # pragma warning(disable: 161 1682) 33 # pragma clang diagnostic push 34 # pragma clang diagnostic ignored "-Wpadded" 35 # pragma clang diagnostic ignored "-Wswitch-enum" 36 # pragma clang diagnostic ignored "-Wcovered-switch-default" 38 #elif defined __GNUC__ 42 # pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details 44 # pragma GCC diagnostic push 45 # pragma GCC diagnostic ignored "-Wunused-variable" 46 # pragma GCC diagnostic ignored "-Wpadded" 49 #if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) 51 # define CATCH_CONFIG_ALL_PARTS 56 #if defined(CATCH_CONFIG_ALL_PARTS) 57 # define CATCH_CONFIG_EXTERNAL_INTERFACES 58 # if defined(CATCH_CONFIG_DISABLE_MATCHERS) 59 # undef CATCH_CONFIG_DISABLE_MATCHERS 61 # if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) 62 # define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER 66 #if !defined(CATCH_CONFIG_IMPL_ONLY) 70 # include <TargetConditionals.h> 71 # if TARGET_OS_OSX == 1 72 # define CATCH_PLATFORM_MAC 73 # elif TARGET_OS_IPHONE == 1 74 # define CATCH_PLATFORM_IPHONE 77 #elif defined(linux) || defined(__linux) || defined(__linux__) 78 # define CATCH_PLATFORM_LINUX 80 #elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__) 81 # define CATCH_PLATFORM_WINDOWS 87 # ifndef CLARA_CONFIG_MAIN 88 # define CLARA_CONFIG_MAIN_NOT_DEFINED 89 # define CLARA_CONFIG_MAIN 96 unsigned int rngSeed();
125 # if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) 126 # define CATCH_CPP14_OR_GREATER 129 # if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) 130 # define CATCH_CPP17_OR_GREATER 135 #if defined(CATCH_CPP17_OR_GREATER) 136 # define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS 141 # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 142 _Pragma( "clang diagnostic push" ) \ 143 _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ 144 _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") 145 # define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 146 _Pragma( "clang diagnostic pop" ) 148 # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ 149 _Pragma( "clang diagnostic push" ) \ 150 _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) 151 # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ 152 _Pragma( "clang diagnostic pop" ) 154 # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ 155 _Pragma( "clang diagnostic push" ) \ 156 _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) 157 # define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \ 158 _Pragma( "clang diagnostic pop" ) 160 # define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ 161 _Pragma( "clang diagnostic push" ) \ 162 _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) 163 # define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ 164 _Pragma( "clang diagnostic pop" ) 170 #if !defined(CATCH_PLATFORM_WINDOWS) 171 #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS 176 #if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) 177 #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS 181 # define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS 182 # define CATCH_CONFIG_COLOUR_NONE 187 #if defined(__ANDROID__) 188 # define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING 193 #if defined(__MINGW32__) 194 # define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH 199 #if defined(__ORBIS__) 200 # define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE 212 # if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ 213 && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) 215 # define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING 224 # if _MSC_VER >= 1900 // Visual Studio 2015 or newer 225 # define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS 230 # if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) 231 # define CATCH_CONFIG_COLOUR_NONE 233 # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH 239 # if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) 240 # define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 244 #if defined(_REENTRANT) || defined(_MSC_VER) 246 # define CATCH_INTERNAL_CONFIG_USE_ASYNC 251 #if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) 252 # define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED 258 # define CATCH_INTERNAL_CONFIG_NO_WCHAR 263 #if defined(__BORLANDC__) 264 #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN 274 #if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) 275 #define CATCH_INTERNAL_CONFIG_COUNTER 283 #if defined(UNDER_RTSS) || defined(RTX64_BUILD) 284 #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH 285 #define CATCH_INTERNAL_CONFIG_NO_ASYNC 286 #define CATCH_CONFIG_COLOUR_NONE 292 #if defined(__has_include) 293 #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER) 294 # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW 300 #if defined(__has_include) 301 # if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) 302 # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL 303 # endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER) 304 #endif // __has_include 308 #if defined(__has_include) 309 # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) 310 # define CATCH_INTERNAL_CONFIG_CPP17_BYTE 311 # endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER) 312 #endif // __has_include 316 #if defined(__has_include) 317 # if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) 318 # if defined(__clang__) && (__clang_major__ < 8) 322 # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) 323 # define CATCH_CONFIG_NO_CPP17_VARIANT 325 # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT 326 # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) 328 # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT 329 # endif // defined(__clang__) && (__clang_major__ < 8) 330 # endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) 331 #endif // __has_include 333 #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) 334 # define CATCH_CONFIG_COUNTER 336 #if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH) 337 # define CATCH_CONFIG_WINDOWS_SEH 340 #if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) 341 # define CATCH_CONFIG_POSIX_SIGNALS 344 #if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR) 345 # define CATCH_CONFIG_WCHAR 348 #if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING) 349 # define CATCH_CONFIG_CPP11_TO_STRING 352 #if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL) 353 # define CATCH_CONFIG_CPP17_OPTIONAL 356 #if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) 357 # define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS 360 #if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) 361 # define CATCH_CONFIG_CPP17_STRING_VIEW 364 #if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT) 365 # define CATCH_CONFIG_CPP17_VARIANT 368 #if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE) 369 # define CATCH_CONFIG_CPP17_BYTE 372 #if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) 373 # define CATCH_INTERNAL_CONFIG_NEW_CAPTURE 376 #if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) 377 # define CATCH_CONFIG_NEW_CAPTURE 380 #if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) 381 # define CATCH_CONFIG_DISABLE_EXCEPTIONS 384 #if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN) 385 # define CATCH_CONFIG_POLYFILL_ISNAN 388 #if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC) 389 # define CATCH_CONFIG_USE_ASYNC 392 #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) 393 # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS 394 # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS 396 #if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) 397 # define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS 398 # define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS 400 #if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) 401 # define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS 402 # define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS 404 #if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) 405 # define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS 406 # define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS 409 #if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) 410 #define CATCH_TRY if ((true)) 411 #define CATCH_CATCH_ALL if ((false)) 412 #define CATCH_CATCH_ANON(type) if ((false)) 414 #define CATCH_TRY try 415 #define CATCH_CATCH_ALL catch (...) 416 #define CATCH_CATCH_ANON(type) catch (type) 419 #if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) 420 #define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 424 #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line 425 #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) 426 #ifdef CATCH_CONFIG_COUNTER 427 # define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) 429 # define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) 471 bool empty()
const noexcept;
479 std::ostream& operator << ( std::ostream& os,
SourceLineInfo const& info );
491 std::string operator+()
const;
499 #define CATCH_INTERNAL_LINEINFO \ 500 ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) ) 511 #define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ 512 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 513 namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ 514 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS 528 virtual void invoke ()
const = 0;
537 virtual std::vector<TestCase>
const& getAllTests()
const = 0;
538 virtual std::vector<TestCase>
const& getAllTestsSorted(
IConfig const& config )
const = 0;
542 bool matchTest(
TestCase const& testCase, TestSpec
const& testSpec,
IConfig const& config );
543 std::vector<TestCase> filterTests( std::vector<TestCase>
const& testCases, TestSpec
const& testSpec,
IConfig const& config );
544 std::vector<TestCase>
const& getAllTestCasesSorted(
IConfig const& config );
566 using size_type = std::size_t;
569 friend struct StringRefTestAccess;
574 char* m_data =
nullptr;
576 void takeOwnership();
578 static constexpr
char const*
const s_empty =
"";
586 : m_start( other.m_start ),
587 m_size( other.m_size )
591 : m_start( other.m_start ),
592 m_size( other.m_size ),
593 m_data( other.m_data )
595 other.m_data =
nullptr;
598 StringRef(
char const* rawChars ) noexcept;
600 StringRef(
char const* rawChars, size_type size ) noexcept
601 : m_start( rawChars ),
605 StringRef( std::string
const& stdString ) noexcept
606 : m_start( stdString.c_str() ),
607 m_size( stdString.size() )
617 m_start = other.m_start;
618 m_size = other.m_size;
622 operator std::string()
const;
627 auto operator == (
StringRef const& other )
const noexcept -> bool;
628 auto operator != (
StringRef const& other )
const noexcept -> bool;
630 auto operator[] ( size_type index )
const noexcept -> char;
633 auto empty()
const noexcept ->
bool {
636 auto size()
const noexcept -> size_type {
640 auto numberOfCharacters()
const noexcept -> size_type;
641 auto c_str()
const ->
char const*;
644 auto substr( size_type start, size_type size )
const noexcept ->
StringRef;
648 auto currentData()
const noexcept ->
char const*;
651 auto isOwned()
const noexcept -> bool;
652 auto isSubstring()
const noexcept -> bool;
656 auto operator + (
StringRef const& lhs,
char const* rhs ) -> std::string;
657 auto operator + (
char const* lhs,
StringRef const& rhs ) -> std::string;
659 auto operator += ( std::string& lhs,
StringRef const& sr ) -> std::string&;
660 auto operator << ( std::ostream& os,
StringRef const& sr ) -> std::ostream&;
662 inline auto operator "" _sr(
char const* rawChars, std::size_t size ) noexcept ->
StringRef {
668 inline auto operator "" _catch_sr(
char const* rawChars, std::size_t size ) noexcept ->
Catch::StringRef {
676 #include <type_traits> 680 #ifdef CATCH_CPP17_OR_GREATER 681 template <
typename...>
682 inline constexpr
auto is_unique = std::true_type{};
684 template <
typename T,
typename... Rest>
685 inline constexpr
auto is_unique<T, Rest...> = std::bool_constant<
686 (!std::is_same_v<T, Rest> && ...) && is_unique<Rest...>
690 template <
typename...>
691 struct is_unique : std::true_type{};
693 template <
typename T0,
typename T1,
typename... Rest>
694 struct is_unique<T0, T1, Rest...> : std::integral_constant
696 !std::is_same<T0, T1>::value
697 && is_unique<T0, Rest...>::value
698 && is_unique<T1, Rest...>::value
708 #define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__ 709 #define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__))) 710 #define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__))) 711 #define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__))) 712 #define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__))) 713 #define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__))) 715 #ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 716 #define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__ 718 #define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__))) 719 #define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__)) 721 #define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__) 724 #define CATCH_REC_END(...) 725 #define CATCH_REC_OUT 727 #define CATCH_EMPTY() 728 #define CATCH_DEFER(id) id CATCH_EMPTY() 730 #define CATCH_REC_GET_END2() 0, CATCH_REC_END 731 #define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2 732 #define CATCH_REC_GET_END(...) CATCH_REC_GET_END1 733 #define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT 734 #define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0) 735 #define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next) 737 #define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) 738 #define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ ) 739 #define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) 741 #define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) 742 #define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ ) 743 #define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...) f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) 748 #define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) 750 #define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) 752 #define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) 753 #define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ 754 #define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ 755 #define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF 756 #define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__) 757 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 758 #define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__ 759 #define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) 762 #define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__) 763 #define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__ 764 #define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1) 767 #define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__ 768 #define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name) 770 #define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__) 772 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 773 #define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()) 774 #define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) 776 #define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())) 777 #define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) 780 #define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\ 781 CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__) 783 #define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0) 784 #define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1) 785 #define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2) 786 #define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) 787 #define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) 788 #define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) 789 #define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _4, _5, _6) 790 #define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) 791 #define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) 792 #define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) 793 #define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) 795 #define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N 797 #define INTERNAL_CATCH_TYPE_GEN\ 798 template<typename...> struct TypeList {};\ 799 template<typename...Ts>\ 800 constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\ 802 template<template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2> \ 803 constexpr auto append(L1<E1...>, L2<E2...>) noexcept -> L1<E1...,E2...> { return {}; }\ 804 template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\ 805 constexpr auto append(L1<E1...>, L2<E2...>, Rest...) noexcept -> decltype(append(L1<E1...,E2...>{}, Rest{}...)) { return {}; }\ 806 template< template<typename...> class L1, typename...E1, typename...Rest>\ 807 constexpr auto append(L1<E1...>, TypeList<mpl_::na>, Rest...) noexcept -> L1<E1...> { return {}; }\ 809 template< template<typename...> class Container, template<typename...> class List, typename...elems>\ 810 constexpr auto rewrap(List<elems...>) noexcept -> TypeList<Container<elems...>> { return {}; }\ 811 template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\ 812 constexpr auto rewrap(List<Elems...>,Elements...) noexcept -> decltype(append(TypeList<Container<Elems...>>{}, rewrap<Container>(Elements{}...))) { return {}; }\ 814 template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\ 815 constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }\ 816 template<template <typename...> class Final, template <typename...> class List, typename...Ts>\ 817 constexpr auto convert(List<Ts...>) noexcept -> decltype(append(Final<>{},TypeList<Ts>{}...)) { return {}; } 819 #define INTERNAL_CATCH_NTTP_1(signature, ...)\ 820 template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\ 821 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ 822 constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \ 824 template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\ 825 constexpr auto rewrap(List<__VA_ARGS__>) noexcept -> TypeList<Container<__VA_ARGS__>> { return {}; }\ 826 template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\ 827 constexpr auto rewrap(List<__VA_ARGS__>,Elements...elems) noexcept -> decltype(append(TypeList<Container<__VA_ARGS__>>{}, rewrap<Container>(elems...))) { return {}; }\ 828 template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\ 829 constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; } 831 #define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName) 832 #define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\ 833 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ 834 static void TestName() 835 #define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)\ 836 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ 837 static void TestName() 839 #define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName) 840 #define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)\ 841 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ 842 static void TestName() 843 #define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature,...)\ 844 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ 845 static void TestName() 847 #define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)\ 848 template<typename Type>\ 849 void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags)\ 851 Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<Type>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\ 854 #define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)\ 855 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ 856 void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags)\ 858 Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\ 861 #define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)\ 862 template<typename Type>\ 863 void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\ 865 Catch::AutoReg( Catch::makeTestInvoker(&TestName<Type>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\ 868 #define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)\ 869 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\ 870 void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\ 872 Catch::AutoReg( Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\ 875 #define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName) 876 #define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)\ 877 template<typename TestType> \ 878 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> { \ 882 #define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)\ 883 template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \ 884 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> { \ 888 #define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName) 889 #define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)\ 890 template<typename TestType> \ 891 void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test() 892 #define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)\ 893 template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \ 894 void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test() 896 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 897 #define INTERNAL_CATCH_NTTP_0 898 #define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1(__VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_1( __VA_ARGS__),INTERNAL_CATCH_NTTP_1( __VA_ARGS__), INTERNAL_CATCH_NTTP_0) 899 #define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__) 900 #define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__) 901 #define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__) 902 #define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__) 903 #define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__) 904 #define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__) 905 #define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__) 907 #define INTERNAL_CATCH_NTTP_0(signature) 908 #define INTERNAL_CATCH_NTTP_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_1,INTERNAL_CATCH_NTTP_1, INTERNAL_CATCH_NTTP_0)( __VA_ARGS__)) 909 #define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1, INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0)(TestName, __VA_ARGS__)) 910 #define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X,INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1, INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0)(TestName, ClassName, __VA_ARGS__)) 911 #define INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD, INTERNAL_CATCH_NTTP_REGISTER_METHOD0, INTERNAL_CATCH_NTTP_REGISTER_METHOD0)(TestName, __VA_ARGS__)) 912 #define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__)) 913 #define INTERNAL_CATCH_DEFINE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DEFINE_SIG_TEST1, INTERNAL_CATCH_DEFINE_SIG_TEST0)(TestName, __VA_ARGS__)) 914 #define INTERNAL_CATCH_DECLARE_SIG_TEST(TestName, ...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DEFINE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X,INTERNAL_CATCH_DECLARE_SIG_TEST_X, INTERNAL_CATCH_DECLARE_SIG_TEST1, INTERNAL_CATCH_DECLARE_SIG_TEST0)(TestName, __VA_ARGS__)) 915 #define INTERNAL_CATCH_REMOVE_PARENS_GEN(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_VA_NARGS_IMPL(__VA_ARGS__, INTERNAL_CATCH_REMOVE_PARENS_11_ARG,INTERNAL_CATCH_REMOVE_PARENS_10_ARG,INTERNAL_CATCH_REMOVE_PARENS_9_ARG,INTERNAL_CATCH_REMOVE_PARENS_8_ARG,INTERNAL_CATCH_REMOVE_PARENS_7_ARG,INTERNAL_CATCH_REMOVE_PARENS_6_ARG,INTERNAL_CATCH_REMOVE_PARENS_5_ARG,INTERNAL_CATCH_REMOVE_PARENS_4_ARG,INTERNAL_CATCH_REMOVE_PARENS_3_ARG,INTERNAL_CATCH_REMOVE_PARENS_2_ARG,INTERNAL_CATCH_REMOVE_PARENS_1_ARG)(__VA_ARGS__)) 922 #include <type_traits> 930 template <
typename Fun,
typename... Args>
932 template <
typename...>
933 std::false_type
static test(...);
936 template <
typename T>
939 template <
typename Fun,
typename... Args>
940 struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};
953 void (C::*m_testAsMethod)();
955 TestInvokerAsMethod(
void (C::*testAsMethod)() ) noexcept : m_testAsMethod( testAsMethod ) {}
957 void invoke()
const override {
959 (obj.*m_testAsMethod)();
963 auto makeTestInvoker(
void(*testAsFunction)() ) noexcept ->
ITestInvoker*;
966 auto makeTestInvoker(
void (C::*testAsMethod)() ) noexcept ->
ITestInvoker* {
983 #if defined(CATCH_CONFIG_DISABLE) 984 #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ 985 static void TestName() 986 #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ 988 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ 992 void TestName::test() 993 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( TestName, TestFunc, Name, Tags, Signature, ... ) \ 994 INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature)) 995 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ 997 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \ 998 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ 1001 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature)) 1003 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1004 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \ 1005 INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) 1007 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \ 1008 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) 1011 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1012 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \ 1013 INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) 1015 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \ 1016 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) 1019 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1020 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \ 1021 INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) 1023 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \ 1024 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) 1027 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1028 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \ 1029 INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) 1031 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \ 1032 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) 1037 #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \ 1038 static void TestName(); \ 1039 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1040 namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } \ 1041 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 1042 static void TestName() 1043 #define INTERNAL_CATCH_TESTCASE( ... ) \ 1044 INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ ) 1047 #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \ 1048 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1049 namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } \ 1050 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS 1053 #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ 1054 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1056 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ 1059 Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); \ 1061 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 1062 void TestName::test() 1063 #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \ 1064 INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ ) 1067 #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \ 1068 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1069 Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); \ 1070 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS 1073 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\ 1074 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1075 CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ 1076 INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ 1078 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ 1079 INTERNAL_CATCH_TYPE_GEN\ 1080 INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ 1081 INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\ 1082 template<typename...Types> \ 1086 constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ 1087 using expander = int[];\ 1088 (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... }; \ 1091 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ 1092 TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\ 1097 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 1098 CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ 1099 INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature)) 1101 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1102 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ 1103 INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) 1105 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ 1106 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename TestType, __VA_ARGS__ ) ) 1109 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1110 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ 1111 INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) 1113 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \ 1114 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) 1117 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \ 1118 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1119 CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ 1120 template<typename TestType> static void TestFuncName(); \ 1122 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \ 1123 INTERNAL_CATCH_TYPE_GEN \ 1124 INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature)) \ 1125 template<typename... Types> \ 1127 void reg_tests() { \ 1129 using expander = int[]; \ 1130 constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ 1131 constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ 1132 constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ 1133 (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };\ 1136 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ 1137 using TestInit = decltype(create<TestName, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{})); \ 1144 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 1145 CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ 1146 template<typename TestType> \ 1147 static void TestFuncName() 1149 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1150 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ 1151 INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T,__VA_ARGS__) 1153 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\ 1154 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, typename T, __VA_ARGS__ ) ) 1157 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1158 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ 1159 INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__) 1161 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\ 1162 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) 1165 #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\ 1166 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1167 template<typename TestType> static void TestFunc(); \ 1169 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ 1170 INTERNAL_CATCH_TYPE_GEN\ 1171 template<typename... Types> \ 1173 void reg_tests() { \ 1175 using expander = int[]; \ 1176 (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };\ 1179 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ 1180 using TestInit = decltype(convert<TestName>(std::declval<TmplList>())); \ 1186 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 1187 template<typename TestType> \ 1188 static void TestFunc() 1190 #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \ 1191 INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList ) 1193 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ 1194 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1195 CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ 1197 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ 1198 INTERNAL_CATCH_TYPE_GEN\ 1199 INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ 1200 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\ 1201 INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\ 1202 template<typename...Types> \ 1203 struct TestNameClass{\ 1206 constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\ 1207 using expander = int[];\ 1208 (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... }; \ 1211 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ 1212 TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\ 1217 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\ 1218 CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS\ 1219 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature)) 1221 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1222 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ 1223 INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) 1225 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ 1226 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, typename T, __VA_ARGS__ ) ) 1229 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1230 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ 1231 INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) 1233 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \ 1234 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____C_L_A_S_S____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) , ClassName, Name, Tags, Signature, __VA_ARGS__ ) ) 1237 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\ 1238 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1239 CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ 1240 template<typename TestType> \ 1241 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ 1245 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {\ 1246 INTERNAL_CATCH_TYPE_GEN \ 1247 INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\ 1248 template<typename...Types>\ 1249 struct TestNameClass{\ 1252 using expander = int[];\ 1253 constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\ 1254 constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\ 1255 constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\ 1256 (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... }; \ 1259 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ 1260 using TestInit = decltype(create<TestNameClass, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{}));\ 1267 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 1268 CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \ 1269 template<typename TestType> \ 1270 void TestName<TestType>::test() 1272 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1273 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ 1274 INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T, __VA_ARGS__ ) 1276 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\ 1277 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, typename T,__VA_ARGS__ ) ) 1280 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR 1281 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ 1282 INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature, __VA_ARGS__ ) 1284 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\ 1285 INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) ) 1288 #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \ 1289 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 1290 template<typename TestType> \ 1291 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ 1295 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ 1296 INTERNAL_CATCH_TYPE_GEN\ 1297 template<typename...Types>\ 1298 struct TestNameClass{\ 1301 using expander = int[];\ 1302 (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... }; \ 1305 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ 1306 using TestInit = decltype(convert<TestNameClass>(std::declval<TmplList>()));\ 1312 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 1313 template<typename TestType> \ 1314 void TestName<TestType>::test() 1316 #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \ 1317 INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, TmplList ) 1339 ExpressionFailed = FailureBit | 1,
1340 ExplicitFailure = FailureBit | 2,
1342 Exception = 0x100 | FailureBit,
1344 ThrewException = Exception | 1,
1345 DidntThrowException = Exception | 2,
1347 FatalErrorCondition = 0x200 | FailureBit
1351 bool isOk( ResultWas::OfType resultType );
1352 bool isJustInfo(
int flags );
1358 ContinueOnFailure = 0x02,
1363 ResultDisposition::Flags operator | ( ResultDisposition::Flags lhs, ResultDisposition::Flags rhs );
1365 bool shouldContinueOnFailure(
int flags );
1366 inline bool isFalseTest(
int flags ) {
return ( flags & ResultDisposition::FalseTest ) != 0; }
1367 bool shouldSuppressFailure(
int flags );
1379 ResultDisposition::Flags resultDisposition;
1395 #include <type_traits> 1405 std::ostream& cout();
1406 std::ostream& cerr();
1407 std::ostream& clog();
1413 virtual std::ostream& stream()
const = 0;
1419 std::size_t m_index;
1420 std::ostream* m_oss;
1425 auto str()
const -> std::string;
1427 template<
typename T>
1432 auto get() -> std::ostream& {
return *m_oss; }
1446 std::vector<std::pair<int, std::string>> m_values;
1459 template<
typename E>
1461 std::vector<int> intValues;
1462 intValues.reserve( values.size() );
1463 for(
auto enumValue : values )
1464 intValues.push_back( static_cast<int>( enumValue ) );
1465 return registerEnum( enumName, allEnums, intValues );
1473 #ifdef CATCH_CONFIG_CPP17_STRING_VIEW 1474 #include <string_view> 1480 #import <Foundation/Foundation.h> 1482 #ifdef __has_feature 1483 #define CATCH_ARC_ENABLED __has_feature(objc_arc) 1485 #define CATCH_ARC_ENABLED 0 1488 void arcSafeRelease( NSObject* obj );
1489 id performOptionalSelector(
id obj,
SEL sel );
1491 #if !CATCH_ARC_ENABLED 1492 inline void arcSafeRelease( NSObject* obj ) {
1495 inline id performOptionalSelector(
id obj,
SEL sel ) {
1496 if( [obj respondsToSelector: sel] )
1497 return [obj performSelector: sel];
1500 #define CATCH_UNSAFE_UNRETAINED 1501 #define CATCH_ARC_STRONG 1503 inline void arcSafeRelease( NSObject* ){}
1504 inline id performOptionalSelector(
id obj,
SEL sel ) {
1506 #pragma clang diagnostic push 1507 #pragma clang diagnostic ignored "-Warc-performSelector-leaks" 1509 if( [obj respondsToSelector: sel] )
1510 return [obj performSelector: sel];
1512 #pragma clang diagnostic pop 1516 #define CATCH_UNSAFE_UNRETAINED __unsafe_unretained 1517 #define CATCH_ARC_STRONG __strong 1524 #pragma warning(push) 1525 #pragma warning(disable:4180) // We attempt to stream a function (address) by const&, which MSVC complains about but is harmless 1531 extern const std::string unprintableString;
1533 std::string rawMemoryToString(
const void *
object, std::size_t size );
1535 template<
typename T>
1536 std::string rawMemoryToString(
const T&
object ) {
1537 return rawMemoryToString( &
object,
sizeof(
object) );
1540 template<
typename T>
1542 template<
typename SS,
typename TT>
1543 static auto test(
int)
1544 -> decltype(std::declval<SS&>() << std::declval<TT>(), std::true_type());
1546 template<
typename,
typename>
1547 static auto test(...)->std::false_type;
1550 static const bool value = decltype(test<std::ostream, const T&>(0))::value;
1553 template<
typename E>
1554 std::string convertUnknownEnumToString( E e );
1556 template<
typename T>
1557 typename std::enable_if<
1558 !std::is_enum<T>::value && !std::is_base_of<std::exception, T>::value,
1559 std::string>::type convertUnstreamable( T
const& ) {
1560 return Detail::unprintableString;
1562 template<
typename T>
1563 typename std::enable_if<
1564 !std::is_enum<T>::value && std::is_base_of<std::exception, T>::value,
1565 std::string>::type convertUnstreamable(T
const& ex) {
1569 template<
typename T>
1570 typename std::enable_if<
1571 std::is_enum<T>::value
1572 , std::string>::type convertUnstreamable( T
const& value ) {
1573 return convertUnknownEnumToString( value );
1576 #if defined(_MANAGED) 1577 template<
typename T>
1579 std::string clrReferenceToString( T^ ref ) {
1581 return std::string(
"null");
1582 auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString());
1583 cli::pin_ptr<System::Byte> p = &bytes[0];
1584 return std::string(reinterpret_cast<char const *>(p), bytes->Length);
1591 template <
typename T,
typename =
void>
1593 template <
typename Fake = T>
1595 typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type
1596 convert(
const Fake& value) {
1600 rss.operator<<(value);
1604 template <
typename Fake = T>
1606 typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type
1607 convert(
const Fake& value ) {
1608 #if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER) 1609 return Detail::convertUnstreamable(value);
1611 return CATCH_CONFIG_FALLBACK_STRINGIFIER(value);
1620 template <
typename T>
1621 std::string stringify(
const T& e) {
1622 return ::Catch::StringMaker<typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e);
1625 template<
typename E>
1626 std::string convertUnknownEnumToString( E e ) {
1627 return ::Catch::Detail::stringify(
static_cast<typename std::underlying_type<E>::type
>(e));
1630 #if defined(_MANAGED) 1631 template <
typename T>
1632 std::string stringify( T^ e ) {
1633 return ::Catch::StringMaker<T^>::convert(e);
1643 static std::string convert(
const std::string& str);
1646 #ifdef CATCH_CONFIG_CPP17_STRING_VIEW 1649 static std::string convert(std::string_view str);
1655 static std::string convert(
char const * str);
1659 static std::string convert(
char * str);
1662 #ifdef CATCH_CONFIG_WCHAR 1665 static std::string convert(
const std::wstring& wstr);
1668 # ifdef CATCH_CONFIG_CPP17_STRING_VIEW 1671 static std::string convert(std::wstring_view str);
1677 static std::string convert(
wchar_t const * str);
1681 static std::string convert(
wchar_t * str);
1689 static std::string convert(
char const* str) {
1690 return ::Catch::Detail::stringify(std::string{ str });
1695 static std::string convert(
signed char const* str) {
1696 return ::Catch::Detail::stringify(std::string{
reinterpret_cast<char const *
>(str) });
1701 static std::string convert(
unsigned char const* str) {
1702 return ::Catch::Detail::stringify(std::string{
reinterpret_cast<char const *
>(str) });
1706 #if defined(CATCH_CONFIG_CPP17_BYTE) 1709 static std::string convert(std::byte value);
1711 #endif // defined(CATCH_CONFIG_CPP17_BYTE) 1714 static std::string convert(
int value);
1718 static std::string convert(
long value);
1722 static std::string convert(
long long value);
1726 static std::string convert(
unsigned int value);
1730 static std::string convert(
unsigned long value);
1734 static std::string convert(
unsigned long long value);
1739 static std::string convert(
bool b);
1744 static std::string convert(
char c);
1748 static std::string convert(
signed char c);
1752 static std::string convert(
unsigned char c);
1757 static std::string convert(std::nullptr_t);
1762 static std::string convert(
float value);
1763 static int precision;
1768 static std::string convert(
double value);
1769 static int precision;
1772 template <
typename T>
1774 template <
typename U>
1775 static std::string convert(U* p) {
1777 return ::Catch::Detail::rawMemoryToString(p);
1784 template <
typename R,
typename C>
1786 static std::string convert(R C::* p) {
1788 return ::Catch::Detail::rawMemoryToString(p);
1795 #if defined(_MANAGED) 1796 template <
typename T>
1798 static std::string convert( T^ ref ) {
1799 return ::Catch::Detail::clrReferenceToString(ref);
1805 template<
typename InputIterator>
1806 std::string rangeToString(InputIterator first, InputIterator last) {
1809 if (first != last) {
1810 rss << ::Catch::Detail::stringify(*first);
1811 for (++first; first != last; ++first)
1812 rss <<
", " << ::Catch::Detail::stringify(*first);
1822 static std::string convert(NSString * nsstring) {
1825 return std::string(
"@") + [nsstring UTF8String];
1830 static std::string convert(NSObject* nsObject) {
1831 return ::Catch::Detail::stringify([nsObject description]);
1836 inline std::string stringify( NSString* nsstring ) {
1849 #if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS) 1850 # define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER 1851 # define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER 1852 # define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER 1853 # define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER 1854 # define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER 1858 #if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER) 1861 template<
typename T1,
typename T2>
1863 static std::string convert(
const std::pair<T1, T2>& pair) {
1866 << ::Catch::Detail::stringify(pair.first)
1868 << ::Catch::Detail::stringify(pair.second)
1874 #endif // CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER 1876 #if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL) 1879 template<
typename T>
1881 static std::string convert(
const std::optional<T>& optional) {
1883 if (optional.has_value()) {
1884 rss << ::Catch::Detail::stringify(*optional);
1892 #endif // CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER 1895 #if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER) 1902 bool = (N < std::tuple_size<Tuple>::value)
1904 struct TupleElementPrinter {
1905 static void print(
const Tuple& tuple, std::ostream& os) {
1906 os << (N ?
", " :
" ")
1907 << ::Catch::Detail::stringify(std::get<N>(tuple));
1908 TupleElementPrinter<Tuple, N + 1>::print(tuple, os);
1916 struct TupleElementPrinter<Tuple, N, false> {
1917 static void print(
const Tuple&, std::ostream&) {}
1922 template<
typename ...Types>
1924 static std::string convert(
const std::tuple<Types...>& tuple) {
1927 Detail::TupleElementPrinter<std::tuple<Types...>>::print(tuple, rss.get());
1933 #endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER 1935 #if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT) 1940 static std::string convert(
const std::monostate&) {
1945 template<
typename... Elements>
1947 static std::string convert(
const std::variant<Elements...>& variant) {
1948 if (variant.valueless_by_exception()) {
1949 return "{valueless variant}";
1952 [](
const auto& value) {
1953 return ::Catch::Detail::stringify(value);
1961 #endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER 1973 template <
typename T>
1975 static const bool value =
1976 !std::is_same<decltype(begin(std::declval<T>())),
not_this_one>::value &&
1977 !std::is_same<decltype(end(std::declval<T>())),
not_this_one>::value;
1980 #if defined(_MANAGED) // Managed types are never ranges 1981 template <
typename T>
1983 static const bool value =
false;
1987 template<
typename Range>
1988 std::string rangeToString( Range
const& range ) {
1989 return ::Catch::Detail::rangeToString( begin( range ), end( range ) );
1993 template<
typename Allocator>
1994 std::string rangeToString( std::vector<bool, Allocator>
const& v ) {
2003 rss << ::Catch::Detail::stringify( b );
2009 template<
typename R>
2010 struct StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> {
2011 static std::string convert( R
const& range ) {
2012 return rangeToString( range );
2016 template <
typename T,
int SZ>
2018 static std::string convert(T
const(&arr)[SZ]) {
2019 return rangeToString(arr);
2026 #if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) 2033 template <
class Ratio>
2034 struct ratio_string {
2035 static std::string symbol();
2038 template <
class Ratio>
2039 std::string ratio_string<Ratio>::symbol() {
2041 rss <<
'[' << Ratio::num <<
'/' 2042 << Ratio::den <<
']';
2046 struct ratio_string<std::atto> {
2047 static std::string symbol();
2050 struct ratio_string<std::femto> {
2051 static std::string symbol();
2054 struct ratio_string<std::pico> {
2055 static std::string symbol();
2058 struct ratio_string<std::nano> {
2059 static std::string symbol();
2062 struct ratio_string<std::micro> {
2063 static std::string symbol();
2066 struct ratio_string<std::milli> {
2067 static std::string symbol();
2072 template<
typename Value,
typename Ratio>
2073 struct StringMaker<std::chrono::duration<Value, Ratio>> {
2074 static std::string convert(std::chrono::duration<Value, Ratio>
const& duration) {
2076 rss << duration.count() <<
' ' << ratio_string<Ratio>::symbol() <<
's';
2080 template<
typename Value>
2081 struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> {
2082 static std::string convert(std::chrono::duration<Value, std::ratio<1>>
const& duration) {
2084 rss << duration.count() <<
" s";
2088 template<
typename Value>
2089 struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> {
2090 static std::string convert(std::chrono::duration<Value, std::ratio<60>>
const& duration) {
2092 rss << duration.count() <<
" m";
2096 template<
typename Value>
2097 struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> {
2098 static std::string convert(std::chrono::duration<Value, std::ratio<3600>>
const& duration) {
2100 rss << duration.count() <<
" h";
2108 template<
typename Clock,
typename Duration>
2109 struct StringMaker<std::chrono::time_point<Clock, Duration>> {
2110 static std::string convert(std::chrono::time_point<Clock, Duration>
const& time_point) {
2111 return ::Catch::Detail::stringify(time_point.time_since_epoch()) +
" since epoch";
2115 template<
typename Duration>
2116 struct StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> {
2117 static std::string convert(std::chrono::time_point<std::chrono::system_clock, Duration>
const& time_point) {
2118 auto converted = std::chrono::system_clock::to_time_t(time_point);
2121 std::tm timeInfo = {};
2122 gmtime_s(&timeInfo, &converted);
2124 std::tm* timeInfo = std::gmtime(&converted);
2127 auto const timeStampSize =
sizeof(
"2017-01-16T17:06:45Z");
2128 char timeStamp[timeStampSize];
2129 const char *
const fmt =
"%Y-%m-%dT%H:%M:%SZ";
2132 std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
2134 std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
2136 return std::string(timeStamp);
2140 #endif // CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER 2142 #define INTERNAL_CATCH_REGISTER_ENUM( enumName, ... ) \ 2144 template<> struct StringMaker<enumName> { \ 2145 static std::string convert( enumName value ) { \ 2146 static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \ 2147 return enumInfo.lookup( static_cast<int>( value ) ); \ 2152 #define CATCH_REGISTER_ENUM( enumName, ... ) INTERNAL_CATCH_REGISTER_ENUM( enumName, __VA_ARGS__ ) 2155 #pragma warning(pop) 2162 #pragma warning(push) 2163 #pragma warning(disable:4389) // '==' : signed/unsigned mismatch 2164 #pragma warning(disable:4018) // more "signed/unsigned mismatch" 2165 #pragma warning(disable:4312) // Converting int to T* using reinterpret_cast (issue on x64 platform) 2166 #pragma warning(disable:4180) // qualifier applied to function type has no meaning 2167 #pragma warning(disable:4800) // Forcing result to true or false 2173 auto isBinaryExpression()
const ->
bool {
return m_isBinaryExpression; }
2174 auto getResult()
const ->
bool {
return m_result; }
2175 virtual void streamReconstructedExpression( std::ostream &os )
const = 0;
2178 : m_isBinaryExpression( isBinaryExpression ),
2186 bool m_isBinaryExpression;
2191 void formatReconstructedExpression( std::ostream &os, std::string
const& lhs,
StringRef op, std::string
const& rhs );
2193 template<
typename LhsT,
typename RhsT>
2199 void streamReconstructedExpression( std::ostream &os )
const override {
2200 formatReconstructedExpression
2201 ( os, Catch::Detail::stringify( m_lhs ), m_op, Catch::Detail::stringify( m_rhs ) );
2212 template<
typename T>
2215 "chained comparisons are not supported inside assertions, " 2216 "wrap the expression inside parentheses, or decompose it");
2219 template<
typename T>
2222 "chained comparisons are not supported inside assertions, " 2223 "wrap the expression inside parentheses, or decompose it");
2226 template<
typename T>
2229 "chained comparisons are not supported inside assertions, " 2230 "wrap the expression inside parentheses, or decompose it");
2233 template<
typename T>
2236 "chained comparisons are not supported inside assertions, " 2237 "wrap the expression inside parentheses, or decompose it");
2240 template<
typename T>
2243 "chained comparisons are not supported inside assertions, " 2244 "wrap the expression inside parentheses, or decompose it");
2247 template<
typename T>
2250 "chained comparisons are not supported inside assertions, " 2251 "wrap the expression inside parentheses, or decompose it");
2254 template<
typename T>
2257 "chained comparisons are not supported inside assertions, " 2258 "wrap the expression inside parentheses, or decompose it");
2261 template<
typename T>
2264 "chained comparisons are not supported inside assertions, " 2265 "wrap the expression inside parentheses, or decompose it");
2269 template<
typename LhsT>
2273 void streamReconstructedExpression( std::ostream &os )
const override {
2274 os << Catch::Detail::stringify( m_lhs );
2285 template<
typename LhsT,
typename RhsT>
2286 auto compareEqual( LhsT
const& lhs, RhsT
const& rhs ) ->
bool {
return static_cast<bool>(lhs == rhs); }
2287 template<
typename T>
2288 auto compareEqual( T*
const& lhs,
int rhs ) ->
bool {
return lhs ==
reinterpret_cast<void const*
>( rhs ); }
2289 template<
typename T>
2290 auto compareEqual( T*
const& lhs,
long rhs ) ->
bool {
return lhs ==
reinterpret_cast<void const*
>( rhs ); }
2291 template<
typename T>
2292 auto compareEqual(
int lhs, T*
const& rhs ) ->
bool {
return reinterpret_cast<void const*
>( lhs ) == rhs; }
2293 template<
typename T>
2294 auto compareEqual(
long lhs, T*
const& rhs ) ->
bool {
return reinterpret_cast<void const*
>( lhs ) == rhs; }
2296 template<
typename LhsT,
typename RhsT>
2297 auto compareNotEqual( LhsT
const& lhs, RhsT&& rhs ) ->
bool {
return static_cast<bool>(lhs != rhs); }
2298 template<
typename T>
2299 auto compareNotEqual( T*
const& lhs,
int rhs ) ->
bool {
return lhs !=
reinterpret_cast<void const*
>( rhs ); }
2300 template<
typename T>
2301 auto compareNotEqual( T*
const& lhs,
long rhs ) ->
bool {
return lhs !=
reinterpret_cast<void const*
>( rhs ); }
2302 template<
typename T>
2303 auto compareNotEqual(
int lhs, T*
const& rhs ) ->
bool {
return reinterpret_cast<void const*
>( lhs ) != rhs; }
2304 template<
typename T>
2305 auto compareNotEqual(
long lhs, T*
const& rhs ) ->
bool {
return reinterpret_cast<void const*
>( lhs ) != rhs; }
2307 template<
typename LhsT>
2311 explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {}
2313 template<
typename RhsT>
2315 return { compareEqual( m_lhs, rhs ), m_lhs,
"==", rhs };
2318 return { m_lhs == rhs, m_lhs,
"==", rhs };
2321 template<
typename RhsT>
2323 return { compareNotEqual( m_lhs, rhs ), m_lhs,
"!=", rhs };
2326 return { m_lhs != rhs, m_lhs,
"!=", rhs };
2329 template<
typename RhsT>
2331 return {
static_cast<bool>(m_lhs > rhs), m_lhs,
">", rhs };
2333 template<
typename RhsT>
2335 return {
static_cast<bool>(m_lhs < rhs), m_lhs,
"<", rhs };
2337 template<
typename RhsT>
2339 return {
static_cast<bool>(m_lhs >= rhs), m_lhs,
">=", rhs };
2341 template<
typename RhsT>
2343 return {
static_cast<bool>(m_lhs <= rhs), m_lhs,
"<=", rhs };
2346 template<
typename RhsT>
2349 "operator&& is not supported inside assertions, " 2350 "wrap the expression inside parentheses, or decompose it");
2353 template<
typename RhsT>
2356 "operator|| is not supported inside assertions, " 2357 "wrap the expression inside parentheses, or decompose it");
2367 template<
typename T>
2368 void handleExpression(
ExprLhs<T> const& expr ) {
2369 handleExpression( expr.makeUnaryExpr() );
2373 template<
typename T>
2386 #pragma warning(pop) 2397 class AssertionResult;
2410 #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) 2411 struct BenchmarkInfo;
2412 template <
typename Duration = std::chrono::duration<
double, std::nano>>
2413 struct BenchmarkStats;
2414 #endif // CATCH_CONFIG_ENABLE_BENCHMARKING 2420 virtual bool sectionStarted(
SectionInfo const& sectionInfo,
2421 Counts& assertions ) = 0;
2423 virtual void sectionEndedEarly(
SectionEndInfo const& endInfo ) = 0;
2427 #if defined(CATCH_CONFIG_ENABLE_BENCHMARKING) 2428 virtual void benchmarkPreparing( std::string
const& name ) = 0;
2429 virtual void benchmarkStarting( BenchmarkInfo
const& info ) = 0;
2430 virtual void benchmarkEnded( BenchmarkStats<>
const& stats ) = 0;
2431 virtual void benchmarkFailed( std::string
const& error ) = 0;
2432 #endif // CATCH_CONFIG_ENABLE_BENCHMARKING 2434 virtual void pushScopedMessage(
MessageInfo const& message ) = 0;
2435 virtual void popScopedMessage(
MessageInfo const& message ) = 0;
2437 virtual void emplaceUnscopedMessage(
MessageBuilder const& builder ) = 0;
2439 virtual void handleFatalErrorCondition(
StringRef message ) = 0;
2441 virtual void handleExpr
2445 virtual void handleMessage
2447 ResultWas::OfType resultType,
2450 virtual void handleUnexpectedExceptionNotThrown
2453 virtual void handleUnexpectedInflightException
2455 std::string
const& message,
2457 virtual void handleIncomplete
2459 virtual void handleNonExpr
2461 ResultWas::OfType resultType,
2464 virtual bool lastAssertionPassed() = 0;
2465 virtual void assertionPassed() = 0;
2468 virtual std::string getCurrentTestName()
const = 0;
2469 virtual const AssertionResult* getLastResult()
const = 0;
2470 virtual void exceptionEarlyReported() = 0;
2480 struct AssertionResultData;
2486 friend struct AssertionStats;
2487 friend class RunContext;
2496 explicit operator bool()
const;
2498 friend auto operator << ( std::ostream& os,
LazyExpression const& lazyExpr ) -> std::ostream&;
2502 bool shouldDebugBreak =
false;
2503 bool shouldThrow =
false;
2509 bool m_completed =
false;
2517 ResultDisposition::Flags resultDisposition );
2519 if ( !m_completed ) {
2520 m_resultCapture.handleIncomplete( m_assertionInfo );
2524 template<
typename T>
2526 handleExpr( expr.makeUnaryExpr() );
2530 void handleMessage(ResultWas::OfType resultType,
StringRef const& message);
2532 void handleExceptionThrownAsExpected();
2533 void handleUnexpectedExceptionNotThrown();
2534 void handleExceptionNotThrownAsExpected();
2535 void handleThrowingCallSkipped();
2536 void handleUnexpectedInflightException();
2539 void setCompleted();
2542 auto allowThrows()
const -> bool;
2560 ResultWas::OfType _type );
2563 std::string message;
2565 ResultWas::OfType type;
2566 unsigned int sequence;
2568 bool operator == (
MessageInfo const& other )
const;
2569 bool operator < (
MessageInfo const& other )
const;
2571 static unsigned int globalCount;
2576 template<
typename T>
2588 ResultWas::OfType type );
2590 template<
typename T>
2611 std::vector<MessageInfo> m_messages;
2613 size_t m_captured = 0;
2618 void captureValue(
size_t index, std::string
const& value );
2620 template<
typename T>
2621 void captureValues(
size_t index, T
const& value ) {
2622 captureValue( index, Catch::Detail::stringify( value ) );
2625 template<
typename T,
typename... Ts>
2626 void captureValues(
size_t index, T
const& value, Ts
const&... values ) {
2627 captureValue( index, Catch::Detail::stringify(value) );
2628 captureValues( index+1, values... );
2635 #if !defined(CATCH_CONFIG_DISABLE) 2637 #if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION) 2638 #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__ 2640 #define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION" 2643 #if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) 2648 #define INTERNAL_CATCH_TRY 2649 #define INTERNAL_CATCH_CATCH( capturer ) 2651 #else // CATCH_CONFIG_FAST_COMPILE 2653 #define INTERNAL_CATCH_TRY try 2654 #define INTERNAL_CATCH_CATCH( handler ) catch(...) { handler.handleUnexpectedInflightException(); } 2658 #define INTERNAL_CATCH_REACT( handler ) handler.complete(); 2661 #define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \ 2663 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ 2664 INTERNAL_CATCH_TRY { \ 2665 CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ 2666 catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \ 2667 CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \ 2668 } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \ 2669 INTERNAL_CATCH_REACT( catchAssertionHandler ) \ 2670 } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look 2674 #define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \ 2675 INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ 2676 if( Catch::getResultCapture().lastAssertionPassed() ) 2679 #define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \ 2680 INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \ 2681 if( !Catch::getResultCapture().lastAssertionPassed() ) 2684 #define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \ 2686 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \ 2688 static_cast<void>(__VA_ARGS__); \ 2689 catchAssertionHandler.handleExceptionNotThrownAsExpected(); \ 2692 catchAssertionHandler.handleUnexpectedInflightException(); \ 2694 INTERNAL_CATCH_REACT( catchAssertionHandler ) \ 2698 #define INTERNAL_CATCH_THROWS( macroName, resultDisposition, ... ) \ 2700 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition); \ 2701 if( catchAssertionHandler.allowThrows() ) \ 2703 static_cast<void>(__VA_ARGS__); \ 2704 catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ 2707 catchAssertionHandler.handleExceptionThrownAsExpected(); \ 2710 catchAssertionHandler.handleThrowingCallSkipped(); \ 2711 INTERNAL_CATCH_REACT( catchAssertionHandler ) \ 2715 #define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \ 2717 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \ 2718 if( catchAssertionHandler.allowThrows() ) \ 2720 static_cast<void>(expr); \ 2721 catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ 2723 catch( exceptionType const& ) { \ 2724 catchAssertionHandler.handleExceptionThrownAsExpected(); \ 2727 catchAssertionHandler.handleUnexpectedInflightException(); \ 2730 catchAssertionHandler.handleThrowingCallSkipped(); \ 2731 INTERNAL_CATCH_REACT( catchAssertionHandler ) \ 2735 #define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \ 2737 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \ 2738 catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \ 2739 INTERNAL_CATCH_REACT( catchAssertionHandler ) \ 2743 #define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \ 2744 auto varName = Catch::Capturer( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__ ); \ 2745 varName.captureValues( 0, __VA_ARGS__ ) 2748 #define INTERNAL_CATCH_INFO( macroName, log ) \ 2749 Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log ); 2752 #define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \ 2753 Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log ) 2757 #define INTERNAL_CATCH_THROWS_STR_MATCHES( macroName, resultDisposition, matcher, ... ) \ 2759 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \ 2760 if( catchAssertionHandler.allowThrows() ) \ 2762 static_cast<void>(__VA_ARGS__); \ 2763 catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \ 2766 Catch::handleExceptionMatchExpr( catchAssertionHandler, matcher, #matcher##_catch_sr ); \ 2769 catchAssertionHandler.handleThrowingCallSkipped(); \ 2770 INTERNAL_CATCH_REACT( catchAssertionHandler ) \ 2773 #endif // CATCH_CONFIG_DISABLE 2790 std::size_t total()
const;
2791 bool allPassed()
const;
2794 std::size_t passed = 0;
2795 std::size_t failed = 0;
2796 std::size_t failedButOk = 0;
2820 std::string
const& _name );
2825 std::string
const& _name,
2826 std::string
const& ) :
SectionInfo( _lineInfo, _name ) {}
2829 std::string description;
2836 double durationInSeconds;
2848 auto getCurrentNanosecondsSinceEpoch() -> uint64_t;
2849 auto getEstimatedClockResolution() -> uint64_t;
2852 uint64_t m_nanoseconds = 0;
2855 auto getElapsedNanoseconds()
const -> uint64_t;
2856 auto getElapsedMicroseconds()
const -> uint64_t;
2857 auto getElapsedMilliseconds()
const ->
unsigned int;
2858 auto getElapsedSeconds()
const -> double;
2874 explicit operator bool()
const;
2881 bool m_sectionIncluded;
2887 #define INTERNAL_CATCH_SECTION( ... ) \ 2888 CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ 2889 if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \ 2890 CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS 2892 #define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \ 2893 CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ 2894 if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \ 2895 CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS 2911 struct IReporterRegistry;
2912 struct IReporterFactory;
2913 struct ITagAliasRegistry;
2916 class StartupExceptionRegistry;
2918 using IReporterFactoryPtr = std::shared_ptr<IReporterFactory>;
2923 virtual IReporterRegistry
const& getReporterRegistry()
const = 0;
2925 virtual ITagAliasRegistry
const& getTagAliasRegistry()
const = 0;
2928 virtual StartupExceptionRegistry
const& getStartupExceptionRegistry()
const = 0;
2933 virtual void registerReporter( std::string
const& name, IReporterFactoryPtr
const& factory ) = 0;
2934 virtual void registerListener( IReporterFactoryPtr
const& factory ) = 0;
2935 virtual void registerTest(
TestCase const& testInfo ) = 0;
2937 virtual void registerTagAlias( std::string
const& alias, std::string
const& tag,
SourceLineInfo const& lineInfo ) = 0;
2938 virtual void registerStartupException() noexcept = 0;
2945 std::string translateActiveException();
2950 #if defined(CATCH_CONFIG_DISABLE) 2951 #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \ 2952 static std::string translatorName( signature ) 2955 #include <exception> 2960 using exceptionTranslateFunction = std::string(*)();
2963 using ExceptionTranslators = std::vector<std::unique_ptr<IExceptionTranslator const>>;
2967 virtual std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd )
const = 0;
2973 virtual std::string translateActiveException()
const = 0;
2977 template<
typename T>
2981 ExceptionTranslator( std::string(*translateFunction)( T& ) )
2982 : m_translateFunction( translateFunction )
2985 std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd )
const override {
2988 std::rethrow_exception(std::current_exception());
2990 return (*it)->translate( it+1, itEnd );
2993 return m_translateFunction( ex );
2998 std::string(*m_translateFunction)( T& );
3002 template<
typename T>
3004 getMutableRegistryHub().registerTranslator
3005 (
new ExceptionTranslator<T>( translateFunction ) );
3011 #define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \ 3012 static std::string translatorName( signature ); \ 3013 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ 3014 namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \ 3015 CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ 3016 static std::string translatorName( signature ) 3018 #define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature ) 3023 #include <type_traits> 3030 bool equalityComparisonImpl(
double other)
const;
3033 void setMargin(
double margin);
3036 void setEpsilon(
double epsilon);
3039 explicit Approx (
double value );
3043 Approx operator-()
const;
3045 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3046 Approx operator()( T
const& value ) {
3047 Approx approx( static_cast<double>(value) );
3048 approx.m_epsilon = m_epsilon;
3049 approx.m_margin = m_margin;
3050 approx.m_scale = m_scale;
3054 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3055 explicit Approx( T
const& value ): Approx(static_cast<double>(value))
3058 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3059 friend bool operator == (
const T& lhs, Approx
const& rhs ) {
3060 auto lhs_v =
static_cast<double>(lhs);
3061 return rhs.equalityComparisonImpl(lhs_v);
3064 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3065 friend bool operator == ( Approx
const& lhs,
const T& rhs ) {
3066 return operator==( rhs, lhs );
3069 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3070 friend bool operator != ( T
const& lhs, Approx
const& rhs ) {
3071 return !operator==( lhs, rhs );
3074 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3075 friend bool operator != ( Approx
const& lhs, T
const& rhs ) {
3076 return !operator==( rhs, lhs );
3079 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3080 friend bool operator <= ( T
const& lhs, Approx
const& rhs ) {
3081 return static_cast<double>(lhs) < rhs.m_value || lhs == rhs;
3084 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3085 friend bool operator <= ( Approx
const& lhs, T
const& rhs ) {
3086 return lhs.m_value <
static_cast<double>(rhs) || lhs == rhs;
3089 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3090 friend bool operator >= ( T
const& lhs, Approx
const& rhs ) {
3091 return static_cast<double>(lhs) > rhs.m_value || lhs == rhs;
3094 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3095 friend bool operator >= ( Approx
const& lhs, T
const& rhs ) {
3096 return lhs.m_value >
static_cast<double>(rhs) || lhs == rhs;
3099 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3100 Approx& epsilon( T
const& newEpsilon ) {
3101 double epsilonAsDouble =
static_cast<double>(newEpsilon);
3102 setEpsilon(epsilonAsDouble);
3106 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3107 Approx& margin( T
const& newMargin ) {
3108 double marginAsDouble =
static_cast<double>(newMargin);
3109 setMargin(marginAsDouble);
3113 template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
3114 Approx& scale( T
const& newScale ) {
3115 m_scale =
static_cast<double>(newScale);
3119 std::string toString()
const;
3129 namespace literals {
3150 bool startsWith( std::string
const& s, std::string
const& prefix );
3151 bool startsWith( std::string
const& s,
char prefix );
3152 bool endsWith( std::string
const& s, std::string
const& suffix );
3153 bool endsWith( std::string
const& s,
char suffix );
3154 bool contains( std::string
const& s, std::string
const& infix );
3155 void toLowerInPlace( std::string& s );
3156 std::string toLower( std::string
const& s );
3157 std::string trim( std::string
const& str );
3160 std::vector<StringRef> splitStringRef(
StringRef str,
char delimiter );
3161 bool replaceInPlace( std::string& str, std::string
const& replaceThis, std::string
const& withThis );
3164 pluralise( std::size_t count, std::string
const& label );
3166 friend std::ostream& operator << ( std::ostream& os,
pluralise const& pluraliser );
3168 std::size_t m_count;
3169 std::string m_label;
3174 #ifndef CATCH_CONFIG_DISABLE_MATCHERS 3183 namespace Matchers {
3195 std::string toString()
const;
3199 virtual std::string describe()
const = 0;
3200 mutable std::string m_cachedToString;
3204 # pragma clang diagnostic push 3205 # pragma clang diagnostic ignored "-Wnon-virtual-dtor" 3208 template<
typename ObjectT>
3210 virtual bool match( ObjectT
const& arg )
const = 0;
3213 #if defined(__OBJC__) 3218 virtual bool match( NSString* arg )
const = 0;
3223 # pragma clang diagnostic pop 3226 template<
typename T>
3234 template<
typename ArgT>
3236 bool match( ArgT
const& arg )
const override {
3237 for(
auto matcher : m_matchers ) {
3238 if (!matcher->match(arg))
3243 std::string describe()
const override {
3244 std::string description;
3245 description.reserve( 4 + m_matchers.size()*32 );
3246 description +=
"( ";
3248 for(
auto matcher : m_matchers ) {
3252 description +=
" and ";
3253 description += matcher->toString();
3255 description +=
" )";
3260 m_matchers.push_back( &other );
3264 std::vector<MatcherBase<ArgT>
const*> m_matchers;
3266 template<
typename ArgT>
3269 bool match( ArgT
const& arg )
const override {
3270 for(
auto matcher : m_matchers ) {
3271 if (matcher->match(arg))
3276 std::string describe()
const override {
3277 std::string description;
3278 description.reserve( 4 + m_matchers.size()*32 );
3279 description +=
"( ";
3281 for(
auto matcher : m_matchers ) {
3285 description +=
" or ";
3286 description += matcher->toString();
3288 description +=
" )";
3293 m_matchers.push_back( &other );
3297 std::vector<MatcherBase<ArgT>
const*> m_matchers;
3300 template<
typename ArgT>
3305 bool match( ArgT
const& arg )
const override {
3306 return !m_underlyingMatcher.match( arg );
3309 std::string describe()
const override {
3310 return "not " + m_underlyingMatcher.toString();
3315 template<
typename T>
3319 template<
typename T>
3323 template<
typename T>
3332 using namespace Matchers;
3340 #include <type_traits> 3344 namespace Matchers {
3346 namespace Floating {
3348 enum class FloatingPointKind : uint8_t;
3352 bool match(
double const& matchee)
const override;
3353 std::string describe()
const override;
3361 bool match(
double const& matchee)
const override;
3362 std::string describe()
const override;
3366 FloatingPointKind m_type;
3383 #include <functional> 3387 namespace Matchers {
3391 std::string finalizeDescription(
const std::string& desc);
3394 template <
typename T>
3396 std::function<bool(T const&)> m_predicate;
3397 std::string m_description;
3400 PredicateMatcher(std::function<
bool(T
const&)>
const& elem, std::string
const& descr)
3401 :m_predicate(std::move(elem)),
3402 m_description(Detail::finalizeDescription(descr))
3405 bool match( T
const& item )
const override {
3406 return m_predicate(item);
3409 std::string describe()
const override {
3410 return m_description;
3420 template<
typename T>