mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Template tests: added TEMPLATE_PRODUCT_TEST_CASE
support for generating test cases based on multiple template template
types combined with template arguments for each of the template template
types specified
e.g.
```
TEMPLATE_PRODUCT_TEST_CASE("template product","[template]",
			   (std::tuple, std::pair, std::map),
			   ((int,float),(char,double),(int,char)))
```
will effectively create 9 test cases with types:
std::tuple<int,float>
std::tuple<char,double>
std::tuple<int,char>
std::pair<int,float>
std::pair<char, double>
std::pair<int,char>
std::map<int,float>
std::map<char,double>
std::map<int,char>
Tested type is accessible in test case body as TestType
Unique name is created by appending ` - <index>` to test name
since preprocessor has some limitations in recursions
Closes #1454
			
			
This commit is contained in:
		
							
								
								
									
										76
									
								
								include/internal/catch_meta.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								include/internal/catch_meta.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| /* | ||||
|  *  Created by Jozef on 02/12/2018. | ||||
|  *  Copyright 2018 Two Blue Cubes Ltd. All rights reserved. | ||||
|  * | ||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
|  | ||||
| #ifndef TWOBLUECUBES_CATCH_META_HPP_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_META_HPP_INCLUDED | ||||
|  | ||||
| template< typename... > | ||||
| struct TypeList{}; | ||||
|  | ||||
| template< typename... > | ||||
| struct append; | ||||
|  | ||||
| template< template<typename...> class L1 | ||||
| 	, typename...E1 | ||||
| 	, template<typename...> class L2 | ||||
| 	, typename...E2 | ||||
| 	> | ||||
| struct append< L1<E1...>, L2<E2...> > | ||||
| { | ||||
| 	using type = L1<E1..., E2...>; | ||||
| }; | ||||
|  | ||||
| template< template<typename...> class L1 | ||||
| 	, typename...E1 | ||||
| 	, template<typename...> class L2 | ||||
| 	, typename...E2 | ||||
| 	, typename...Rest | ||||
| 	> | ||||
| struct append< L1<E1...>, L2<E2...>, Rest...> | ||||
| { | ||||
| 	using type = typename append< L1<E1..., E2...>, Rest... >::type; | ||||
| }; | ||||
|  | ||||
| template< template<typename...> class | ||||
|         , typename... | ||||
|         > | ||||
| struct rewrap; | ||||
|  | ||||
| template< template<typename...> class Container | ||||
|         , template<typename...> class List | ||||
|         , typename...elems | ||||
|         > | ||||
| struct rewrap<Container, List<elems...>> | ||||
| { | ||||
|     using type = TypeList< Container< elems... > >; | ||||
| }; | ||||
|  | ||||
| template< template<typename...> class Container | ||||
|         , template<typename...> class List | ||||
|         , class...Elems | ||||
|         , typename...Elements> | ||||
| struct rewrap<Container, List<Elems...>, Elements...> | ||||
| { | ||||
|     using type = typename append<TypeList<Container<Elems...>>, typename rewrap<Container, Elements...>::type>::type; | ||||
| }; | ||||
|  | ||||
| template< template<typename...> class...Containers > | ||||
| struct combine | ||||
| { | ||||
|     template< typename...Types > | ||||
|     struct with_types | ||||
|     { | ||||
|         template< template <typename...> class Final > | ||||
|         struct into | ||||
|         { | ||||
|             using type = typename append<Final<>, typename rewrap<Containers, Types...>::type...>::type; | ||||
|         }; | ||||
|     }; | ||||
| }; | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED | ||||
		Reference in New Issue
	
	Block a user
	 Jozef Grajciar
					Jozef Grajciar