| @@ -1,6 +1,6 @@ | |||
| /* | |||
| * 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 | |||
| * Copyright (c) 2018 Two Blue Cubes Ltd. All rights reserved. | |||
| @@ -14,8 +14,8 @@ | |||
| #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__ | |||
| # pragma clang system_header | |||
| @@ -226,6 +226,13 @@ namespace Catch { | |||
| # define CATCH_INTERNAL_CONFIG_WINDOWS_SEH | |||
| # 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 | |||
| //////////////////////////////////////////////////////////////////////////////// | |||
| @@ -240,6 +247,12 @@ namespace Catch { | |||
| # define CATCH_INTERNAL_CONFIG_NO_WCHAR | |||
| #endif // __DJGPP__ | |||
| //////////////////////////////////////////////////////////////////////////////// | |||
| // Embarcadero C++Build | |||
| #if defined(__BORLANDC__) | |||
| #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN | |||
| #endif | |||
| //////////////////////////////////////////////////////////////////////////////// | |||
| // Use of __COUNTER__ is suppressed during code analysis in | |||
| @@ -320,6 +333,10 @@ namespace Catch { | |||
| # define CATCH_CONFIG_DISABLE_EXCEPTIONS | |||
| #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) | |||
| # define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS | |||
| # define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS | |||
| @@ -343,6 +360,10 @@ namespace Catch { | |||
| #define CATCH_CATCH_ANON(type) catch (type) | |||
| #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 | |||
| #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 ) | |||
| @@ -597,6 +618,102 @@ inline auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noex | |||
| } | |||
| // 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 { | |||
| template<typename C> | |||
| @@ -631,22 +748,28 @@ struct AutoReg : NonCopyable { | |||
| } // 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) | |||
| #define INTERNAL_CATCH_TESTCASE_NO_REGISTRATION( TestName, ... ) \ | |||
| static void TestName() | |||
| #define INTERNAL_CATCH_TESTCASE_METHOD_NO_REGISTRATION( TestName, ClassName, ... ) \ | |||
| namespace{ \ | |||
| struct TestName : INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF ClassName) { \ | |||
| struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ | |||
| void 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 | |||
| /////////////////////////////////////////////////////////////////////////////// | |||
| @@ -669,7 +792,7 @@ struct AutoReg : NonCopyable { | |||
| #define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\ | |||
| CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ | |||
| namespace{ \ | |||
| struct TestName : INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF ClassName) { \ | |||
| struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \ | |||
| void test(); \ | |||
| }; \ | |||
| Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \ | |||
| @@ -685,6 +808,77 @@ struct AutoReg : NonCopyable { | |||
| 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 | |||
| /////////////////////////////////////////////////////////////////////////////// | |||
| #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 | |||
| // start catch_capture.hpp | |||
| @@ -1823,16 +2017,16 @@ namespace Catch { | |||
| Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ); | |||
| ~Capturer(); | |||
| void captureValue( size_t index, StringRef value ); | |||
| void captureValue( size_t index, std::string const& value ); | |||
| template<typename T> | |||
| void captureValues( size_t index, T&& value ) { | |||
| void captureValues( size_t index, T const& value ) { | |||
| captureValue( index, Catch::Detail::stringify( value ) ); | |||
| } | |||
| 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... ); | |||
| } | |||
| }; | |||
| @@ -2453,10 +2647,6 @@ namespace Matchers { | |||
| struct MatcherMethod { | |||
| virtual bool match( ObjectT const& arg ) const = 0; | |||
| }; | |||
| template<typename PtrT> | |||
| struct MatcherMethod<PtrT*> { | |||
| virtual bool match( PtrT* arg ) const = 0; | |||
| }; | |||
| #ifdef __clang__ | |||
| # pragma clang diagnostic pop | |||
| @@ -4514,6 +4704,8 @@ namespace Catch { | |||
| struct TestEventListenerBase : StreamingReporterBase<TestEventListenerBase> { | |||
| TestEventListenerBase( ReporterConfig const& _config ); | |||
| static std::set<Verbosity> getSupportedVerbosities(); | |||
| void assertionStarting(AssertionInfo const&) override; | |||
| bool assertionEnded(AssertionStats const&) override; | |||
| }; | |||
| @@ -8523,6 +8715,14 @@ using Matchers::Impl::MatcherBase; | |||
| // end catch_matchers.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 | |||
| #include <string> | |||
| @@ -8588,7 +8788,7 @@ template <typename FP> | |||
| bool almostEqualUlps(FP lhs, FP rhs, int maxUlpDiff) { | |||
| // Comparison with NaN should always be false. | |||
| // 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; | |||
| } | |||
| @@ -8796,6 +8996,7 @@ namespace Catch { | |||
| // end catch_uncaught_exceptions.h | |||
| #include <cassert> | |||
| #include <stack> | |||
| namespace Catch { | |||
| @@ -8842,19 +9043,48 @@ namespace Catch { | |||
| } | |||
| 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]; | |||
| 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() { | |||
| if ( !uncaught_exceptions() ){ | |||
| @@ -8864,7 +9094,7 @@ namespace Catch { | |||
| } | |||
| } | |||
| void Capturer::captureValue( size_t index, StringRef value ) { | |||
| void Capturer::captureValue( size_t index, std::string const& value ) { | |||
| assert( index < m_messages.size() ); | |||
| m_messages[index].message += value; | |||
| m_resultCapture.pushScopedMessage( m_messages[index] ); | |||
| @@ -9092,6 +9322,31 @@ namespace Catch { | |||
| #endif | |||
| #endif | |||
| // 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 | |||
| namespace Catch { | |||
| @@ -10055,8 +10310,6 @@ namespace Catch { | |||
| } | |||
| Catch::Totals runTests(std::shared_ptr<Config> const& config) { | |||
| // FixMe: Add listeners in order first, then add reporters. | |||
| auto reporter = makeReporter(config); | |||
| RunContext context(config, std::move(reporter)); | |||
| @@ -11582,7 +11835,7 @@ namespace Detail { | |||
| template<typename T> | |||
| std::string fpToString( T value, int precision ) { | |||
| if (std::isnan(value)) { | |||
| if (Catch::isnan(value)) { | |||
| return "nan"; | |||
| } | |||
| @@ -11866,7 +12119,7 @@ namespace Catch { | |||
| } | |||
| Version const& libraryVersion() { | |||
| static Version version( 2, 4, 2, "", 0 ); | |||
| static Version version( 2, 5, 0, "", 0 ); | |||
| return version; | |||
| } | |||
| @@ -12224,6 +12477,10 @@ namespace Catch { | |||
| TestEventListenerBase::TestEventListenerBase(ReporterConfig const & _config) | |||
| :StreamingReporterBase(_config) {} | |||
| std::set<Verbosity> TestEventListenerBase::getSupportedVerbosities() { | |||
| return { Verbosity::Quiet, Verbosity::Normal, Verbosity::High }; | |||
| } | |||
| void TestEventListenerBase::assertionStarting(AssertionInfo const &) {} | |||
| bool TestEventListenerBase::assertionEnded(AssertionStats const &) { | |||
| @@ -12612,8 +12869,6 @@ public: | |||
| void print() const { | |||
| printSourceInfo(); | |||
| if (stats.totals.assertions.total() > 0) { | |||
| if (result.isOk()) | |||
| stream << '\n'; | |||
| printResultType(); | |||
| printOriginalExpression(); | |||
| printReconstructedExpression(); | |||
| @@ -13825,6 +14080,14 @@ int main (int argc, char * const argv[]) { | |||
| #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) | |||
| #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__ ) | |||
| @@ -13892,6 +14155,14 @@ int main (int argc, char * const argv[]) { | |||
| #define SUCCEED( ... ) INTERNAL_CATCH_MSG( "SUCCEED", Catch::ResultWas::Ok, Catch::ResultDisposition::ContinueOnFailure, __VA_ARGS__ ) | |||
| #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) | |||
| #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__ ")" ) | |||
| @@ -13970,6 +14241,14 @@ using Catch::Detail::Approx; | |||
| #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 | |||
| #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 ) | |||
| @@ -14032,6 +14311,14 @@ using Catch::Detail::Approx; | |||
| #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____ )) | |||
| #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_FALSE( ... ) (void)(0) | |||