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 13
18#define CATCH_VERSION_PATCH 10
21# pragma clang system_header
23# pragma GCC system_header
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"
42# pragma GCC diagnostic ignored "-Wparentheses"
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)
72# include <TargetConditionals.h>
73# if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || \
74 (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1)
75# define CATCH_PLATFORM_MAC
76# elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1)
77# define CATCH_PLATFORM_IPHONE
80#elif defined(linux) || defined(__linux) || defined(__linux__)
81# define CATCH_PLATFORM_LINUX
83#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__)
84# define CATCH_PLATFORM_WINDOWS
90# ifndef CLARA_CONFIG_MAIN
91# define CLARA_CONFIG_MAIN_NOT_DEFINED
92# define CLARA_CONFIG_MAIN
128# if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
129# define CATCH_CPP14_OR_GREATER
132# if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L)
133# define CATCH_CPP17_OR_GREATER
140#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) && !defined(__LCC__)
141# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" )
142# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" )
144# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
148#if defined(__clang__)
150# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
151# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
164# if !defined(__ibmxl__) && !defined(__CUDACC__)
165# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
168# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
169 _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
170 _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
172# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
173 _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
175# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
176 _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
178# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
179 _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
181# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
182 _Pragma( "clang diagnostic ignored \"-Wunused-template\"" )
188#if !defined(CATCH_PLATFORM_WINDOWS)
189 #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS
194#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__)
195 #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
199# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS
200# define CATCH_CONFIG_COLOUR_NONE
205#if defined(__ANDROID__)
206# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
207# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE
212#if defined(__MINGW32__)
213# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
218#if defined(__ORBIS__)
219# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE
231# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
232 && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
234# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
245# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)
246# define CATCH_CONFIG_COLOUR_NONE
248# define CATCH_INTERNAL_CONFIG_WINDOWS_SEH
251# if !defined(__clang__)
256# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)
257# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
261# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) )
262# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) )
267#if defined(_REENTRANT) || defined(_MSC_VER)
269# define CATCH_INTERNAL_CONFIG_USE_ASYNC
274#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND)
275# define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED
281# define CATCH_INTERNAL_CONFIG_NO_WCHAR
286#if defined(__BORLANDC__)
287 #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN
297#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L )
298 #define CATCH_INTERNAL_CONFIG_COUNTER
306#if defined(UNDER_RTSS) || defined(RTX64_BUILD)
307 #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH
308 #define CATCH_INTERNAL_CONFIG_NO_ASYNC
309 #define CATCH_CONFIG_COLOUR_NONE
312#if !defined(_GLIBCXX_USE_C99_MATH_TR1)
313#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER
317#if defined(__has_include)
319 #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)
320 # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW
324 # if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
325 # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL
329 # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
331 # if defined(__cpp_lib_byte) && (__cpp_lib_byte > 0)
332 # define CATCH_INTERNAL_CONFIG_CPP17_BYTE
337 # if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
338 # if defined(__clang__) && (__clang_major__ < 8)
342 # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
343 # define CATCH_CONFIG_NO_CPP17_VARIANT
345 # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
348 # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
353#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER)
354# define CATCH_CONFIG_COUNTER
356#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)
357# define CATCH_CONFIG_WINDOWS_SEH
360#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)
361# define CATCH_CONFIG_POSIX_SIGNALS
364#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR)
365# define CATCH_CONFIG_WCHAR
368#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING)
369# define CATCH_CONFIG_CPP11_TO_STRING
372#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL)
373# define CATCH_CONFIG_CPP17_OPTIONAL
376#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)
377# define CATCH_CONFIG_CPP17_STRING_VIEW
380#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT)
381# define CATCH_CONFIG_CPP17_VARIANT
384#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE)
385# define CATCH_CONFIG_CPP17_BYTE
388#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT)
389# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE
392#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)
393# define CATCH_CONFIG_NEW_CAPTURE
396#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
397# define CATCH_CONFIG_DISABLE_EXCEPTIONS
400#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN)
401# define CATCH_CONFIG_POLYFILL_ISNAN
404#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC)
405# define CATCH_CONFIG_USE_ASYNC
408#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE)
409# define CATCH_CONFIG_ANDROID_LOGWRITE
412#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
413# define CATCH_CONFIG_GLOBAL_NEXTAFTER
418#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
419# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
421#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION)
422# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
424#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
425# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
427#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)
428# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
430#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS)
431# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS
433#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)
434# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
439#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
440# define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
443#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
444# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
445#elif defined(__clang__) && (__clang_major__ < 5)
446# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
449#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS)
450# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
453#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
454#define CATCH_TRY if ((true))
455#define CATCH_CATCH_ALL if ((false))
456#define CATCH_CATCH_ANON(type) if ((false))
459#define CATCH_CATCH_ALL catch (...)
460#define CATCH_CATCH_ANON(type) catch (type)
463#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR)
464#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
468#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
469#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
470#ifdef CATCH_CONFIG_COUNTER
471# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )
473# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ )
543#define CATCH_INTERNAL_LINEINFO \
544 ::Catch::SourceLineInfo( __FILE__, static_cast<std::size_t>( __LINE__ ) )
555#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \
556 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
557 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
558 namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \
559 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
588 std::vector<TestCase>
filterTests( std::vector<TestCase>
const& testCases, TestSpec
const& testSpec,
IConfig const& config );
612 static constexpr char const*
const s_empty =
"";
614 char const* m_start = s_empty;
623 : m_start( rawChars ),
628 : m_start( stdString.c_str() ),
629 m_size( stdString.size() )
632 explicit operator std::string()
const {
633 return std::string(m_start, m_size);
639 return !(*
this == other);
643 assert(index < m_size);
644 return m_start[index];
648 constexpr auto empty() const noexcept ->
bool {
666 auto
data() const noexcept ->
char const*;
669 return m_start[m_size] ==
'\0';
680 constexpr auto operator "" _sr(
char const* rawChars, std::size_t
size )
noexcept ->
StringRef {
693#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__
694#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__)))
695#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__)))
696#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__)))
697#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__)))
698#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__)))
700#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
701#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__
703#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__)))
704#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__))
706#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__)
709#define CATCH_REC_END(...)
713#define CATCH_DEFER(id) id CATCH_EMPTY()
715#define CATCH_REC_GET_END2() 0, CATCH_REC_END
716#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2
717#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1
718#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT
719#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0)
720#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next)
722#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ )
723#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ )
724#define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ )
726#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__ )
727#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__ )
728#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__ )
733#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
735#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0))
737#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param)
738#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__
739#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__
740#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF
741#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__)
742#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
743#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__
744#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param))
747#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__)
748#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__
749#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1)
752#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__
753#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name)
755#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__)
757#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
758#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>())
759#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))
761#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS_GEN(__VA_ARGS__)>()))
762#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)))
765#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\
766 CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__)
768#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0)
769#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1)
770#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2)
771#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)
772#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)
773#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)
774#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, _3, _4, _5, _6)
775#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)
776#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)
777#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)
778#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)
780#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
782#define INTERNAL_CATCH_TYPE_GEN\
783 template<typename...> struct TypeList {};\
784 template<typename...Ts>\
785 constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\
786 template<template<typename...> class...> struct TemplateTypeList{};\
787 template<template<typename...> class...Cs>\
788 constexpr auto get_wrapper() noexcept -> TemplateTypeList<Cs...> { return {}; }\
789 template<typename...>\
791 template<typename...>\
793 template<template<typename...> class, typename...>\
795 template<template<typename...> class, typename>\
798 template<typename T> \
799 struct append<T> { using type = T; };\
800 template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\
801 struct append<L1<E1...>, L2<E2...>, Rest...> { using type = typename append<L1<E1...,E2...>, Rest...>::type; };\
802 template< template<typename...> class L1, typename...E1, typename...Rest>\
803 struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> { using type = L1<E1...>; };\
805 template< template<typename...> class Container, template<typename...> class List, typename...elems>\
806 struct rewrap<TemplateTypeList<Container>, List<elems...>> { using type = TypeList<Container<elems...>>; };\
807 template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\
808 struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> { using type = typename append<TypeList<Container<Elems...>>, typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type; };\
810 template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\
811 struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type; };\
812 template<template <typename...> class Final, template <typename...> class List, typename...Ts>\
813 struct convert<Final, List<Ts...>> { using type = typename append<Final<>,TypeList<Ts>...>::type; };
815#define INTERNAL_CATCH_NTTP_1(signature, ...)\
816 template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\
817 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
818 constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \
819 template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...> struct NttpTemplateTypeList{};\
820 template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Cs>\
821 constexpr auto get_wrapper() noexcept -> NttpTemplateTypeList<Cs...> { return {}; } \
823 template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\
824 struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> { using type = TypeList<Container<__VA_ARGS__>>; };\
825 template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\
826 struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> { using type = typename append<TypeList<Container<__VA_ARGS__>>, typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type; };\
827 template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\
828 struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type; };
830#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName)
831#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\
832 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
833 static void TestName()
834#define INTERNAL_CATCH_DECLARE_SIG_TEST_X(TestName, signature, ...)\
835 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
836 static void TestName()
838#define INTERNAL_CATCH_DEFINE_SIG_TEST0(TestName)
839#define INTERNAL_CATCH_DEFINE_SIG_TEST1(TestName, signature)\
840 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
841 static void TestName()
842#define INTERNAL_CATCH_DEFINE_SIG_TEST_X(TestName, signature,...)\
843 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
844 static void TestName()
846#define INTERNAL_CATCH_NTTP_REGISTER0(TestFunc, signature)\
847 template<typename Type>\
848 void reg_test(TypeList<Type>, Catch::NameAndTags nameAndTags)\
850 Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<Type>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\
853#define INTERNAL_CATCH_NTTP_REGISTER(TestFunc, signature, ...)\
854 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
855 void reg_test(Nttp<__VA_ARGS__>, Catch::NameAndTags nameAndTags)\
857 Catch::AutoReg( Catch::makeTestInvoker(&TestFunc<__VA_ARGS__>), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), nameAndTags);\
860#define INTERNAL_CATCH_NTTP_REGISTER_METHOD0(TestName, signature, ...)\
861 template<typename Type>\
862 void reg_test(TypeList<Type>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\
864 Catch::AutoReg( Catch::makeTestInvoker(&TestName<Type>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\
867#define INTERNAL_CATCH_NTTP_REGISTER_METHOD(TestName, signature, ...)\
868 template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
869 void reg_test(Nttp<__VA_ARGS__>, Catch::StringRef className, Catch::NameAndTags nameAndTags)\
871 Catch::AutoReg( Catch::makeTestInvoker(&TestName<__VA_ARGS__>::test), CATCH_INTERNAL_LINEINFO, className, nameAndTags);\
874#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD0(TestName, ClassName)
875#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD1(TestName, ClassName, signature)\
876 template<typename TestType> \
877 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<TestType> { \
881#define INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD_X(TestName, ClassName, signature, ...)\
882 template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \
883 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName)<__VA_ARGS__> { \
887#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD0(TestName)
888#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD1(TestName, signature)\
889 template<typename TestType> \
890 void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<TestType>::test()
891#define INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD_X(TestName, signature, ...)\
892 template<INTERNAL_CATCH_REMOVE_PARENS(signature)> \
893 void INTERNAL_CATCH_MAKE_NAMESPACE(TestName)::TestName<__VA_ARGS__>::test()
895#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
896#define INTERNAL_CATCH_NTTP_0
897#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)
898#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__)
899#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__)
900#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__)
901#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__)
902#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__)
903#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__)
904#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__)
906#define INTERNAL_CATCH_NTTP_0(signature)
907#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__))
908#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__))
909#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__))
910#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__))
911#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__))
912#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__))
913#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__))
914#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__))
921#include <type_traits>
929 template <
typename Fun,
typename... Args>
931 template <
typename...>
932 std::false_type
static test(...);
935 template <
typename T>
938 template <
typename Fun,
typename... Args>
939 struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};
941#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
944 template <
typename Func,
typename... U>
948 template <
typename Func,
typename... U>
949 using FunctionReturnType =
typename std::remove_reference<
typename std::remove_cv<
typename std::result_of<Func(U...)>::type>::type>::type;
963 void (C::*m_testAsMethod)();
969 (obj.*m_testAsMethod)();
993#if defined(CATCH_CONFIG_DISABLE)
994 #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \
995 static void TestName()
996 #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \
998 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \
1002 void TestName::test()
1003 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION_2( TestName, TestFunc, Name, Tags, Signature, ... ) \
1004 INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature))
1005 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \
1007 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \
1008 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\
1011 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))
1013 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1014 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \
1015 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__ )
1017 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(Name, Tags, ...) \
1018 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__ ) )
1021 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1022 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \
1023 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__ )
1025 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(Name, Tags, Signature, ...) \
1026 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__ ) )
1029 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1030 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \
1031 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__ )
1033 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( ClassName, Name, Tags,... ) \
1034 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__ ) )
1037 #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1038 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \
1039 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__ )
1041 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG_NO_REGISTRATION( ClassName, Name, Tags, Signature, ... ) \
1042 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__ ) )
1047 #define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
1048 static void TestName(); \
1049 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1050 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1051 namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } \
1052 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
1053 static void TestName()
1054 #define INTERNAL_CATCH_TESTCASE( ... ) \
1055 INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), __VA_ARGS__ )
1058 #define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
1059 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1060 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1061 namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); }
\
1062 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
1065 #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\
1066 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1067 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1069 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \
1072 Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); \
1074 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
1075 void TestName::test()
1076 #define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \
1077 INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ), ClassName, __VA_ARGS__ )
1080 #define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
1081 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1082 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1083 Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); \
1084 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
1087 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\
1088 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1089 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1090 CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
1091 CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
1092 INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\
1094 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\
1095 INTERNAL_CATCH_TYPE_GEN\
1096 INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\
1097 INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\
1098 template<typename...Types> \
1102 constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\
1103 using expander = int[];\
1104 (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };
\
1107 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
1108 TestName<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\
1113 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
1114 INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))
1116#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1117 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \
1118 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__ )
1120 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \
1121 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__ ) )
1124#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1125 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \
1126 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__ )
1128 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG(Name, Tags, Signature, ...) \
1129 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__ ) )
1132 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \
1133 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1134 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1135 CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
1136 CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
1137 template<typename TestType> static void TestFuncName(); \
1139 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \
1140 INTERNAL_CATCH_TYPE_GEN \
1141 INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature)) \
1142 template<typename... Types> \
1144 void reg_tests() { \
1146 using expander = int[]; \
1147 constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\
1148 constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\
1149 constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\
1150 (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++)... };
\
1153 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
1154 using TestInit = typename create<TestName, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type; \
1161 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
1162 template<typename TestType> \
1163 static void TestFuncName()
1165#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1166 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\
1167 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__)
1169 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE(Name, Tags, ...)\
1170 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__ ) )
1173#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1174 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\
1175 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__)
1177 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG(Name, Tags, Signature, ...)\
1178 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__ ) )
1181 #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\
1182 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1183 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1184 CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
1185 template<typename TestType> static void TestFunc(); \
1187 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\
1188 INTERNAL_CATCH_TYPE_GEN\
1189 template<typename... Types> \
1191 void reg_tests() { \
1193 using expander = int[]; \
1194 (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++)... };
\
1197 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
1198 using TestInit = typename convert<TestName, TmplList>::type; \
1204 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
1205 template<typename TestType> \
1206 static void TestFunc()
1208 #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \
1209 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 )
1211 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \
1212 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1213 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1214 CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
1215 CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
1217 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \
1218 INTERNAL_CATCH_TYPE_GEN\
1219 INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\
1220 INTERNAL_CATCH_DECLARE_SIG_TEST_METHOD(TestName, ClassName, INTERNAL_CATCH_REMOVE_PARENS(Signature));\
1221 INTERNAL_CATCH_NTTP_REG_METHOD_GEN(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))\
1222 template<typename...Types> \
1223 struct TestNameClass{\
1226 constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\
1227 using expander = int[];\
1228 (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };
\
1231 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
1232 TestNameClass<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(__VA_ARGS__)>();\
1237 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
1238 INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))
1240#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1241 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \
1242 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__ )
1244 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \
1245 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__ ) )
1248#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1249 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \
1250 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__ )
1252 #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... ) \
1253 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__ ) )
1256 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\
1257 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1258 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1259 CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
1260 CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
1261 template<typename TestType> \
1262 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \
1266 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestNameClass) {\
1267 INTERNAL_CATCH_TYPE_GEN \
1268 INTERNAL_CATCH_NTTP_GEN(INTERNAL_CATCH_REMOVE_PARENS(Signature))\
1269 template<typename...Types>\
1270 struct TestNameClass{\
1273 using expander = int[];\
1274 constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\
1275 constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\
1276 constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\
1277 (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++)... };
\
1280 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
1281 using TestInit = typename create<TestNameClass, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;\
1288 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
1289 template<typename TestType> \
1290 void TestName<TestType>::test()
1292#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1293 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\
1294 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__ )
1296 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( ClassName, Name, Tags, ... )\
1297 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__ ) )
1300#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
1301 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\
1302 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__ )
1304 #define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( ClassName, Name, Tags, Signature, ... )\
1305 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__ ) )
1308 #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \
1309 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
1310 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
1311 CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
1312 template<typename TestType> \
1313 struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \
1317 namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \
1318 INTERNAL_CATCH_TYPE_GEN\
1319 template<typename...Types>\
1320 struct TestNameClass{\
1323 using expander = int[];\
1324 (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++)... };
\
1327 static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
1328 using TestInit = typename convert<TestNameClass, TmplList>::type;\
1334 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
1335 template<typename TestType> \
1336 void TestName<TestType>::test()
1338#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \
1339 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 )
1417#include <type_traits>
1441 std::size_t m_index;
1442 std::ostream* m_oss;
1449 template<typename T>
1454 auto get() -> std::ostream& {
return *m_oss; }
1481 template<
typename E>
1483 static_assert(
sizeof(int) >=
sizeof(E),
"Cannot serialize enum to int");
1484 std::vector<int> intValues;
1485 intValues.reserve(
values.size() );
1486 for(
auto enumValue :
values )
1487 intValues.push_back(
static_cast<int>( enumValue ) );
1496#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
1497#include <string_view>
1503#import <Foundation/Foundation.h>
1506#define CATCH_ARC_ENABLED __has_feature(objc_arc)
1508#define CATCH_ARC_ENABLED 0
1511void arcSafeRelease( NSObject* obj );
1512id performOptionalSelector(
id obj,
SEL sel );
1514#if !CATCH_ARC_ENABLED
1515inline void arcSafeRelease( NSObject* obj ) {
1518inline id performOptionalSelector(
id obj,
SEL sel ) {
1519 if( [obj respondsToSelector: sel] )
1520 return [obj performSelector: sel];
1523#define CATCH_UNSAFE_UNRETAINED
1524#define CATCH_ARC_STRONG
1526inline void arcSafeRelease( NSObject* ){}
1527inline id performOptionalSelector(
id obj,
SEL sel ) {
1529#pragma clang diagnostic push
1530#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
1532 if( [obj respondsToSelector: sel] )
1533 return [obj performSelector: sel];
1535#pragma clang diagnostic pop
1539#define CATCH_UNSAFE_UNRETAINED __unsafe_unretained
1540#define CATCH_ARC_STRONG __strong
1547#pragma warning(push)
1548#pragma warning(disable:4180)
1558 template<
typename T>
1563 template<
typename T>
1565 template<
typename Stream,
typename U>
1566 static auto test(
int)
1567 ->
decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());
1569 template<
typename,
typename>
1570 static auto test(...)->std::false_type;
1573 static const bool value =
decltype(test<std::ostream, const T&>(0))
::value;
1576 template<
typename E>
1579 template<
typename T>
1580 typename std::enable_if<
1585 template<
typename T>
1586 typename std::enable_if<
1592 template<
typename T>
1593 typename std::enable_if<
1599#if defined(_MANAGED)
1601 template<
typename T>
1602 std::string clrReferenceToString( T^ ref ) {
1604 return std::string(
"null");
1605 auto bytes = System::Text::Encoding::UTF8->GetBytes(ref->ToString());
1606 cli::pin_ptr<System::Byte> p = &bytes[0];
1607 return std::string(
reinterpret_cast<char const *
>(p), bytes->Length);
1614 template <
typename T,
typename =
void>
1616 template <
typename Fake = T>
1623 rss.operator<<(
value);
1627 template <
typename Fake = T>
1631#if !defined(CATCH_CONFIG_FALLBACK_STRINGIFIER)
1634 return CATCH_CONFIG_FALLBACK_STRINGIFIER(
value);
1643 template <
typename T>
1645 return ::Catch::StringMaker<typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(
e);
1648 template<
typename E>
1653#if defined(_MANAGED)
1654 template <
typename T>
1656 return ::Catch::StringMaker<T^>::convert(
e);
1666 static std::string
convert(
const std::string& str);
1669#ifdef CATCH_CONFIG_CPP17_STRING_VIEW
1672 static std::string
convert(std::string_view str);
1685#ifdef CATCH_CONFIG_WCHAR
1688 static std::string
convert(
const std::wstring& wstr);
1691# ifdef CATCH_CONFIG_CPP17_STRING_VIEW
1694 static std::string
convert(std::wstring_view str);
1718 static std::string
convert(
signed char const* str) {
1724 static std::string
convert(
unsigned char const* str) {
1729#if defined(CATCH_CONFIG_CPP17_BYTE)
1731 struct StringMaker<
std::byte> {
1795 template <
typename T>
1797 template <
typename U>
1807 template <
typename R,
typename C>
1818#if defined(_MANAGED)
1819 template <
typename T>
1820 struct StringMaker<T^> {
1821 static std::string convert( T^ ref ) {
1822 return ::Catch::Detail::clrReferenceToString(ref);
1828 template<
typename InputIterator,
typename Sentinel = InputIterator>
1832 if (first != last) {
1834 for (++first; first != last; ++first)
1844 struct StringMaker<NSString*> {
1845 static std::string convert(NSString * nsstring) {
1848 return std::string(
"@") + [nsstring UTF8String];
1852 struct StringMaker<NSObject*> {
1853 static std::string convert(NSObject* nsObject) {
1859 inline std::string
stringify( NSString* nsstring ) {
1872#if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS)
1873# define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER
1874# define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER
1875# define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
1876# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER
1877# define CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER
1881#if defined(CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER)
1884 template<
typename T1,
typename T2>
1885 struct StringMaker<
std::pair<T1, T2> > {
1886 static std::string
convert(
const std::pair<T1, T2>& pair) {
1887 ReusableStringStream rss;
1899#if defined(CATCH_CONFIG_ENABLE_OPTIONAL_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_OPTIONAL)
1902 template<
typename T>
1903 struct StringMaker<
std::optional<T> > {
1904 static std::string
convert(
const std::optional<T>& optional) {
1905 ReusableStringStream rss;
1906 if (optional.has_value()) {
1918#if defined(CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER)
1927 struct TupleElementPrinter {
1928 static void print(
const Tuple& tuple, std::ostream& os) {
1929 os << (N ?
", " :
" ")
1931 TupleElementPrinter<Tuple, N + 1>::print(tuple, os);
1939 struct TupleElementPrinter<Tuple, N, false> {
1940 static void print(
const Tuple&, std::ostream&) {}
1945 template<
typename ...Types>
1946 struct StringMaker<
std::tuple<Types...>> {
1947 static std::string
convert(
const std::tuple<Types...>& tuple) {
1948 ReusableStringStream rss;
1950 Detail::TupleElementPrinter<std::tuple<Types...>>
::print(tuple, rss.get());
1958#if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT)
1962 struct StringMaker<
std::monostate> {
1963 static std::string
convert(
const std::monostate&) {
1968 template<
typename... Elements>
1969 struct StringMaker<
std::variant<Elements...>> {
1970 static std::string
convert(
const std::variant<Elements...>& variant) {
1971 if (variant.valueless_by_exception()) {
1972 return "{valueless variant}";
1975 [](
const auto&
value) {
1992 template <
typename...>
1997 template <
typename T,
typename =
void>
2001 template <
typename T>
2006 template <
typename T>
2010#if defined(_MANAGED)
2011 template <
typename T>
2013 static const bool value =
false;
2017 template<
typename Range>
2023 template<
typename Allocator>
2039 template<
typename R>
2040 struct StringMaker<R, typename
std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> {
2046 template <
typename T,
int SZ>
2056#if defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER)
2063template <
class Ratio>
2064struct ratio_string {
2065 static std::string symbol();
2068template <
class Ratio>
2069std::string ratio_string<Ratio>::symbol() {
2071 rss <<
'[' << Ratio::num <<
'/'
2072 << Ratio::den <<
']';
2076struct ratio_string<
std::atto> {
2077 static std::string symbol();
2080struct ratio_string<
std::femto> {
2081 static std::string symbol();
2084struct ratio_string<
std::pico> {
2085 static std::string symbol();
2088struct ratio_string<
std::nano> {
2089 static std::string symbol();
2092struct ratio_string<
std::micro> {
2093 static std::string symbol();
2096struct ratio_string<
std::milli> {
2097 static std::string symbol();
2102 template<
typename Value,
typename Ratio>
2103 struct StringMaker<
std::chrono::duration<Value, Ratio>> {
2104 static std::string
convert(std::chrono::duration<Value, Ratio>
const& duration) {
2105 ReusableStringStream rss;
2106 rss << duration.count() <<
' ' << ratio_string<Ratio>::symbol() <<
's';
2110 template<
typename Value>
2111 struct StringMaker<
std::chrono::duration<Value, std::ratio<1>>> {
2112 static std::string
convert(std::chrono::duration<Value, std::ratio<1>>
const& duration) {
2113 ReusableStringStream rss;
2114 rss << duration.count() <<
" s";
2118 template<
typename Value>
2119 struct StringMaker<
std::chrono::duration<Value, std::ratio<60>>> {
2120 static std::string
convert(std::chrono::duration<Value, std::ratio<60>>
const& duration) {
2121 ReusableStringStream rss;
2122 rss << duration.count() <<
" m";
2126 template<
typename Value>
2127 struct StringMaker<
std::chrono::duration<Value, std::ratio<3600>>> {
2128 static std::string
convert(std::chrono::duration<Value, std::ratio<3600>>
const& duration) {
2129 ReusableStringStream rss;
2130 rss << duration.count() <<
" h";
2138 template<
typename Clock,
typename Duration>
2139 struct StringMaker<
std::chrono::time_point<Clock, Duration>> {
2140 static std::string
convert(std::chrono::time_point<Clock, Duration>
const& time_point) {
2145 template<
typename Duration>
2146 struct StringMaker<
std::chrono::time_point<std::chrono::system_clock, Duration>> {
2147 static std::string
convert(std::chrono::time_point<std::chrono::system_clock, Duration>
const& time_point) {
2148 auto converted = std::chrono::system_clock::to_time_t(time_point);
2151 std::tm timeInfo = {};
2152 gmtime_s(&timeInfo, &converted);
2154 std::tm* timeInfo = std::gmtime(&converted);
2157 auto const timeStampSize =
sizeof(
"2017-01-16T17:06:45Z");
2158 char timeStamp[timeStampSize];
2159 const char *
const fmt =
"%Y-%m-%dT%H:%M:%SZ";
2162 std::strftime(timeStamp, timeStampSize, fmt, &timeInfo);
2164 std::strftime(timeStamp, timeStampSize, fmt, timeInfo);
2166 return std::string(timeStamp);
2172#define INTERNAL_CATCH_REGISTER_ENUM( enumName, ... ) \
2174 template<> struct StringMaker<enumName> { \
2175 static std::string convert( enumName value ) { \
2176 static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \
2177 return static_cast<std::string>(enumInfo.lookup( static_cast<int>( value ) )); \
2182#define CATCH_REGISTER_ENUM( enumName, ... ) INTERNAL_CATCH_REGISTER_ENUM( enumName, __VA_ARGS__ )
2192#pragma warning(push)
2193#pragma warning(disable:4389)
2194#pragma warning(disable:4018)
2195#pragma warning(disable:4312)
2196#pragma warning(disable:4180)
2197#pragma warning(disable:4800)
2223 template<
typename LhsT,
typename RhsT>
2229 void streamReconstructedExpression( std::ostream &os )
const override {
2242 template<
typename T>
2245 "chained comparisons are not supported inside assertions, "
2246 "wrap the expression inside parentheses, or decompose it");
2249 template<
typename T>
2252 "chained comparisons are not supported inside assertions, "
2253 "wrap the expression inside parentheses, or decompose it");
2256 template<
typename T>
2259 "chained comparisons are not supported inside assertions, "
2260 "wrap the expression inside parentheses, or decompose it");
2263 template<
typename T>
2266 "chained comparisons are not supported inside assertions, "
2267 "wrap the expression inside parentheses, or decompose it");
2270 template<
typename T>
2273 "chained comparisons are not supported inside assertions, "
2274 "wrap the expression inside parentheses, or decompose it");
2277 template<
typename T>
2280 "chained comparisons are not supported inside assertions, "
2281 "wrap the expression inside parentheses, or decompose it");
2284 template<
typename T>
2287 "chained comparisons are not supported inside assertions, "
2288 "wrap the expression inside parentheses, or decompose it");
2291 template<
typename T>
2294 "chained comparisons are not supported inside assertions, "
2295 "wrap the expression inside parentheses, or decompose it");
2299 template<
typename LhsT>
2303 void streamReconstructedExpression( std::ostream &os )
const override {
2315 template<
typename LhsT,
typename RhsT>
2316 auto compareEqual( LhsT
const& lhs, RhsT
const& rhs ) ->
bool {
return static_cast<bool>(lhs == rhs); }
2317 template<
typename T>
2318 auto compareEqual( T*
const& lhs,
int rhs ) ->
bool {
return lhs ==
reinterpret_cast<void const*
>( rhs ); }
2319 template<
typename T>
2320 auto compareEqual( T*
const& lhs,
long rhs ) ->
bool {
return lhs ==
reinterpret_cast<void const*
>( rhs ); }
2321 template<
typename T>
2322 auto compareEqual(
int lhs, T*
const& rhs ) ->
bool {
return reinterpret_cast<void const*
>( lhs ) == rhs; }
2323 template<
typename T>
2324 auto compareEqual(
long lhs, T*
const& rhs ) ->
bool {
return reinterpret_cast<void const*
>( lhs ) == rhs; }
2326 template<
typename LhsT,
typename RhsT>
2327 auto compareNotEqual( LhsT
const& lhs, RhsT&& rhs ) ->
bool {
return static_cast<bool>(lhs != rhs); }
2328 template<
typename T>
2329 auto compareNotEqual( T*
const& lhs,
int rhs ) ->
bool {
return lhs !=
reinterpret_cast<void const*
>( rhs ); }
2330 template<
typename T>
2331 auto compareNotEqual( T*
const& lhs,
long rhs ) ->
bool {
return lhs !=
reinterpret_cast<void const*
>( rhs ); }
2332 template<
typename T>
2333 auto compareNotEqual(
int lhs, T*
const& rhs ) ->
bool {
return reinterpret_cast<void const*
>( lhs ) != rhs; }
2334 template<
typename T>
2335 auto compareNotEqual(
long lhs, T*
const& rhs ) ->
bool {
return reinterpret_cast<void const*
>( lhs ) != rhs; }
2337 template<
typename LhsT>
2343 template<
typename RhsT>
2345 return {
compareEqual( m_lhs, rhs ), m_lhs,
"==", rhs };
2348 return { m_lhs == rhs, m_lhs,
"==", rhs };
2351 template<
typename RhsT>
2356 return { m_lhs != rhs, m_lhs,
"!=", rhs };
2359 template<
typename RhsT>
2361 return {
static_cast<bool>(m_lhs > rhs), m_lhs,
">", rhs };
2363 template<
typename RhsT>
2365 return {
static_cast<bool>(m_lhs < rhs), m_lhs,
"<", rhs };
2367 template<
typename RhsT>
2369 return {
static_cast<bool>(m_lhs >= rhs), m_lhs,
">=", rhs };
2371 template<
typename RhsT>
2373 return {
static_cast<bool>(m_lhs <= rhs), m_lhs,
"<=", rhs };
2375 template <
typename RhsT>
2377 return {
static_cast<bool>(m_lhs | rhs), m_lhs,
"|", rhs };
2379 template <
typename RhsT>
2381 return {
static_cast<bool>(m_lhs & rhs), m_lhs,
"&", rhs };
2383 template <
typename RhsT>
2385 return {
static_cast<bool>(m_lhs ^ rhs), m_lhs,
"^", rhs };
2388 template<
typename RhsT>
2391 "operator&& is not supported inside assertions, "
2392 "wrap the expression inside parentheses, or decompose it");
2395 template<
typename RhsT>
2398 "operator|| is not supported inside assertions, "
2399 "wrap the expression inside parentheses, or decompose it");
2409 template<
typename T>
2415 template<
typename T>
2439 class AssertionResult;
2440 struct AssertionInfo;
2442 struct SectionEndInfo;
2444 struct MessageBuilder;
2446 struct AssertionReaction;
2447 struct SourceLineInfo;
2449 struct ITransientExpression;
2450 struct IGeneratorTracker;
2452#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
2453 struct BenchmarkInfo;
2454 template <
typename Duration = std::chrono::duration<
double, std::nano>>
2455 struct BenchmarkStats;
2463 Counts& assertions ) = 0;
2469#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
2470 virtual void benchmarkPreparing( std::string
const& name ) = 0;
2471 virtual void benchmarkStarting( BenchmarkInfo
const& info ) = 0;
2472 virtual void benchmarkEnded( BenchmarkStats<>
const& stats ) = 0;
2473 virtual void benchmarkFailed( std::string
const& error ) = 0;
2497 std::string
const& message,
2522 struct AssertionResultData;
2538 explicit operator bool()
const;
2551 bool m_completed =
false;
2561 if ( !m_completed ) {
2566 template<
typename T>
2613 static unsigned int globalCount;
2618 template<
typename T>
2632 template<
typename T>
2653 std::vector<MessageInfo> m_messages;
2655 size_t m_captured = 0;
2662 template<
typename T>
2667 template<
typename T,
typename... Ts>
2670 captureValues( index+1,
values... );
2677#if !defined(CATCH_CONFIG_DISABLE)
2679#if !defined(CATCH_CONFIG_DISABLE_STRINGIFICATION)
2680 #define CATCH_INTERNAL_STRINGIFY(...) #__VA_ARGS__
2682 #define CATCH_INTERNAL_STRINGIFY(...) "Disabled by CATCH_CONFIG_DISABLE_STRINGIFICATION"
2685#if defined(CATCH_CONFIG_FAST_COMPILE) || defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
2690#define INTERNAL_CATCH_TRY
2691#define INTERNAL_CATCH_CATCH( capturer )
2695#define INTERNAL_CATCH_TRY try
2696#define INTERNAL_CATCH_CATCH( handler ) catch(...) { handler.handleUnexpectedInflightException(); }
2700#define INTERNAL_CATCH_REACT( handler ) handler.complete();
2703#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
2705 CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__); \
2706 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \
2707 INTERNAL_CATCH_TRY { \
2708 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
2709 CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
2710 catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \
2711 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
2712 } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
2713 INTERNAL_CATCH_REACT( catchAssertionHandler ) \
2714 } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) )
2717#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \
2718 INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \
2719 if( Catch::getResultCapture().lastAssertionPassed() )
2722#define INTERNAL_CATCH_ELSE( macroName, resultDisposition, ... ) \
2723 INTERNAL_CATCH_TEST( macroName, resultDisposition, __VA_ARGS__ ); \
2724 if( !Catch::getResultCapture().lastAssertionPassed() )
2727#define INTERNAL_CATCH_NO_THROW( macroName, resultDisposition, ... ) \
2729 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \
2731 static_cast<void>(__VA_ARGS__); \
2732 catchAssertionHandler.handleExceptionNotThrownAsExpected(); \
2735 catchAssertionHandler.handleUnexpectedInflightException(); \
2737 INTERNAL_CATCH_REACT( catchAssertionHandler ) \
2741#define INTERNAL_CATCH_THROWS( macroName, resultDisposition, ... ) \
2743 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition); \
2744 if( catchAssertionHandler.allowThrows() ) \
2746 static_cast<void>(__VA_ARGS__); \
2747 catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
2750 catchAssertionHandler.handleExceptionThrownAsExpected(); \
2753 catchAssertionHandler.handleThrowingCallSkipped(); \
2754 INTERNAL_CATCH_REACT( catchAssertionHandler ) \
2758#define INTERNAL_CATCH_THROWS_AS( macroName, exceptionType, resultDisposition, expr ) \
2760 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(expr) ", " CATCH_INTERNAL_STRINGIFY(exceptionType), resultDisposition ); \
2761 if( catchAssertionHandler.allowThrows() ) \
2763 static_cast<void>(expr); \
2764 catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
2766 catch( exceptionType const& ) { \
2767 catchAssertionHandler.handleExceptionThrownAsExpected(); \
2770 catchAssertionHandler.handleUnexpectedInflightException(); \
2773 catchAssertionHandler.handleThrowingCallSkipped(); \
2774 INTERNAL_CATCH_REACT( catchAssertionHandler ) \
2778#define INTERNAL_CATCH_MSG( macroName, messageType, resultDisposition, ... ) \
2780 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::StringRef(), resultDisposition ); \
2781 catchAssertionHandler.handleMessage( messageType, ( Catch::MessageStream() << __VA_ARGS__ + ::Catch::StreamEndStop() ).m_stream.str() ); \
2782 INTERNAL_CATCH_REACT( catchAssertionHandler ) \
2786#define INTERNAL_CATCH_CAPTURE( varName, macroName, ... ) \
2787 auto varName = Catch::Capturer( macroName, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info, #__VA_ARGS__ ); \
2788 varName.captureValues( 0, __VA_ARGS__ )
2791#define INTERNAL_CATCH_INFO( macroName, log ) \
2792 Catch::ScopedMessage INTERNAL_CATCH_UNIQUE_NAME( scopedMessage )( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log );
2795#define INTERNAL_CATCH_UNSCOPED_INFO( macroName, log ) \
2796 Catch::getResultCapture().emplaceUnscopedMessage( Catch::MessageBuilder( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, Catch::ResultWas::Info ) << log )
2800#define INTERNAL_CATCH_THROWS_STR_MATCHES( macroName, resultDisposition, matcher, ... ) \
2802 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
2803 if( catchAssertionHandler.allowThrows() ) \
2805 static_cast<void>(__VA_ARGS__); \
2806 catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
2809 Catch::handleExceptionMatchExpr( catchAssertionHandler, matcher, #matcher##_catch_sr ); \
2812 catchAssertionHandler.handleThrowingCallSkipped(); \
2813 INTERNAL_CATCH_REACT( catchAssertionHandler ) \
2837 std::size_t passed = 0;
2838 std::size_t failed = 0;
2839 std::size_t failedButOk = 0;
2863 std::string
const& _name );
2868 std::string
const& _name,
2869 std::string
const& ) :
SectionInfo( _lineInfo, _name ) {}
2895 uint64_t m_nanoseconds = 0;
2899 auto getElapsedMicroseconds() const -> uint64_t;
2900 auto getElapsedMilliseconds() const ->
unsigned int;
2901 auto getElapsedSeconds() const ->
double;
2917 explicit operator bool()
const;
2924 bool m_sectionIncluded;
2930#define INTERNAL_CATCH_SECTION( ... ) \
2931 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
2932 CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
2933 if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \
2934 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
2936#define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \
2937 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
2938 CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
2939 if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \
2940 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
2953 struct ITestCaseRegistry;
2954 struct IExceptionTranslatorRegistry;
2955 struct IExceptionTranslator;
2956 struct IReporterRegistry;
2957 struct IReporterFactory;
2958 struct ITagAliasRegistry;
2959 struct IMutableEnumValuesRegistry;
2961 class StartupExceptionRegistry;
2995#if defined(CATCH_CONFIG_DISABLE)
2996 #define INTERNAL_CATCH_TRANSLATE_EXCEPTION_NO_REG( translatorName, signature) \
2997 static std::string translatorName( signature )
3012 virtual std::string
translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd )
const = 0;
3022 template<
typename T>
3026 ExceptionTranslator( std::string(*translateFunction)( T& ) )
3027 : m_translateFunction( translateFunction )
3030 std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd )
const override {
3031#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
3036 std::rethrow_exception(std::current_exception());
3038 return (*it)->translate( it+1, itEnd );
3041 return m_translateFunction( ex );
3047 std::string(*m_translateFunction)( T& );
3051 template<
typename T>
3054 (
new ExceptionTranslator<T>( translateFunction ) );
3060#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \
3061 static std::string translatorName( signature ); \
3062 CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
3063 CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
3064 namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \
3065 CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
3066 static std::string translatorName( signature )
3068#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
3073#include <type_traits>
3080 bool equalityComparisonImpl(
double other)
const;
3083 void setMargin(
double margin);
3086 void setEpsilon(
double epsilon);
3098 approx.m_epsilon = m_epsilon;
3099 approx.m_margin = m_margin;
3100 approx.m_scale = m_scale;
3109 friend bool operator == (
const T& lhs,
Approx const& rhs ) {
3110 auto lhs_v =
static_cast<double>(lhs);
3111 return rhs.equalityComparisonImpl(lhs_v);
3115 friend bool operator == (
Approx const& lhs,
const T& rhs ) {
3116 return operator==( rhs, lhs );
3120 friend bool operator != ( T
const& lhs,
Approx const& rhs ) {
3121 return !operator==( lhs, rhs );
3125 friend bool operator != (
Approx const& lhs, T
const& rhs ) {
3126 return !operator==( rhs, lhs );
3130 friend bool operator <= ( T
const& lhs,
Approx const& rhs ) {
3131 return static_cast<double>(lhs) < rhs.m_value || lhs == rhs;
3135 friend bool operator <= (
Approx const& lhs, T
const& rhs ) {
3136 return lhs.m_value <
static_cast<double>(rhs) || lhs == rhs;
3140 friend bool operator >= ( T
const& lhs,
Approx const& rhs ) {
3141 return static_cast<double>(lhs) > rhs.m_value || lhs == rhs;
3145 friend bool operator >= (
Approx const& lhs, T
const& rhs ) {
3146 return lhs.m_value >
static_cast<double>(rhs) || lhs == rhs;
3151 double epsilonAsDouble =
static_cast<double>(newEpsilon);
3152 setEpsilon(epsilonAsDouble);
3158 double marginAsDouble =
static_cast<double>(newMargin);
3159 setMargin(marginAsDouble);
3165 m_scale =
static_cast<double>(newScale);
3200 bool startsWith( std::string
const& s, std::string
const& prefix );
3202 bool endsWith( std::string
const& s, std::string
const& suffix );
3204 bool contains( std::string
const& s, std::string
const& infix );
3208 std::string
trim( std::string
const& str );
3214 bool replaceInPlace( std::string& str, std::string
const& replaceThis, std::string
const& withThis );
3227#ifndef CATCH_CONFIG_DISABLE_MATCHERS
3257# pragma clang diagnostic push
3258# pragma clang diagnostic ignored "-Wnon-virtual-dtor"
3261 template<
typename ObjectT>
3263 virtual bool match( ObjectT
const& arg )
const = 0;
3266#if defined(__OBJC__)
3271 virtual bool match( NSString* arg )
const = 0;
3276# pragma clang diagnostic pop
3279 template<
typename T>
3287 template<
typename ArgT>
3289 bool match( ArgT
const& arg )
const override {
3290 for(
auto matcher : m_matchers ) {
3291 if (!matcher->match(arg))
3297 std::string description;
3298 description.reserve( 4 + m_matchers.size()*32 );
3299 description +=
"( ";
3301 for(
auto matcher : m_matchers ) {
3305 description +=
" and ";
3306 description += matcher->toString();
3308 description +=
" )";
3314 copy.m_matchers.push_back( &other );
3320 template<
typename ArgT>
3323 bool match( ArgT
const& arg )
const override {
3324 for(
auto matcher : m_matchers ) {
3325 if (matcher->match(arg))
3331 std::string description;
3332 description.reserve( 4 + m_matchers.size()*32 );
3333 description +=
"( ";
3335 for(
auto matcher : m_matchers ) {
3339 description +=
" or ";
3340 description += matcher->toString();
3342 description +=
" )";
3348 copy.m_matchers.push_back( &other );
3355 template<
typename ArgT>
3360 bool match( ArgT
const& arg )
const override {
3361 return !m_underlyingMatcher.match( arg );
3365 return "not " + m_underlyingMatcher.toString();
3370 template<
typename T>
3374 template<
typename T>
3378 template<
typename T>
3387using namespace Matchers;
3397namespace Exception {
3400 std::string m_message;
3407 bool match(std::exception
const& ex)
const override;
3425 namespace Floating {
3427 enum class FloatingPointKind : uint8_t;
3431 bool match(
double const& matchee)
const override;
3440 bool match(
double const& matchee)
const override;
3445 FloatingPointKind m_type;
3456 bool match(
double const& matchee)
const override;
3483#include <functional>
3494template <
typename T>
3496 std::function<bool(T
const&)> m_predicate;
3497 std::string m_description;
3501 :m_predicate(
std::move(elem)),
3505 bool match( T
const& item )
const override {
3506 return m_predicate(item);
3510 return m_description;
3520 template<
typename T>
3536 namespace StdString {
3558 bool match( std::string
const& source )
const override;
3562 bool match( std::string
const& source )
const override;
3566 bool match( std::string
const& source )
const override;
3570 bool match( std::string
const& source )
const override;
3575 bool match( std::string
const& matchee )
const override;
3579 std::string m_regex;
3606 template<
typename T,
typename Alloc>
3611 bool match(std::vector<T, Alloc>
const &v)
const override {
3612 for (
auto const& el : v) {
3613 if (el == m_comparator) {
3627 template<
typename T,
typename AllocComp,
typename AllocMatch>
3630 ContainsMatcher(std::vector<T, AllocComp>
const &comparator) : m_comparator( comparator ) {}
3632 bool match(std::vector<T, AllocMatch>
const &v)
const override {
3634 if (m_comparator.size() > v.size())
3636 for (
auto const& comparator : m_comparator) {
3637 auto present =
false;
3638 for (
const auto& el : v) {
3639 if (el == comparator) {
3657 template<
typename T,
typename AllocComp,
typename AllocMatch>
3660 EqualsMatcher(std::vector<T, AllocComp>
const &comparator) : m_comparator( comparator ) {}
3662 bool match(std::vector<T, AllocMatch>
const &v)
const override {
3667 if (m_comparator.size() != v.size())
3669 for (std::size_t i = 0; i < v.size(); ++i)
3670 if (m_comparator[i] != v[i])
3680 template<
typename T,
typename AllocComp,
typename AllocMatch>
3683 ApproxMatcher(std::vector<T, AllocComp>
const& comparator) : m_comparator( comparator ) {}
3685 bool match(std::vector<T, AllocMatch>
const &v)
const override {
3686 if (m_comparator.size() != v.size())
3688 for (std::size_t i = 0; i < v.size(); ++i)
3689 if (m_comparator[i] != approx(v[i]))
3703 approx.
margin(newMargin);
3708 approx.
scale(newScale);
3716 template<
typename T,
typename AllocComp,
typename AllocMatch>
3719 bool match(std::vector<T, AllocMatch>
const& vec)
const override {
3720 if (m_target.size() != vec.size()) {
3723 return std::is_permutation(m_target.begin(), m_target.end(), vec.begin());
3730 std::vector<T, AllocComp>
const& m_target;
3738 template<
typename T,
typename AllocComp = std::allocator<T>,
typename AllocMatch = AllocComp>
3743 template<
typename T,
typename Alloc = std::allocator<T>>
3748 template<
typename T,
typename AllocComp = std::allocator<T>,
typename AllocMatch = AllocComp>
3753 template<
typename T,
typename AllocComp = std::allocator<T>,
typename AllocMatch = AllocComp>
3758 template<
typename T,
typename AllocComp = std::allocator<T>,
typename AllocMatch = AllocComp>
3769 template<
typename ArgT,
typename MatcherT>
3778 m_matcher( matcher ),
3779 m_matcherString( matcherString )
3783 auto matcherAsString = m_matcher.toString();
3786 os << m_matcherString;
3788 os << matcherAsString;
3796 template<
typename ArgT,
typename MatcherT>
3804#define INTERNAL_CHECK_THAT( macroName, matcher, resultDisposition, arg ) \
3806 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(arg) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
3807 INTERNAL_CATCH_TRY { \
3808 catchAssertionHandler.handleExpr( Catch::makeMatchExpr( arg, matcher, #matcher##_catch_sr ) ); \
3809 } INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
3810 INTERNAL_CATCH_REACT( catchAssertionHandler ) \
3814#define INTERNAL_CATCH_THROWS_MATCHES( macroName, exceptionType, resultDisposition, matcher, ... ) \
3816 Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__) ", " CATCH_INTERNAL_STRINGIFY(exceptionType) ", " CATCH_INTERNAL_STRINGIFY(matcher), resultDisposition ); \
3817 if( catchAssertionHandler.allowThrows() ) \
3819 static_cast<void>(__VA_ARGS__ ); \
3820 catchAssertionHandler.handleUnexpectedExceptionNotThrown(); \
3822 catch( exceptionType const& ex ) { \
3823 catchAssertionHandler.handleExpr( Catch::makeMatchExpr( ex, matcher, #matcher##_catch_sr ) ); \
3826 catchAssertionHandler.handleUnexpectedInflightException(); \
3829 catchAssertionHandler.handleThrowingCallSkipped(); \
3830 INTERNAL_CATCH_REACT( catchAssertionHandler ) \
3874#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
3875 template <
typename Ex>
3894#define CATCH_MAKE_MSG(...) \
3895 (Catch::ReusableStringStream() << __VA_ARGS__).str()
3897#define CATCH_INTERNAL_ERROR(...) \
3898 Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__))
3900#define CATCH_ERROR(...) \
3901 Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ ))
3903#define CATCH_RUNTIME_ERROR(...) \
3904 Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ ))
3906#define CATCH_ENFORCE( condition, ... ) \
3907 do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false)
3920 const char*
const m_msg =
"";
3927 const char*
what() const noexcept override final;
3930namespace Generators {
3934 template<
typename T,
typename... Args>
3936 return std::unique_ptr<T>(
new T(std::forward<Args>(args)...));
3940 template<
typename T>
3948 virtual T
const&
get()
const = 0;
3952 template<
typename T>
3958 T
const&
get()
const override {
3966 template<
typename T>
3969 "FixedValuesGenerator does not support bools because of std::vector<bool>"
3970 "specialization, use SingleValue Generator instead.");
3971 std::vector<T> m_values;
3976 T
const&
get()
const override {
3977 return m_values[m_idx];
3981 return m_idx < m_values.size();
3985 template <
typename T>
3987 std::unique_ptr<IGenerator<T>> m_generator;
3990 m_generator(
std::move(generator))
3993 return m_generator->get();
3996 return m_generator->next();
4000 template <
typename T>
4004 template <
typename T>
4009 template<
typename T>
4011 std::vector<GeneratorWrapper<T>> m_generators;
4012 size_t m_current = 0;
4015 m_generators.emplace_back(std::move(generator));
4017 void populate(T&& val) {
4018 m_generators.emplace_back(
value(std::forward<T>(val)));
4020 template<
typename U>
4021 void populate(U&& val) {
4022 populate(T(std::forward<U>(val)));
4024 template<
typename U,
typename... Gs>
4025 void populate(U&& valueOrGenerator, Gs &&... moreGenerators) {
4026 populate(std::forward<U>(valueOrGenerator));
4027 populate(std::forward<Gs>(moreGenerators)...);
4031 template <
typename... Gs>
4033 m_generators.reserve(
sizeof...(Gs));
4034 populate(std::forward<Gs>(moreGenerators)...);
4037 T
const&
get()
const override {
4038 return m_generators[m_current].get();
4042 if (m_current >= m_generators.size()) {
4045 const bool current_status = m_generators[m_current].next();
4046 if (!current_status) {
4049 return m_current < m_generators.size();
4053 template<
typename... Ts>
4054 GeneratorWrapper<std::tuple<Ts...>>
table( std::initializer_list<std::tuple<
typename std::decay<Ts>::type...>> tuples ) {
4055 return values<std::tuple<Ts...>>( tuples );
4059 template <
typename T>
4062 template<
typename T,
typename... Gs>
4064 return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...);
4066 template<
typename T>
4070 template<
typename T,
typename... Gs>
4072 return makeGenerators(
value( std::forward<T>( val ) ), std::forward<Gs>( moreGenerators )... );
4074 template<
typename T,
typename U,
typename... Gs>
4076 return makeGenerators(
value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... );
4081 template<
typename L>
4085 auto generate(
StringRef generatorName,
SourceLineInfo const& lineInfo, L
const& generatorExpression ) ->
decltype(std::declval<decltype(generatorExpression())>().get()) {
4086 using UnderlyingType =
typename decltype(generatorExpression())::type;
4094 return generator.
get();
4100#define GENERATE( ... ) \
4101 Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
4102 CATCH_INTERNAL_LINEINFO, \
4103 [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
4104#define GENERATE_COPY( ... ) \
4105 Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
4106 CATCH_INTERNAL_LINEINFO, \
4107 [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
4108#define GENERATE_REF( ... ) \
4109 Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
4110 CATCH_INTERNAL_LINEINFO, \
4111 [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
4117namespace Generators {
4119 template <
typename T>
4122 size_t m_returned = 0;
4126 m_generator(
std::move(generator)),
4129 assert(target != 0 &&
"Empty generators are not allowed");
4131 T
const&
get()
const override {
4132 return m_generator.
get();
4136 if (m_returned >= m_target) {
4140 const auto success = m_generator.
next();
4144 m_returned = m_target;
4150 template <
typename T>
4155 template <
typename T,
typename Predicate>
4160 template <
typename P = Predicate>
4162 m_generator(
std::move(generator)),
4163 m_predicate(
std::forward<P>(pred))
4165 if (!m_predicate(m_generator.
get())) {
4168 auto has_initial_value = nextImpl();
4169 if (!has_initial_value) {
4175 T
const&
get()
const override {
4176 return m_generator.
get();
4185 bool success = m_generator.
next();
4189 while (!m_predicate(m_generator.
get()) && (success = m_generator.
next()) ==
true);
4194 template <
typename T,
typename Predicate>
4199 template <
typename T>
4202 "RepeatGenerator currently does not support bools"
4203 "because of std::vector<bool> specialization");
4205 mutable std::vector<T> m_returned;
4206 size_t m_target_repeats;
4207 size_t m_current_repeat = 0;
4208 size_t m_repeat_index = 0;
4211 m_generator(
std::move(generator)),
4212 m_target_repeats(repeats)
4214 assert(m_target_repeats > 0 &&
"Repeat generator must repeat at least once");
4217 T
const&
get()
const override {
4218 if (m_current_repeat == 0) {
4219 m_returned.push_back(m_generator.
get());
4220 return m_returned.back();
4222 return m_returned[m_repeat_index];
4232 if (m_current_repeat == 0) {
4233 const auto success = m_generator.
next();
4237 return m_current_repeat < m_target_repeats;
4242 if (m_repeat_index == m_returned.size()) {
4246 return m_current_repeat < m_target_repeats;
4250 template <
typename T>
4255 template <
typename T,
typename U,
typename Func>
4263 template <
typename F2 = Func>
4265 m_generator(
std::move(generator)),
4266 m_function(
std::forward<F2>(function)),
4267 m_cache(m_function(m_generator.
get()))
4270 T
const&
get()
const override {
4274 const auto success = m_generator.
next();
4276 m_cache = m_function(m_generator.
get());
4282 template <
typename Func,
typename U,
typename T = FunctionReturnType<Func, U>>
4289 template <
typename T,
typename U,
typename Func>
4290 GeneratorWrapper<T>
map(Func&& function, GeneratorWrapper<U>&& generator) {
4291 return GeneratorWrapper<T>(
4292 pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
4296 template <
typename T>
4298 std::vector<T> m_chunk;
4299 size_t m_chunk_size;
4301 bool m_used_up =
false;
4304 m_chunk_size(
size), m_generator(
std::move(generator))
4306 m_chunk.reserve(m_chunk_size);
4307 if (m_chunk_size != 0) {
4308 m_chunk.push_back(m_generator.
get());
4309 for (
size_t i = 1; i < m_chunk_size; ++i) {
4310 if (!m_generator.
next()) {
4313 m_chunk.push_back(m_generator.
get());
4317 std::vector<T>
const&
get()
const override {
4322 for (
size_t idx = 0; idx < m_chunk_size; ++idx) {
4323 if (!m_generator.
next()) {
4326 m_chunk.push_back(m_generator.
get());
4332 template <
typename T>
4335 pf::make_unique<ChunkGenerator<T>>(
size, std::move(generator))
4351 struct IResultCapture;
4354 struct IMutableContext;
4378 static void createContext();
4383 if( !IMutableContext::currentContext )
4384 IMutableContext::createContext();
4386 return *IMutableContext::currentContext;
4408 template<
typename T>
4413 : nullableValue( new( storage ) T( _value ) )
4416 : nullableValue( _other ? new( storage ) T( *_other ) : nullptr )
4424 if( &_other !=
this ) {
4427 nullableValue =
new( storage ) T( *_other );
4433 nullableValue =
new( storage ) T( _value );
4439 nullableValue->~T();
4440 nullableValue =
nullptr;
4449 return nullableValue ? *nullableValue : defaultValue;
4452 bool some()
const {
return nullableValue !=
nullptr; }
4453 bool none()
const {
return nullableValue ==
nullptr; }
4455 bool operator !()
const {
return nullableValue ==
nullptr; }
4456 explicit operator bool()
const {
4462 alignas(
alignof(T))
char storage[
sizeof(T)];
4484 NoAssertions = 0x01,
4507 BeforeStartAndExit = BeforeStart | BeforeExit
4518 virtual std::string
name()
const = 0;
4543 using IConfigPtr = std::shared_ptr<IConfig const>;
4559 using state_type = std::uint64_t;
4586 std::uint64_t m_state;
4591 static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL;
4600namespace Generators {
4602template <
typename Float>
4605 std::uniform_real_distribution<Float> m_dist;
4606 Float m_current_number;
4612 static_cast<void>(next());
4615 Float
const&
get()
const override {
4616 return m_current_number;
4619 m_current_number = m_dist(m_rng);
4624template <
typename Integer>
4627 std::uniform_int_distribution<Integer> m_dist;
4628 Integer m_current_number;
4634 static_cast<void>(next());
4637 Integer
const&
get()
const override {
4638 return m_current_number;
4641 m_current_number = m_dist(m_rng);
4648template <
typename T>
4650GeneratorWrapper<T>>::type
4657template <
typename T>
4659GeneratorWrapper<T>>::type
4666template <
typename T>
4678 m_positive(m_step > T(0))
4680 assert(m_current != m_end &&
"Range start and end cannot be equal");
4681 assert(m_step != T(0) &&
"Step size cannot be zero");
4682 assert(((m_positive && m_current <= m_end) || (!m_positive && m_current >= m_end)) &&
"Step moves away from end");
4689 T
const&
get()
const override {
4694 m_current += m_step;
4695 return (m_positive) ? (m_current < m_end) : (m_current > m_end);
4699template <
typename T>
4705template <
typename T>
4711template <
typename T>
4714 "IteratorGenerator currently does not support bools"
4715 "because of std::vector<bool> specialization");
4717 std::vector<T> m_elems;
4718 size_t m_current = 0;
4720 template <
typename InputIterator,
typename InputSentinel>
4722 if (m_elems.empty()) {
4727 T
const&
get()
const override {
4728 return m_elems[m_current];
4733 return m_current != m_elems.size();
4737template <
typename InputIterator,
4738 typename InputSentinel,
4739 typename ResultType =
typename std::iterator_traits<InputIterator>::value_type>
4744template <
typename Container,
4745 typename ResultType =
typename Container::value_type>
4764#pragma clang diagnostic push
4765#pragma clang diagnostic ignored "-Wpadded"
4770 struct ITestInvoker;
4776 ShouldFail = 1 << 2,
4779 NonPortable = 1 << 5,
4784 std::string
const& _className,
4785 std::string
const& _description,
4786 std::vector<std::string>
const& _tags,
4792 bool throws()
const;
4822 std::shared_ptr<ITestInvoker>
test;
4826 std::string
const& className,
4832#pragma clang diagnostic pop
4851#import <objc/runtime.h>
4873 class OcMethod :
public ITestInvoker {
4876 OcMethod( Class cls,
SEL sel ) : m_cls( cls ), m_sel( sel ) {}
4878 virtual void invoke()
const {
4879 id obj = [[m_cls alloc] init];
4881 performOptionalSelector( obj,
@selector(setUp) );
4882 performOptionalSelector( obj, m_sel );
4883 performOptionalSelector( obj,
@selector(tearDown) );
4885 arcSafeRelease( obj );
4888 virtual ~OcMethod() {}
4896 inline std::string getAnnotation( Class cls,
4897 std::string
const& annotationName,
4898 std::string
const& testCaseName ) {
4899 NSString* selStr = [[NSString alloc] initWithFormat:@"Catch_%s_%s", annotationName.c_str(), testCaseName.c_str()];
4900 SEL sel = NSSelectorFromString( selStr );
4901 arcSafeRelease( selStr );
4902 id value = performOptionalSelector( cls, sel );
4904 return [(NSString*)value UTF8String];
4909 inline std::size_t registerTestMethods() {
4910 std::size_t noTestMethods = 0;
4911 int noClasses = objc_getClassList(
nullptr, 0 );
4913 Class* classes = (CATCH_UNSAFE_UNRETAINED Class *)malloc(
sizeof(Class) * noClasses);
4914 objc_getClassList( classes, noClasses );
4916 for(
int c = 0; c < noClasses; c++ ) {
4917 Class cls = classes[c];
4920 Method* methods = class_copyMethodList( cls, &count );
4921 for( u_int m = 0; m < count ; m++ ) {
4922 SEL selector = method_getName(methods[m]);
4923 std::string methodName = sel_getName(selector);
4924 if(
startsWith( methodName,
"Catch_TestCase_" ) ) {
4925 std::string testCaseName = methodName.substr( 15 );
4926 std::string name = Detail::getAnnotation( cls,
"Name", testCaseName );
4927 std::string desc = Detail::getAnnotation( cls,
"Description", testCaseName );
4928 const char* className = class_getName( cls );
4937 return noTestMethods;
4940#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
4942 namespace Matchers {
4944 namespace NSStringMatchers {
4946 struct StringHolder : MatcherBase<NSString*>{
4947 StringHolder( NSString* substr ) : m_substr( [substr
copy] ){}
4948 StringHolder( StringHolder
const& other ) : m_substr( [other.m_substr
copy] ){}
4950 arcSafeRelease( m_substr );
4953 bool match( NSString* str )
const override {
4957 NSString* CATCH_ARC_STRONG m_substr;
4960 struct Equals : StringHolder {
4961 Equals( NSString* substr ) : StringHolder( substr ){}
4963 bool match( NSString* str )
const override {
4964 return (str != nil || m_substr == nil ) &&
4965 [str isEqualToString:m_substr];
4968 std::string describe()
const override {
4969 return "equals string: " +
Catch::Detail::stringify( m_substr );
4974 Contains( NSString* substr ) : StringHolder( substr ){}
4976 bool match( NSString* str )
const override {
4977 return (str != nil || m_substr == nil ) &&
4978 [str rangeOfString:m_substr].location != NSNotFound;
4981 std::string describe()
const override {
4982 return "contains string: " +
Catch::Detail::stringify( m_substr );
4987 StartsWith( NSString* substr ) : StringHolder( substr ){}
4989 bool match( NSString* str )
const override {
4990 return (str != nil || m_substr == nil ) &&
4991 [str rangeOfString:m_substr].location == 0;
4994 std::string describe()
const override {
4995 return "starts with: " +
Catch::Detail::stringify( m_substr );
4999 EndsWith( NSString* substr ) : StringHolder( substr ){}
5001 bool match( NSString