Skip to content

Commit d6d2d43

Browse files
committed
TEMPLATE_LIST_TEST_CASE implementation
Closes #1627
1 parent 00347f1 commit d6d2d43

File tree

4 files changed

+73
-1
lines changed

4 files changed

+73
-1
lines changed

Diff for: include/catch.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@
248248
#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ )
249249
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ )
250250
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ )
251+
#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(__VA_ARGS__)
252+
#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ )
251253
#else
252254
#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ ) )
253255
#define TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG( __VA_ARGS__ ) )
@@ -257,6 +259,8 @@
257259
#define TEMPLATE_PRODUCT_TEST_CASE_SIG( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_SIG( __VA_ARGS__ ) )
258260
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD( className, __VA_ARGS__ ) )
259261
#define TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_SIG( className, __VA_ARGS__ ) )
262+
#define TEMPLATE_LIST_TEST_CASE( ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE( __VA_ARGS__ ) )
263+
#define TEMPLATE_LIST_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_EXPAND_VARGS( INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD( className, __VA_ARGS__ ) )
260264
#endif
261265

262266

Diff for: include/internal/catch_meta.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,8 @@ namespace Catch {
1616
struct always_false : std::false_type {};
1717
} // namespace Catch
1818

19+
namespace mpl_{
20+
struct na;
21+
}
22+
1923
#endif // TWOBLUECUBES_CATCH_META_HPP_INCLUDED

Diff for: include/internal/catch_preprocessor.hpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -107,14 +107,18 @@
107107
constexpr auto append(L1<E1...>, L2<E2...>) noexcept -> L1<E1...,E2...> { return {}; }\
108108
template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\
109109
constexpr auto append(L1<E1...>, L2<E2...>, Rest...) noexcept -> decltype(append(L1<E1...,E2...>{}, Rest{}...)) { return {}; }\
110+
template< template<typename...> class L1, typename...E1, typename...Rest>\
111+
constexpr auto append(L1<E1...>, TypeList<mpl_::na>, Rest...) noexcept -> L1<E1...> { return {}; }\
110112
\
111113
template< template<typename...> class Container, template<typename...> class List, typename...elems>\
112114
constexpr auto rewrap(List<elems...>) noexcept -> TypeList<Container<elems...>> { return {}; }\
113115
template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\
114116
constexpr auto rewrap(List<Elems...>,Elements...) noexcept -> decltype(append(TypeList<Container<Elems...>>{}, rewrap<Container>(Elements{}...))) { return {}; }\
115117
\
116118
template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\
117-
constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }
119+
constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }\
120+
template<template <typename...> class Final, template <typename...> class List, typename...Ts>\
121+
constexpr auto convert(List<Ts...>) noexcept -> decltype(append(Final<>{},TypeList<Ts>{}...)) { return {}; }
118122

119123
#define INTERNAL_CATCH_NTTP_1(signature, ...)\
120124
template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\

Diff for: include/internal/catch_test_registry.h

+60
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,35 @@ struct AutoReg : NonCopyable {
232232
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__ ) )
233233
#endif
234234

235+
#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\
236+
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
237+
template<typename TestType> static void TestFunc(); \
238+
namespace {\
239+
namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\
240+
INTERNAL_CATCH_TYPE_GEN\
241+
template<typename... Types> \
242+
struct TestName { \
243+
void reg_tests() { \
244+
int index = 0; \
245+
using expander = int[]; \
246+
(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 */\
247+
} \
248+
};\
249+
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
250+
using TestInit = decltype(convert<TestName>(TmplList {})); \
251+
TestInit t; \
252+
t.reg_tests(); \
253+
return 0; \
254+
}(); \
255+
}}\
256+
CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
257+
template<typename TestType> \
258+
static void TestFunc()
259+
260+
#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE(Name, Tags, TmplList) \
261+
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 )
262+
263+
235264
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \
236265
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
237266
CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
@@ -327,5 +356,36 @@ struct AutoReg : NonCopyable {
327356
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__ ) )
328357
#endif
329358

359+
#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \
360+
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
361+
template<typename TestType> \
362+
struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \
363+
void test();\
364+
};\
365+
namespace {\
366+
namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \
367+
INTERNAL_CATCH_TYPE_GEN\
368+
template<typename...Types>\
369+
struct TestNameClass{\
370+
void reg_tests(){\
371+
int index = 0;\
372+
using expander = int[];\
373+
(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 */ \
374+
}\
375+
};\
376+
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
377+
using TestInit = decltype(convert<TestNameClass>(TmplList {}));\
378+
TestInit t;\
379+
t.reg_tests();\
380+
return 0;\
381+
}(); \
382+
}}\
383+
CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
384+
template<typename TestType> \
385+
void TestName<TestType>::test()
386+
387+
#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD(ClassName, Name, Tags, TmplList) \
388+
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 )
389+
330390

331391
#endif // TWOBLUECUBES_CATCH_TEST_REGISTRY_HPP_INCLUDED

0 commit comments

Comments
 (0)