mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	 Jozef Grajciar
					Jozef Grajciar
				
			
				
					committed by
					
						 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
			
				
	
			
			
			 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
						parent
						
							c365ac392b
						
					
				
				
					commit
					f2cfc2b852
				
			| @@ -259,6 +259,8 @@ | |||||||
| #define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) | #define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) | ||||||
| #define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) | #define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) | ||||||
| #define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) | #define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) | ||||||
|  | #define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__) | ||||||
|  | #define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) | ||||||
| #else | #else | ||||||
| #define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) | #define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) ) | ||||||
| #define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) ) | #define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) ) | ||||||
| @@ -268,6 +270,8 @@ | |||||||
| #define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) ) | #define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) ) | ||||||
| #define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) | #define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) | ||||||
| #define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) | #define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) ) | ||||||
|  | #define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE( __VA_ARGS__ ) ) | ||||||
|  | #define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) ) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -31,4 +31,8 @@ struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args.. | |||||||
|  |  | ||||||
| } // namespace Catch | } // namespace Catch | ||||||
|  |  | ||||||
|  | namespace mpl_{ | ||||||
|  |     struct na; | ||||||
|  | } | ||||||
|  |  | ||||||
| #endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED | #endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED | ||||||
|   | |||||||
| @@ -107,6 +107,8 @@ | |||||||
|     constexpr auto append(L1<E1...>, L2<E2...>) noexcept -> L1<E1...,E2...> { return {}; }\ |     constexpr auto append(L1<E1...>, L2<E2...>) noexcept -> L1<E1...,E2...> { return {}; }\ | ||||||
|     template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\ |     template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\ | ||||||
|     constexpr auto append(L1<E1...>, L2<E2...>, Rest...) noexcept -> decltype(append(L1<E1...,E2...>{}, Rest{}...)) { return {}; }\ |     constexpr auto append(L1<E1...>, L2<E2...>, Rest...) noexcept -> decltype(append(L1<E1...,E2...>{}, Rest{}...)) { return {}; }\ | ||||||
|  |     template< template<typename...> class L1, typename...E1, typename...Rest>\ | ||||||
|  |     constexpr auto append(L1<E1...>, TypeList<mpl_::na>, Rest...) noexcept -> L1<E1...> { return {}; }\ | ||||||
|     \ |     \ | ||||||
|     template< template<typename...> class Container, template<typename...> class List, typename...elems>\ |     template< template<typename...> class Container, template<typename...> class List, typename...elems>\ | ||||||
|     constexpr auto rewrap(List<elems...>) noexcept -> TypeList<Container<elems...>> { return {}; }\ |     constexpr auto rewrap(List<elems...>) noexcept -> TypeList<Container<elems...>> { return {}; }\ | ||||||
| @@ -114,7 +116,9 @@ | |||||||
|     constexpr auto rewrap(List<Elems...>,Elements...) noexcept -> decltype(append(TypeList<Container<Elems...>>{}, rewrap<Container>(Elements{}...))) { return {}; }\ |     constexpr auto rewrap(List<Elems...>,Elements...) noexcept -> decltype(append(TypeList<Container<Elems...>>{}, rewrap<Container>(Elements{}...))) { return {}; }\ | ||||||
|     \ |     \ | ||||||
|     template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\ |     template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\ | ||||||
|     constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; } |     constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }\ | ||||||
|  |     template<template <typename...> class Final, template <typename...> class List, typename...Ts>\ | ||||||
|  |     constexpr auto convert(List<Ts...>) noexcept -> decltype(append(Final<>{},TypeList<Ts>{}...)) { return {}; } | ||||||
|  |  | ||||||
| #define INTERNAL_CATCH_NTTP_1(signature, ...)\ | #define INTERNAL_CATCH_NTTP_1(signature, ...)\ | ||||||
|     template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\ |     template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\ | ||||||
|   | |||||||
| @@ -232,6 +232,35 @@ struct AutoReg : NonCopyable { | |||||||
|         INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) |         INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, Signature, __VA_ARGS__ ) ) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |     #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\ | ||||||
|  |         CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ | ||||||
|  |         template<typename TestType> static void TestFunc();       \ | ||||||
|  |         namespace {\ | ||||||
|  |         namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\ | ||||||
|  |         INTERNAL_CATCH_TYPE_GEN\ | ||||||
|  |         template<typename... Types>                               \ | ||||||
|  |         struct TestName {                                         \ | ||||||
|  |             void reg_tests() {                                          \ | ||||||
|  |                 int index = 0;                                    \ | ||||||
|  |                 using expander = int[];                           \ | ||||||
|  |                 (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */\ | ||||||
|  |             }                                                     \ | ||||||
|  |         };\ | ||||||
|  |         static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \ | ||||||
|  |                 using TestInit = decltype(convert<TestName>(TmplList {})); \ | ||||||
|  |                 TestInit t;                                           \ | ||||||
|  |                 t.reg_tests();                                        \ | ||||||
|  |                 return 0;                                             \ | ||||||
|  |             }();                                                        \ | ||||||
|  |         }}\ | ||||||
|  |         CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS                    \ | ||||||
|  |         template<typename TestType>                                   \ | ||||||
|  |         static void TestFunc() | ||||||
|  |  | ||||||
|  |     #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \ | ||||||
|  |         INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList ) | ||||||
|  |  | ||||||
|  |  | ||||||
|     #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ |     #define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \ | ||||||
|         CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ |         CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ | ||||||
|         CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ |         CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ | ||||||
| @@ -327,5 +356,36 @@ struct AutoReg : NonCopyable { | |||||||
|         INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) ) |         INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, Signature,__VA_ARGS__ ) ) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |     #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \ | ||||||
|  |         CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ | ||||||
|  |         template<typename TestType> \ | ||||||
|  |         struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \ | ||||||
|  |             void test();\ | ||||||
|  |         };\ | ||||||
|  |         namespace {\ | ||||||
|  |         namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \ | ||||||
|  |             INTERNAL_CATCH_TYPE_GEN\ | ||||||
|  |             template<typename...Types>\ | ||||||
|  |             struct TestNameClass{\ | ||||||
|  |                 void reg_tests(){\ | ||||||
|  |                     int index = 0;\ | ||||||
|  |                     using expander = int[];\ | ||||||
|  |                     (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */ \ | ||||||
|  |                 }\ | ||||||
|  |             };\ | ||||||
|  |             static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\ | ||||||
|  |                 using TestInit = decltype(convert<TestNameClass>(TmplList {}));\ | ||||||
|  |                 TestInit t;\ | ||||||
|  |                 t.reg_tests();\ | ||||||
|  |                 return 0;\ | ||||||
|  |             }(); \ | ||||||
|  |         }}\ | ||||||
|  |         CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \ | ||||||
|  |         template<typename TestType> \ | ||||||
|  |         void TestName<TestType>::test() | ||||||
|  |  | ||||||
|  | #define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \ | ||||||
|  |         INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), ClassName, Name, Tags, TmplList ) | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif // TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED | #endif // TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user