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