[feature request] support "template type" parameterised test cases
- Dominant language
- C++
- Stars
- 21.5k
- Forks
- 3.5k
- Avg merge
- 3d 16h
- Merged PRs (30d)
- 2
Description
**DISCLAIMER:** I am not sure whether this is a bug, a limitation by design or a feature request. Feature request sounded like the less severe option.
# Description
I would like to use the [type parametrised test cases](https://github.com/catchorg/Catch2/blob/devel/docs/test-cases-and-sections.md#type-parametrised-test-cases) with a templates itself. The subject under test uses a [template template parameter](https://en.cppreference.com/w/cpp/language/template_parameters#Template_template_parameter).
For example:
```cpp
TEMPLATE_TEST_CASE("some test", "[templates]", Some_template_type, Other_template_type)
// ^ ^
// | |
// These are actually templates, which are...
{
using The_container = My_container;
// ... template template parameter of this container.
}
// the My_container template might be declared as:
template typename Element_type>
struct My_container
{
Element_type actual_element;
}
```
## Example
I've also prepared an [example project](https://github.com/jdoubleu/catch2-issue-2255), based on CMake, which automatically installs Catch2 [v2.13.6]().
The example code does not make much sense, it exists just for illustration purposes.
All you have to do is to run the following commands
```sh
git clone https://github.com/jdoubleu/catch2-issue-2255.git
cd catch2-issue-2255
cmake -B build/
cmake --build build --target catch2_tttp_feature
./build/catch2_tttp_feature
```
**Additional context**
It currently does not work because of _ambiguous calls to overloaded functions_. The `TEMPLATE_TEST_CASE` macro creates a lot of template helpers.
Using the [`TEMPLATE_TEST_CASE_SIG`](https://github.com/jdoubleu/catch2-issue-2255/blob/main/test.cpp#L82-L93) macro, it becomes clear, that the `get_wrapper` function template is ambiguous:
```
Call to 'get_wrapper' is ambiguous
candidate function [with Cs = ]
candidate function [with node_type = Node]
```
I get the following error, when removing comments around the [`TEMPLATE_TEST_CASE`](https://github.com/jdoubleu/catch2-issue-2255/blob/main/test.cpp#L69-L78), using clang v11.0.1.
Error log
```
~/Projects/catch2-issue-2255/test.cpp:70:28: error: template argument for template template parameter must be a class template or type alias template
Algorithm algo{};
^
~/Projects/catch2-issue-2255/test.cpp:68:1: error: no matching function for call to 'reg_test'
TEMPLATE_TEST_CASE("what I want to do", "", Node, Strict_node)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:17685:35: note: expanded from macro 'TEMPLATE_TEST_CASE'
#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1116:9: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE'
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, typename TestType, __VA_ARGS__ )
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1102:37: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE_2'
(void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \
^~~~~~~~
~/Projects/catch2-issue-2255/test.cpp:68:1: note: in instantiation of member function 'user_code::(anonymous namespace)::ns_____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____1::____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____1, user_code::(anonymous namespace)::ns_____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____1::TemplateTypeList>::____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____1' requested here
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:17685:35: note: expanded from macro 'TEMPLATE_TEST_CASE'
#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1116:46: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE'
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, typename TestType, __VA_ARGS__ )
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:469:46: note: expanded from macro 'INTERNAL_CATCH_UNIQUE_NAME'
# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ )
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:467:55: note: expanded from macro 'INTERNAL_CATCH_UNIQUE_NAME_LINE'
#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line )
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:466:56: note: expanded from macro 'INTERNAL_CATCH_UNIQUE_NAME_LINE2'
#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line
^
:136:1: note: expanded from here
____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____1
^
~/Projects/catch2-issue-2255/test.cpp:68:1: note: candidate template ignored: could not match 'TypeList' against 'TemplateTypeList'
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:17685:35: note: expanded from macro 'TEMPLATE_TEST_CASE'
#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1116:9: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE'
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, typename TestType, __VA_ARGS__ )
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1095:13: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE_2'
INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:899:374: note: expanded from macro 'INTERNAL_CATCH_NTTP_REG_GEN'
#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__)
^
~/Projects/catch2-issue-2255/test.cpp:68:1: error: no matching function for call to 'reg_test'
TEMPLATE_TEST_CASE("what I want to do", "", Node, Strict_node)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:17685:35: note: expanded from macro 'TEMPLATE_TEST_CASE'
#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1116:9: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE'
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, typename TestType, __VA_ARGS__ )
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1102:37: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE_2'
(void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \
^~~~~~~~
~/Projects/catch2-issue-2255/test.cpp:68:1: note: candidate template ignored: could not match 'TypeList' against 'TemplateTypeList'
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:17685:35: note: expanded from macro 'TEMPLATE_TEST_CASE'
#define TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE( __VA_ARGS__ )
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1116:9: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE'
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, typename TestType, __VA_ARGS__ )
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:1095:13: note: expanded from macro 'INTERNAL_CATCH_TEMPLATE_TEST_CASE_2'
INTERNAL_CATCH_NTTP_REG_GEN(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))\
^
~/Projects/catch2-issue-2255/cmake-build-debug/_deps/catch2-src/single_include/catch2/catch.hpp:899:374: note: expanded from macro 'INTERNAL_CATCH_NTTP_REG_GEN'
#define INTERNAL_CATCH_NTTP_REG_GEN(TestFunc, ...) INTERNAL_CATCH_VA_NARGS_IMPL( "dummy", __VA_ARGS__, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER, INTERNAL_CATCH_NTTP_REGISTER0, INTERNAL_CATCH_NTTP_REGISTER0)(TestFunc, __VA_ARGS__)
```
Contributor guide
Assessment
This issue has not been assessed yet.