| /* | /* | ||||
| * Catch v2.4.2 | |||||
| * Generated: 2018-10-26 21:12:29.223927 | |||||
| * Catch v2.5.0 | |||||
| * Generated: 2018-11-26 20:46:12.165372 | |||||
| * ---------------------------------------------------------- | * ---------------------------------------------------------- | ||||
| * This file has been merged from multiple headers. Please don't edit it directly | * This file has been merged from multiple headers. Please don't edit it directly | ||||
| * Copyright (c) 2018 Two Blue Cubes Ltd. All rights reserved. | * Copyright (c) 2018 Two Blue Cubes Ltd. All rights reserved. | ||||
| #define CATCH_VERSION_MAJOR 2 | #define CATCH_VERSION_MAJOR 2 | ||||
| #define CATCH_VERSION_MINOR 4 | |||||
| #define CATCH_VERSION_PATCH 2 | |||||
| #define CATCH_VERSION_MINOR 5 | |||||
| #define CATCH_VERSION_PATCH 0 | |||||
| #ifdef __clang__ | #ifdef __clang__ | ||||
| # pragma clang system_header | # pragma clang system_header | ||||
| # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH | # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH | ||||
| # endif | # endif | ||||
| // MSVC traditional preprocessor needs some workaround for __VA_ARGS__ | |||||
| // _MSVC_TRADITIONAL == 0 means new conformant preprocessor | |||||
| // _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor | |||||
| # if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) | |||||
| # define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| # endif | |||||
| #endif // _MSC_VER | #endif // _MSC_VER | ||||
| //////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// | ||||
| # define CATCH_INTERNAL_CONFIG_NO_WCHAR | # define CATCH_INTERNAL_CONFIG_NO_WCHAR | ||||
| #endif // __DJGPP__ | #endif // __DJGPP__ | ||||
| //////////////////////////////////////////////////////////////////////////////// | |||||
| // Embarcadero C++Build | |||||
| #if defined(__BORLANDC__) | |||||
| #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN | |||||
| #endif | |||||
| //////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// | ||||
| // Use of __COUNTER__ is suppressed during code analysis in | // Use of __COUNTER__ is suppressed during code analysis in | ||||
| # define CATCH_CONFIG_DISABLE_EXCEPTIONS | # define CATCH_CONFIG_DISABLE_EXCEPTIONS | ||||
| #endif | #endif | ||||
| #if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN) | |||||
| # define CATCH_CONFIG_POLYFILL_ISNAN | |||||
| #endif | |||||
| #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) | #if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) | ||||
| # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS | # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS | ||||
| # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS | # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS | ||||
| #define CATCH_CATCH_ANON(type) catch (type) | #define CATCH_CATCH_ANON(type) catch (type) | ||||
| #endif | #endif | ||||
| #if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) | |||||
| #define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #endif | |||||
| // end catch_compiler_capabilities.h | // end catch_compiler_capabilities.h | ||||
| #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line | #define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line | ||||
| #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) | #define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) | ||||
| } | } | ||||
| // end catch_stringref.h | // end catch_stringref.h | ||||
| // start catch_type_traits.hpp | |||||
| namespace Catch{ | |||||
| #ifdef CATCH_CPP17_OR_GREATER | |||||
| template <typename...> | |||||
| inline constexpr auto is_unique = std::true_type{}; | |||||
| template <typename T, typename... Rest> | |||||
| inline constexpr auto is_unique<T, Rest...> = std::bool_constant< | |||||
| (!std::is_same_v<T, Rest> && ...) && is_unique<Rest...> | |||||
| >{}; | |||||
| #else | |||||
| template <typename...> | |||||
| struct is_unique : std::true_type{}; | |||||
| template <typename T0, typename T1, typename... Rest> | |||||
| struct is_unique<T0, T1, Rest...> : std::integral_constant | |||||
| <bool, | |||||
| !std::is_same<T0, T1>::value | |||||
| && is_unique<T0, Rest...>::value | |||||
| && is_unique<T1, Rest...>::value | |||||
| >{}; | |||||
| #endif | |||||
| } | |||||
| // end catch_type_traits.hpp | |||||
| // start catch_preprocessor.hpp | |||||
| #define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__ | |||||
| #define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__))) | |||||
| #define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__))) | |||||
| #define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__))) | |||||
| #define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__))) | |||||
| #define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__))) | |||||
| #ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__ | |||||
| // MSVC needs more evaluations | |||||
| #define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__))) | |||||
| #define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__)) | |||||
| #else | |||||
| #define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__) | |||||
| #endif | |||||
| #define CATCH_REC_END(...) | |||||
| #define CATCH_REC_OUT | |||||
| #define CATCH_EMPTY() | |||||
| #define CATCH_DEFER(id) id CATCH_EMPTY() | |||||
| #define CATCH_REC_GET_END2() 0, CATCH_REC_END | |||||
| #define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2 | |||||
| #define CATCH_REC_GET_END(...) CATCH_REC_GET_END1 | |||||
| #define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT | |||||
| #define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0) | |||||
| #define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next) | |||||
| #define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) | |||||
| #define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ ) | |||||
| #define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) | |||||
| #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__ ) | |||||
| #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__ ) | |||||
| #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__ ) | |||||
| // Applies the function macro `f` to each of the remaining parameters, inserts commas between the results, | |||||
| // and passes userdata as the first parameter to each invocation, | |||||
| // e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c) | |||||
| #define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) | |||||
| #define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) | |||||
| #define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) | |||||
| #define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ | |||||
| #define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ | |||||
| #define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF | |||||
| #define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__) | |||||
| #define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME2(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME3(Name, __VA_ARGS__) | |||||
| #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME3(Name,...) Name " - " #__VA_ARGS__ | |||||
| #define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME(Name,...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME2(Name, INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) | |||||
| #else | |||||
| // MSVC is adding extra space and needs more calls to properly remove () | |||||
| #define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME3(Name,...) Name " -" #__VA_ARGS__ | |||||
| #define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME1(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME2(Name, __VA_ARGS__) | |||||
| #define INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME(Name, ...) INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME1(Name, INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) | |||||
| #endif | |||||
| // end catch_preprocessor.hpp | |||||
| namespace Catch { | namespace Catch { | ||||
| template<typename C> | template<typename C> | ||||
| } // end namespace Catch | } // end namespace Catch | ||||
| #define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) | |||||
| #define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ | |||||
| #define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ | |||||
| #define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF | |||||
| #if defined(CATCH_CONFIG_DISABLE) | #if defined(CATCH_CONFIG_DISABLE) | ||||
| #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ | #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ | ||||
| static void TestName() | static void TestName() | ||||
| #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ | #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ | ||||
| namespace{ \ | namespace{ \ | ||||
| struct TestName : INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF ClassName) { \ | |||||
| struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ | |||||
| void test(); \ | void test(); \ | ||||
| }; \ | }; \ | ||||
| } \ | } \ | ||||
| void TestName::test() | void TestName::test() | ||||
| #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION( TestName, ... ) \ | |||||
| template<typename TestType> \ | |||||
| static void TestName() | |||||
| #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ | |||||
| namespace{ \ | |||||
| template<typename TestType> \ | |||||
| struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ | |||||
| void test(); \ | |||||
| }; \ | |||||
| } \ | |||||
| template<typename TestType> \ | |||||
| void TestName::test() | |||||
| #endif | #endif | ||||
| /////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////// | ||||
| #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ | #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ | ||||
| CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ | CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ | ||||
| namespace{ \ | namespace{ \ | ||||
| struct TestName : INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF ClassName) { \ | |||||
| struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ | |||||
| void test(); \ | void test(); \ | ||||
| }; \ | }; \ | ||||
| Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ | Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ | ||||
| Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ | Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ | ||||
| CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS | CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS | ||||
| /////////////////////////////////////////////////////////////////////////////// | |||||
| #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, ... )\ | |||||
| CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ | |||||
| template<typename TestType> \ | |||||
| static void TestFunc();\ | |||||
| namespace {\ | |||||
| template<typename...Types> \ | |||||
| struct TestName{\ | |||||
| template<typename...Ts> \ | |||||
| TestName(Ts...names){\ | |||||
| CATCH_INTERNAL_CHECK_UNIQUE_TYPES(CATCH_REC_LIST(INTERNAL_CATCH_REMOVE_PARENS, __VA_ARGS__)) \ | |||||
| using expander = int[];\ | |||||
| (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ names, Tags } ), 0)... };/* NOLINT */ \ | |||||
| }\ | |||||
| };\ | |||||
| INTERNAL_CATCH_TEMPLATE_REGISTRY_INITIATE(TestName, Name, __VA_ARGS__) \ | |||||
| }\ | |||||
| CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ | |||||
| template<typename TestType> \ | |||||
| static void TestFunc() | |||||
| #if defined(CATCH_CPP17_OR_GREATER) | |||||
| #define CATCH_INTERNAL_CHECK_UNIQUE_TYPES(...) static_assert(Catch::is_unique<__VA_ARGS__>,"Duplicate type detected in declaration of template test case"); | |||||
| #else | |||||
| #define CATCH_INTERNAL_CHECK_UNIQUE_TYPES(...) static_assert(Catch::is_unique<__VA_ARGS__>::value,"Duplicate type detected in declaration of template test case"); | |||||
| #endif | |||||
| #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ | |||||
| 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, __VA_ARGS__ ) | |||||
| #else | |||||
| #define INTERNAL_CATCH_TEMPLATE_TEST_CASE(Name, Tags, ...) \ | |||||
| 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, __VA_ARGS__ ) ) | |||||
| #endif | |||||
| #define INTERNAL_CATCH_TEMPLATE_REGISTRY_INITIATE(TestName, Name, ...)\ | |||||
| static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ | |||||
| TestName<CATCH_REC_LIST(INTERNAL_CATCH_REMOVE_PARENS, __VA_ARGS__)>(CATCH_REC_LIST_UD(INTERNAL_CATCH_TEMPLATE_UNIQUE_NAME,Name, __VA_ARGS__));\ | |||||
| return 0;\ | |||||
| }(); | |||||
| #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, ... ) \ | |||||
| CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ | |||||
| namespace{ \ | |||||
| template<typename TestType> \ | |||||
| struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ | |||||
| void test();\ | |||||
| };\ | |||||
| template<typename...Types> \ | |||||
| struct TestNameClass{\ | |||||
| template<typename...Ts> \ | |||||
| TestNameClass(Ts...names){\ | |||||
| CATCH_INTERNAL_CHECK_UNIQUE_TYPES(CATCH_REC_LIST(INTERNAL_CATCH_REMOVE_PARENS, __VA_ARGS__)) \ | |||||
| using expander = int[];\ | |||||
| (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ names, Tags } ), 0)... };/* NOLINT */ \ | |||||
| }\ | |||||
| };\ | |||||
| INTERNAL_CATCH_TEMPLATE_REGISTRY_INITIATE(TestNameClass, Name, __VA_ARGS__)\ | |||||
| }\ | |||||
| CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\ | |||||
| template<typename TestType> \ | |||||
| void TestName<TestType>::test() | |||||
| #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ | |||||
| 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, __VA_ARGS__ ) | |||||
| #else | |||||
| #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( ClassName, Name, Tags,... ) \ | |||||
| 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, __VA_ARGS__ ) ) | |||||
| #endif | |||||
| // end catch_test_registry.h | // end catch_test_registry.h | ||||
| // start catch_capture.hpp | // start catch_capture.hpp | ||||
| Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ); | Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ); | ||||
| ~Capturer(); | ~Capturer(); | ||||
| void captureValue( size_t index, StringRef value ); | |||||
| void captureValue( size_t index, std::string const& value ); | |||||
| template<typename T> | template<typename T> | ||||
| void captureValues( size_t index, T&& value ) { | |||||
| void captureValues( size_t index, T const& value ) { | |||||
| captureValue( index, Catch::Detail::stringify( value ) ); | captureValue( index, Catch::Detail::stringify( value ) ); | ||||
| } | } | ||||
| template<typename T, typename... Ts> | template<typename T, typename... Ts> | ||||
| void captureValues( size_t index, T&& value, Ts&&... values ) { | |||||
| captureValues( index, value ); | |||||
| void captureValues( size_t index, T const& value, Ts const&... values ) { | |||||
| captureValue( index, Catch::Detail::stringify(value) ); | |||||
| captureValues( index+1, values... ); | captureValues( index+1, values... ); | ||||
| } | } | ||||
| }; | }; | ||||
| struct MatcherMethod { | struct MatcherMethod { | ||||
| virtual bool match( ObjectT const& arg ) const = 0; | virtual bool match( ObjectT const& arg ) const = 0; | ||||
| }; | }; | ||||
| template<typename PtrT> | |||||
| struct MatcherMethod<PtrT*> { | |||||
| virtual bool match( PtrT* arg ) const = 0; | |||||
| }; | |||||
| #ifdef __clang__ | #ifdef __clang__ | ||||
| # pragma clang diagnostic pop | # pragma clang diagnostic pop | ||||
| struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> { | struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> { | ||||
| TestEventListenerBase( ReporterConfig const& _config ); | TestEventListenerBase( ReporterConfig const& _config ); | ||||
| static std::set<Verbosity> getSupportedVerbosities(); | |||||
| void assertionStarting(AssertionInfo const&) override; | void assertionStarting(AssertionInfo const&) override; | ||||
| bool assertionEnded(AssertionStats const&) override; | bool assertionEnded(AssertionStats const&) override; | ||||
| }; | }; | ||||
| // end catch_matchers.cpp | // end catch_matchers.cpp | ||||
| // start catch_matchers_floating.cpp | // start catch_matchers_floating.cpp | ||||
| // start catch_polyfills.hpp | |||||
| namespace Catch { | |||||
| bool isnan(float f); | |||||
| bool isnan(double d); | |||||
| } | |||||
| // end catch_polyfills.hpp | |||||
| // start catch_to_string.hpp | // start catch_to_string.hpp | ||||
| #include <string> | #include <string> | ||||
| bool almostEqualUlps(FP lhs, FP rhs, int maxUlpDiff) { | bool almostEqualUlps(FP lhs, FP rhs, int maxUlpDiff) { | ||||
| // Comparison with NaN should always be false. | // Comparison with NaN should always be false. | ||||
| // This way we can rule it out before getting into the ugly details | // This way we can rule it out before getting into the ugly details | ||||
| if (std::isnan(lhs) || std::isnan(rhs)) { | |||||
| if (Catch::isnan(lhs) || Catch::isnan(rhs)) { | |||||
| return false; | return false; | ||||
| } | } | ||||
| // end catch_uncaught_exceptions.h | // end catch_uncaught_exceptions.h | ||||
| #include <cassert> | #include <cassert> | ||||
| #include <stack> | |||||
| namespace Catch { | namespace Catch { | ||||
| } | } | ||||
| Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) { | Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) { | ||||
| auto start = std::string::npos; | |||||
| for( size_t pos = 0; pos <= names.size(); ++pos ) { | |||||
| auto trimmed = [&] (size_t start, size_t end) { | |||||
| while (names[start] == ',' || isspace(names[start])) { | |||||
| ++start; | |||||
| } | |||||
| while (names[end] == ',' || isspace(names[end])) { | |||||
| --end; | |||||
| } | |||||
| return names.substr(start, end - start + 1); | |||||
| }; | |||||
| size_t start = 0; | |||||
| std::stack<char> openings; | |||||
| for (size_t pos = 0; pos < names.size(); ++pos) { | |||||
| char c = names[pos]; | char c = names[pos]; | ||||
| if( pos == names.size() || c == ' ' || c == '\t' || c == ',' || c == ']' ) { | |||||
| if( start != std::string::npos ) { | |||||
| m_messages.push_back( MessageInfo( macroName, lineInfo, resultType ) ); | |||||
| m_messages.back().message = names.substr( start, pos-start) + " := "; | |||||
| start = std::string::npos; | |||||
| switch (c) { | |||||
| case '[': | |||||
| case '{': | |||||
| case '(': | |||||
| // It is basically impossible to disambiguate between | |||||
| // comparison and start of template args in this context | |||||
| // case '<': | |||||
| openings.push(c); | |||||
| break; | |||||
| case ']': | |||||
| case '}': | |||||
| case ')': | |||||
| // case '>': | |||||
| openings.pop(); | |||||
| break; | |||||
| case ',': | |||||
| if (start != pos && openings.size() == 0) { | |||||
| m_messages.emplace_back(macroName, lineInfo, resultType); | |||||
| m_messages.back().message = trimmed(start, pos); | |||||
| m_messages.back().message += " := "; | |||||
| start = pos; | |||||
| } | } | ||||
| } | } | ||||
| else if( c != '[' && c != ']' && start == std::string::npos ) | |||||
| start = pos; | |||||
| } | } | ||||
| assert(openings.size() == 0 && "Mismatched openings"); | |||||
| m_messages.emplace_back(macroName, lineInfo, resultType); | |||||
| m_messages.back().message = trimmed(start, names.size() - 1); | |||||
| m_messages.back().message += " := "; | |||||
| } | } | ||||
| Capturer::~Capturer() { | Capturer::~Capturer() { | ||||
| if ( !uncaught_exceptions() ){ | if ( !uncaught_exceptions() ){ | ||||
| } | } | ||||
| } | } | ||||
| void Capturer::captureValue( size_t index, StringRef value ) { | |||||
| void Capturer::captureValue( size_t index, std::string const& value ) { | |||||
| assert( index < m_messages.size() ); | assert( index < m_messages.size() ); | ||||
| m_messages[index].message += value; | m_messages[index].message += value; | ||||
| m_resultCapture.pushScopedMessage( m_messages[index] ); | m_resultCapture.pushScopedMessage( m_messages[index] ); | ||||
| #endif | #endif | ||||
| #endif | #endif | ||||
| // end catch_output_redirect.cpp | // end catch_output_redirect.cpp | ||||
| // start catch_polyfills.cpp | |||||
| #include <cmath> | |||||
| namespace Catch { | |||||
| #if !defined(CATCH_CONFIG_POLYFILL_ISNAN) | |||||
| bool isnan(float f) { | |||||
| return std::isnan(f); | |||||
| } | |||||
| bool isnan(double d) { | |||||
| return std::isnan(d); | |||||
| } | |||||
| #else | |||||
| // For now we only use this for embarcadero | |||||
| bool isnan(float f) { | |||||
| return std::_isnan(f); | |||||
| } | |||||
| bool isnan(double d) { | |||||
| return std::_isnan(d); | |||||
| } | |||||
| #endif | |||||
| } // end namespace Catch | |||||
| // end catch_polyfills.cpp | |||||
| // start catch_random_number_generator.cpp | // start catch_random_number_generator.cpp | ||||
| namespace Catch { | namespace Catch { | ||||
| } | } | ||||
| Catch::Totals runTests(std::shared_ptr<Config> const& config) { | Catch::Totals runTests(std::shared_ptr<Config> const& config) { | ||||
| // FixMe: Add listeners in order first, then add reporters. | |||||
| auto reporter = makeReporter(config); | auto reporter = makeReporter(config); | ||||
| RunContext context(config, std::move(reporter)); | RunContext context(config, std::move(reporter)); | ||||
| template<typename T> | template<typename T> | ||||
| std::string fpToString( T value, int precision ) { | std::string fpToString( T value, int precision ) { | ||||
| if (std::isnan(value)) { | |||||
| if (Catch::isnan(value)) { | |||||
| return "nan"; | return "nan"; | ||||
| } | } | ||||
| } | } | ||||
| Version const& libraryVersion() { | Version const& libraryVersion() { | ||||
| static Version version( 2, 4, 2, "", 0 ); | |||||
| static Version version( 2, 5, 0, "", 0 ); | |||||
| return version; | return version; | ||||
| } | } | ||||
| TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) | TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) | ||||
| :StreamingReporterBase(_config) {} | :StreamingReporterBase(_config) {} | ||||
| std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() { | |||||
| return { Verbosity::Quiet, Verbosity::Normal, Verbosity::High }; | |||||
| } | |||||
| void TestEventListenerBase::assertionStarting(AssertionInfo const &) {} | void TestEventListenerBase::assertionStarting(AssertionInfo const &) {} | ||||
| bool TestEventListenerBase::assertionEnded(AssertionStats const &) { | bool TestEventListenerBase::assertionEnded(AssertionStats const &) { | ||||
| void print() const { | void print() const { | ||||
| printSourceInfo(); | printSourceInfo(); | ||||
| if (stats.totals.assertions.total() > 0) { | if (stats.totals.assertions.total() > 0) { | ||||
| if (result.isOk()) | |||||
| stream << '\n'; | |||||
| printResultType(); | printResultType(); | ||||
| printOriginalExpression(); | printOriginalExpression(); | ||||
| printReconstructedExpression(); | printReconstructedExpression(); | ||||
| #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() | #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() | ||||
| #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) | |||||
| #define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) | |||||
| #else | |||||
| #define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) | |||||
| #define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) | |||||
| #endif | |||||
| #if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) | #if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) | ||||
| #define CATCH_STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__ , #__VA_ARGS__ ); CATCH_SUCCEED( #__VA_ARGS__ ) | #define CATCH_STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__ , #__VA_ARGS__ ); CATCH_SUCCEED( #__VA_ARGS__ ) | ||||
| #define CATCH_STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); CATCH_SUCCEED( #__VA_ARGS__ ) | #define CATCH_STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); CATCH_SUCCEED( #__VA_ARGS__ ) | ||||
| #define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) | #define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) | ||||
| #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() | #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE() | ||||
| #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) | |||||
| #define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) | |||||
| #else | |||||
| #define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) | |||||
| #define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) | |||||
| #endif | |||||
| #if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) | #if !defined(CATCH_CONFIG_RUNTIME_STATIC_REQUIRE) | ||||
| #define STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__, #__VA_ARGS__ ); SUCCEED( #__VA_ARGS__ ) | #define STATIC_REQUIRE( ... ) static_assert( __VA_ARGS__, #__VA_ARGS__ ); SUCCEED( #__VA_ARGS__ ) | ||||
| #define STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); SUCCEED( "!(" #__VA_ARGS__ ")" ) | #define STATIC_REQUIRE_FALSE( ... ) static_assert( !(__VA_ARGS__), "!(" #__VA_ARGS__ ")" ); SUCCEED( "!(" #__VA_ARGS__ ")" ) | ||||
| #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) | #define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) | ||||
| #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) ) | |||||
| #define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), className ) | |||||
| #else | |||||
| #define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) ) ) | |||||
| #define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), className ) ) | |||||
| #endif | |||||
| // "BDD-style" convenience wrappers | // "BDD-style" convenience wrappers | ||||
| #define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) | #define CATCH_SCENARIO( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) | ||||
| #define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) | #define CATCH_SCENARIO_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), className ) | ||||
| #define SUCCEED( ... ) (void)(0) | #define SUCCEED( ... ) (void)(0) | ||||
| #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) | #define ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ )) | ||||
| #ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR | |||||
| #define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) ) | |||||
| #define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), className ) | |||||
| #else | |||||
| #define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ) ) ) | |||||
| #define TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), className ) ) | |||||
| #endif | |||||
| #define STATIC_REQUIRE( ... ) (void)(0) | #define STATIC_REQUIRE( ... ) (void)(0) | ||||
| #define STATIC_REQUIRE_FALSE( ... ) (void)(0) | #define STATIC_REQUIRE_FALSE( ... ) (void)(0) | ||||