Allow using only types in TEMPLATE_TEST_CASE_SIG. (#2995)

Right now `TEMPLATE_TEST_CASE_SIG` fails to compile when the signature contains only types:

```
TEMPLATE_TEST_CASE_SIG(
  "TemplateTestSig: compiles with two type parameters",
  "[template][onlytypes]",
  ((typename U, typename V), U, V), (int,int)) {}
```

The trick is to resolve the ambiguity between the two overloads of
`get_wrapper` (`TypeList` and `Nttp`) by making one match more strongly.
We also need to allow `reg_test` to register more than one type.

Add unit tests.

Fixes #2680

---------

Co-authored-by: Martin Hořeňovský <martin.horenovsky@gmail.com>
This commit is contained in:
Clement Courbet
2025-07-08 14:26:25 +02:00
committed by GitHub
parent 8dc9f1a124
commit 2de12cb05f
20 changed files with 182 additions and 32 deletions

View File

@@ -262,6 +262,10 @@ Message from section two
:test-result: PASS TemplateTest: vectors can be sized and resized - int
:test-result: PASS TemplateTest: vectors can be sized and resized - std::string
:test-result: PASS TemplateTest: vectors can be sized and resized - std::tuple<int,float>
:test-result: FAIL TemplateTestSig: compiles with a single int parameter - 1
:test-result: FAIL TemplateTestSig: compiles with a single int parameter - 3
:test-result: FAIL TemplateTestSig: compiles with a single int parameter - 6
:test-result: FAIL TemplateTestSig: compiles with two type parameters - int,int
:test-result: PASS TemplateTestSig: vectors can be sized and resized - (std::tuple<int, float>), 6
:test-result: PASS TemplateTestSig: vectors can be sized and resized - float,4
:test-result: PASS TemplateTestSig: vectors can be sized and resized - int,5

View File

@@ -255,6 +255,10 @@
:test-result: PASS TemplateTest: vectors can be sized and resized - int
:test-result: PASS TemplateTest: vectors can be sized and resized - std::string
:test-result: PASS TemplateTest: vectors can be sized and resized - std::tuple<int,float>
:test-result: FAIL TemplateTestSig: compiles with a single int parameter - 1
:test-result: FAIL TemplateTestSig: compiles with a single int parameter - 3
:test-result: FAIL TemplateTestSig: compiles with a single int parameter - 6
:test-result: FAIL TemplateTestSig: compiles with two type parameters - int,int
:test-result: PASS TemplateTestSig: vectors can be sized and resized - (std::tuple<int, float>), 6
:test-result: PASS TemplateTestSig: vectors can be sized and resized - float,4
:test-result: PASS TemplateTestSig: vectors can be sized and resized - int,5

View File

@@ -2854,7 +2854,7 @@ InternalBenchmark.tests.cpp:<line number>: passed: med == 18. for: 18.0 == 18.0
InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0
Misc.tests.cpp:<line number>: passed:
Misc.tests.cpp:<line number>: passed:
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
test cases: 423 | 313 passed | 90 failed | 6 skipped | 14 failed as expected
assertions: 2273 | 2087 passed | 151 failed | 35 failed as expected

View File

@@ -2843,7 +2843,7 @@ InternalBenchmark.tests.cpp:<line number>: passed: med == 18. for: 18.0 == 18.0
InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0
Misc.tests.cpp:<line number>: passed:
Misc.tests.cpp:<line number>: passed:
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
test cases: 423 | 313 passed | 90 failed | 6 skipped | 14 failed as expected
assertions: 2273 | 2087 passed | 151 failed | 35 failed as expected

View File

@@ -1610,6 +1610,6 @@ due to unexpected exception with message:
Why would you throw a std::string?
===============================================================================
test cases: 419 | 327 passed | 71 failed | 7 skipped | 14 failed as expected
test cases: 423 | 331 passed | 71 failed | 7 skipped | 14 failed as expected
assertions: 2252 | 2087 passed | 130 failed | 35 failed as expected

View File

@@ -12526,6 +12526,42 @@ Misc.tests.cpp:<line number>: PASSED:
with expansion:
5 >= 5
-------------------------------------------------------------------------------
TemplateTestSig: compiles with a single int parameter - 1
-------------------------------------------------------------------------------
Misc.tests.cpp:<line number>
...............................................................................
No assertions in test case 'TemplateTestSig: compiles with a single int parameter - 1'
-------------------------------------------------------------------------------
TemplateTestSig: compiles with a single int parameter - 3
-------------------------------------------------------------------------------
Misc.tests.cpp:<line number>
...............................................................................
No assertions in test case 'TemplateTestSig: compiles with a single int parameter - 3'
-------------------------------------------------------------------------------
TemplateTestSig: compiles with a single int parameter - 6
-------------------------------------------------------------------------------
Misc.tests.cpp:<line number>
...............................................................................
No assertions in test case 'TemplateTestSig: compiles with a single int parameter - 6'
-------------------------------------------------------------------------------
TemplateTestSig: compiles with two type parameters - int,int
-------------------------------------------------------------------------------
Misc.tests.cpp:<line number>
...............................................................................
No assertions in test case 'TemplateTestSig: compiles with two type parameters - int,int'
-------------------------------------------------------------------------------
TemplateTestSig: vectors can be sized and resized - (std::tuple<int, float>), 6
-------------------------------------------------------------------------------
@@ -19012,6 +19048,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED:
===============================================================================
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
test cases: 423 | 313 passed | 90 failed | 6 skipped | 14 failed as expected
assertions: 2273 | 2087 passed | 151 failed | 35 failed as expected

View File

@@ -12519,6 +12519,42 @@ Misc.tests.cpp:<line number>: PASSED:
with expansion:
5 >= 5
-------------------------------------------------------------------------------
TemplateTestSig: compiles with a single int parameter - 1
-------------------------------------------------------------------------------
Misc.tests.cpp:<line number>
...............................................................................
No assertions in test case 'TemplateTestSig: compiles with a single int parameter - 1'
-------------------------------------------------------------------------------
TemplateTestSig: compiles with a single int parameter - 3
-------------------------------------------------------------------------------
Misc.tests.cpp:<line number>
...............................................................................
No assertions in test case 'TemplateTestSig: compiles with a single int parameter - 3'
-------------------------------------------------------------------------------
TemplateTestSig: compiles with a single int parameter - 6
-------------------------------------------------------------------------------
Misc.tests.cpp:<line number>
...............................................................................
No assertions in test case 'TemplateTestSig: compiles with a single int parameter - 6'
-------------------------------------------------------------------------------
TemplateTestSig: compiles with two type parameters - int,int
-------------------------------------------------------------------------------
Misc.tests.cpp:<line number>
...............................................................................
No assertions in test case 'TemplateTestSig: compiles with two type parameters - int,int'
-------------------------------------------------------------------------------
TemplateTestSig: vectors can be sized and resized - (std::tuple<int, float>), 6
-------------------------------------------------------------------------------
@@ -19001,6 +19037,6 @@ Misc.tests.cpp:<line number>
Misc.tests.cpp:<line number>: PASSED:
===============================================================================
test cases: 419 | 313 passed | 86 failed | 6 skipped | 14 failed as expected
assertions: 2269 | 2087 passed | 147 failed | 35 failed as expected
test cases: 423 | 313 passed | 90 failed | 6 skipped | 14 failed as expected
assertions: 2273 | 2087 passed | 151 failed | 35 failed as expected

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuitesloose text artifact
>
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2281" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<testsuite name="<exe-name>" errors="17" failures="134" skipped="12" tests="2285" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties>
<property name="random-seed" value="1"/>
<property name="filters" value="&quot;*&quot; ~[!nonportable] ~[!benchmark] ~[approvals]"/>
@@ -1475,6 +1475,10 @@ at Misc.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/resizing smaller changes size but not capacity/We can use the 'swap trick' to reset the capacity" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/reserving bigger changes capacity but not size" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/reserving smaller does not change size or capacity" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: compiles with a single int parameter - 1" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: compiles with a single int parameter - 3" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: compiles with a single int parameter - 6" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: compiles with two type parameters - int,int" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6/resizing bigger changes size and capacity" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6/resizing smaller changes size but not capacity" time="{duration}" status="run"/>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
<testsuite name="<exe-name>" errors="17" failures="130" skipped="12" tests="2281" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<testsuite name="<exe-name>" errors="17" failures="134" skipped="12" tests="2285" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
<properties>
<property name="random-seed" value="1"/>
<property name="filters" value="&quot;*&quot; ~[!nonportable] ~[!benchmark] ~[approvals]"/>
@@ -1474,6 +1474,10 @@ at Misc.tests.cpp:<line number>
<testcase classname="<exe-name>.global" name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/resizing smaller changes size but not capacity/We can use the 'swap trick' to reset the capacity" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/reserving bigger changes capacity but not size" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/reserving smaller does not change size or capacity" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: compiles with a single int parameter - 1" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: compiles with a single int parameter - 3" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: compiles with a single int parameter - 6" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: compiles with two type parameters - int,int" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6/resizing bigger changes size and capacity" time="{duration}" status="run"/>
<testcase classname="<exe-name>.global" name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6/resizing smaller changes size but not capacity" time="{duration}" status="run"/>

View File

@@ -1893,6 +1893,10 @@ at Misc.tests.cpp:<line number>
<testCase name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/resizing smaller changes size but not capacity/We can use the 'swap trick' to reset the capacity" duration="{duration}"/>
<testCase name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/reserving bigger changes capacity but not size" duration="{duration}"/>
<testCase name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/reserving smaller does not change size or capacity" duration="{duration}"/>
<testCase name="TemplateTestSig: compiles with a single int parameter - 1" duration="{duration}"/>
<testCase name="TemplateTestSig: compiles with a single int parameter - 3" duration="{duration}"/>
<testCase name="TemplateTestSig: compiles with a single int parameter - 6" duration="{duration}"/>
<testCase name="TemplateTestSig: compiles with two type parameters - int,int" duration="{duration}"/>
<testCase name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6" duration="{duration}"/>
<testCase name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6/resizing bigger changes size and capacity" duration="{duration}"/>
<testCase name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6/resizing smaller changes size but not capacity" duration="{duration}"/>

View File

@@ -1892,6 +1892,10 @@ at Misc.tests.cpp:<line number>
<testCase name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/resizing smaller changes size but not capacity/We can use the 'swap trick' to reset the capacity" duration="{duration}"/>
<testCase name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/reserving bigger changes capacity but not size" duration="{duration}"/>
<testCase name="TemplateTest: vectors can be sized and resized - std::tuple&lt;int,float>/reserving smaller does not change size or capacity" duration="{duration}"/>
<testCase name="TemplateTestSig: compiles with a single int parameter - 1" duration="{duration}"/>
<testCase name="TemplateTestSig: compiles with a single int parameter - 3" duration="{duration}"/>
<testCase name="TemplateTestSig: compiles with a single int parameter - 6" duration="{duration}"/>
<testCase name="TemplateTestSig: compiles with two type parameters - int,int" duration="{duration}"/>
<testCase name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6" duration="{duration}"/>
<testCase name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6/resizing bigger changes size and capacity" duration="{duration}"/>
<testCase name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6/resizing smaller changes size but not capacity" duration="{duration}"/>

View File

@@ -4567,5 +4567,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
ok {test-number} -
# xmlentitycheck
ok {test-number} -
1..2281
1..2285

View File

@@ -4556,5 +4556,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0
ok {test-number} -
# xmlentitycheck
ok {test-number} -
1..2281
1..2285

View File

@@ -634,6 +634,14 @@
##teamcity[testFinished name='TemplateTest: vectors can be sized and resized - std::string' duration="{duration}"]
##teamcity[testStarted name='TemplateTest: vectors can be sized and resized - std::tuple<int,float>']
##teamcity[testFinished name='TemplateTest: vectors can be sized and resized - std::tuple<int,float>' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: compiles with a single int parameter - 1']
##teamcity[testFinished name='TemplateTestSig: compiles with a single int parameter - 1' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: compiles with a single int parameter - 3']
##teamcity[testFinished name='TemplateTestSig: compiles with a single int parameter - 3' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: compiles with a single int parameter - 6']
##teamcity[testFinished name='TemplateTestSig: compiles with a single int parameter - 6' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: compiles with two type parameters - int,int']
##teamcity[testFinished name='TemplateTestSig: compiles with two type parameters - int,int' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: vectors can be sized and resized - (std::tuple<int, float>), 6']
##teamcity[testFinished name='TemplateTestSig: vectors can be sized and resized - (std::tuple<int, float>), 6' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: vectors can be sized and resized - float,4']

View File

@@ -634,6 +634,14 @@
##teamcity[testFinished name='TemplateTest: vectors can be sized and resized - std::string' duration="{duration}"]
##teamcity[testStarted name='TemplateTest: vectors can be sized and resized - std::tuple<int,float>']
##teamcity[testFinished name='TemplateTest: vectors can be sized and resized - std::tuple<int,float>' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: compiles with a single int parameter - 1']
##teamcity[testFinished name='TemplateTestSig: compiles with a single int parameter - 1' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: compiles with a single int parameter - 3']
##teamcity[testFinished name='TemplateTestSig: compiles with a single int parameter - 3' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: compiles with a single int parameter - 6']
##teamcity[testFinished name='TemplateTestSig: compiles with a single int parameter - 6' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: compiles with two type parameters - int,int']
##teamcity[testFinished name='TemplateTestSig: compiles with two type parameters - int,int' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: vectors can be sized and resized - (std::tuple<int, float>), 6']
##teamcity[testFinished name='TemplateTestSig: vectors can be sized and resized - (std::tuple<int, float>), 6' duration="{duration}"]
##teamcity[testStarted name='TemplateTestSig: vectors can be sized and resized - float,4']

View File

@@ -14483,6 +14483,18 @@ Message from section two
</Section>
<OverallResult success="true" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: compiles with a single int parameter - 1" tags="[singleint][template]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<OverallResult success="false" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: compiles with a single int parameter - 3" tags="[singleint][template]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<OverallResult success="false" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: compiles with a single int parameter - 6" tags="[singleint][template]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<OverallResult success="false" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: compiles with two type parameters - int,int" tags="[onlytypes][template]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<OverallResult success="false" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6" tags="[nttp][template][vector]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<Original>
@@ -21971,6 +21983,6 @@ Approx( -1.95996398454005449 )
</Section>
<OverallResult success="true" skips="0"/>
</TestCase>
<OverallResults successes="2087" failures="147" expectedFailures="35" skips="12"/>
<OverallResultsCases successes="313" failures="86" expectedFailures="14" skips="6"/>
<OverallResults successes="2087" failures="151" expectedFailures="35" skips="12"/>
<OverallResultsCases successes="313" failures="90" expectedFailures="14" skips="6"/>
</Catch2TestRun>

View File

@@ -14483,6 +14483,18 @@ Message from section two
</Section>
<OverallResult success="true" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: compiles with a single int parameter - 1" tags="[singleint][template]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<OverallResult success="false" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: compiles with a single int parameter - 3" tags="[singleint][template]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<OverallResult success="false" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: compiles with a single int parameter - 6" tags="[singleint][template]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<OverallResult success="false" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: compiles with two type parameters - int,int" tags="[onlytypes][template]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<OverallResult success="false" skips="0"/>
</TestCase>
<TestCase name="TemplateTestSig: vectors can be sized and resized - (std::tuple&lt;int, float>), 6" tags="[nttp][template][vector]" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Misc.tests.cpp" >
<Original>
@@ -21970,6 +21982,6 @@ Approx( -1.95996398454005449 )
</Section>
<OverallResult success="true" skips="0"/>
</TestCase>
<OverallResults successes="2087" failures="147" expectedFailures="35" skips="12"/>
<OverallResultsCases successes="313" failures="86" expectedFailures="14" skips="6"/>
<OverallResults successes="2087" failures="151" expectedFailures="35" skips="12"/>
<OverallResultsCases successes="313" failures="90" expectedFailures="14" skips="6"/>
</Catch2TestRun>

View File

@@ -334,6 +334,10 @@ TEMPLATE_TEST_CASE( "TemplateTest: vectors can be sized and resized", "[vector][
}
}
TEMPLATE_TEST_CASE_SIG("TemplateTestSig: compiles with a single int parameter", "[template][singleint]", ((int V), V), 1, 3, 6) {}
TEMPLATE_TEST_CASE_SIG("TemplateTestSig: compiles with two type parameters", "[template][onlytypes]", ((typename U, typename V), U, V), (int,int)) {}
TEMPLATE_TEST_CASE_SIG("TemplateTestSig: vectors can be sized and resized", "[vector][template][nttp]", ((typename TestType, int V), TestType, V), (int,5), (float,4), (std::string,15), ((std::tuple<int, float>), 6)) {
std::vector<TestType> v(V);