|
|
@@ -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) |
|
|
|
|