mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-11-04 05:59:32 +01:00 
			
		
		
		
	Docs: added docs for TEMPLATE_PRODUCT_TEST_CASE
This commit is contained in:
		@@ -95,7 +95,8 @@ Other than the additional prefixes and the formatting in the console reporter th
 | 
			
		||||
## Type parametrised test cases
 | 
			
		||||
 | 
			
		||||
In addition to `TEST_CASE`s, Catch2 also supports test cases parametrised
 | 
			
		||||
by type, in the form of `TEMPLATE_TEST_CASE`.
 | 
			
		||||
by types, in the form of `TEMPLATE_TEST_CASE` and
 | 
			
		||||
`TEMPLATE_PRODUCT_TEST_CASE`.
 | 
			
		||||
 | 
			
		||||
* **TEMPLATE_TEST_CASE(** _test name_ , _tags_,  _type1_, _type2_, ..., _typen_ **)**
 | 
			
		||||
 | 
			
		||||
@@ -147,9 +148,48 @@ TEMPLATE_TEST_CASE( "vectors can be sized and resized", "[vector][template]", in
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
* **TEMPLATE_PRODUCT_TEST_CASE(** _test name_ , _tags_, (_template-type1_, _template-type2_, ..., _template-typen_), (_template-arg1_, _template-arg2_, ..., _template-argm_) **)**
 | 
			
		||||
 | 
			
		||||
_template-type1_ through _template-typen_ is list of template template
 | 
			
		||||
types which should be combined with each of _template-arg1_ through
 | 
			
		||||
 _template-argm_, resulting in _n * m_ test cases. Inside the test case,
 | 
			
		||||
the resulting type is available under the name of `TestType`.
 | 
			
		||||
 | 
			
		||||
To specify more than 1 type as a single _template-type_ or _template-arg_,
 | 
			
		||||
you must enclose the types in an additional set of parentheses, e.g.
 | 
			
		||||
`((int, float), (char, double))` specifies 2 template-args, each
 | 
			
		||||
consisting of 2 concrete types (`int`, `float` and `char`, `double`
 | 
			
		||||
respectively). You can also omit the outer set of parentheses if you
 | 
			
		||||
specify only one type as the full set of either the _template-types_,
 | 
			
		||||
or the _template-args_.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
```
 | 
			
		||||
template< typename T>
 | 
			
		||||
struct Foo {
 | 
			
		||||
    size_t size() {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEMPLATE_PRODUCT_TEST_CASE("A Template product test case", "[template][product]", (std::vector, Foo), (int, float)) {
 | 
			
		||||
    TestType x;
 | 
			
		||||
    REQUIRE(x.size() == 0);
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You can also have different arities in the _template-arg_ packs:
 | 
			
		||||
```
 | 
			
		||||
TEMPLATE_PRODUCT_TEST_CASE("Product with differing arities", "[template][product]", std::tuple, (int, (int, double), (int, double, float))) {
 | 
			
		||||
    TestType x;
 | 
			
		||||
    REQUIRE(std::tuple_size<TestType>::value >= 1);
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
_While there is an upper limit on the number of types you can specify
 | 
			
		||||
in single `TEMPLATE_TEST_CASE`, the limit is very high and should not
 | 
			
		||||
be encountered in practice._
 | 
			
		||||
in single `TEMPLATE_TEST_CASE` or `TEMPLATE_PRODUCT_TEST_CASE`, the limit
 | 
			
		||||
is very high and should not be encountered in practice._
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -31,16 +31,22 @@ class UniqueTestsFixture {
 | 
			
		||||
The two test cases here will create uniquely-named derived classes of UniqueTestsFixture and thus can access the `getID()` protected method and `conn` member variables. This ensures that both the test cases are able to create a DBConnection using the same method (DRY principle) and that any ID's created are unique such that the order that tests are executed does not matter.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Catch2 also provides `TEMPLATE_TEST_CASE_METHOD` that can be used together
 | 
			
		||||
with templated fixtures to perform tests for multiple different types.
 | 
			
		||||
However, unlike `TEST_CASE_METHOD`, `TEMPLATE_TEST_CASE_METHOD` requires
 | 
			
		||||
the tag specification to be non-empty, as it is followed by further macros
 | 
			
		||||
arguments.
 | 
			
		||||
Catch2 also provides `TEMPLATE_TEST_CASE_METHOD` and
 | 
			
		||||
`TEMPLATE_PRODUCT_TEST_CASE_METHOD` that can be used together
 | 
			
		||||
with templated fixtures and templated template fixtures to perform
 | 
			
		||||
tests for multiple different types. Unlike `TEST_CASE_METHOD`,
 | 
			
		||||
`TEMPLATE_TEST_CASE_METHOD` and `TEMPLATE_PRODUCT_TEST_CASE_METHOD` do
 | 
			
		||||
require the tag specification to be non-empty, as it is followed by
 | 
			
		||||
further macro arguments.
 | 
			
		||||
 | 
			
		||||
Also note that, because of limitations of the C++ preprocessor, if you
 | 
			
		||||
want to specify a type with multiple template parameters, you need to
 | 
			
		||||
enclose it in parentheses, e.g. `std::map<int, std::string>` needs to be
 | 
			
		||||
passed as `(std::map<int, std::string>)`.
 | 
			
		||||
In the case of `TEMPLATE_PRODUCT_TEST_CASE_METHOD`, if a member of the
 | 
			
		||||
type list should consist of more than single type, it needs to be enclosed
 | 
			
		||||
in another pair of parentheses, e.g. `(std::map, std::pair)` and
 | 
			
		||||
`((int, float), (char, double))`.
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
```cpp
 | 
			
		||||
@@ -54,11 +60,29 @@ struct Template_Fixture {
 | 
			
		||||
TEMPLATE_TEST_CASE_METHOD(Template_Fixture,"A TEMPLATE_TEST_CASE_METHOD based test run that succeeds", "[class][template]", int, float, double) {
 | 
			
		||||
    REQUIRE( Template_Fixture<TestType>::m_a == 1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
struct Template_Template_Fixture {
 | 
			
		||||
    Template_Template_Fixture() {}
 | 
			
		||||
 | 
			
		||||
    T m_a;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<typename T>
 | 
			
		||||
struct Foo_class {
 | 
			
		||||
    size_t size() {
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TEMPLATE_PRODUCT_TEST_CASE_METHOD(Template_Template_Fixture, "A TEMPLATE_PRODUCT_TEST_CASE_METHOD based test succeeds", "[class][template]", (Foo_class, std::vector), int) {
 | 
			
		||||
    REQUIRE( Template_Template_Fixture<TestType>::m_a.size() == 0 );
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
_While there is an upper limit on the number of types you can specify
 | 
			
		||||
in single `TEMPLATE_TEST_CASE`, the limit is very high and should not
 | 
			
		||||
be encountered in practice._
 | 
			
		||||
in single `TEMPLATE_TEST_CASE_METHOD` or `TEMPLATE_PRODUCT_TEST_CASE_METHOD`,
 | 
			
		||||
the limit is very high and should not be encountered in practice._
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -260,8 +260,9 @@ Do not write your tests in header files!
 | 
			
		||||
## Type parametrised test cases
 | 
			
		||||
 | 
			
		||||
Test cases in Catch2 can be also parametrised by type, via the
 | 
			
		||||
`TEMPLATE_TEST_CASE` macro, which behaves in the same way the `TEST_CASE`
 | 
			
		||||
macro, but is run for every type.
 | 
			
		||||
`TEMPLATE_TEST_CASE` and `TEMPLATE_PRODUCT_TEST_CASE` macros,
 | 
			
		||||
which behave in the same way the `TEST_CASE` macro, but are run for
 | 
			
		||||
every type or type combination.
 | 
			
		||||
 | 
			
		||||
For more details, see our documentation on [test cases and
 | 
			
		||||
sections](test-cases-and-sections.md#type-parametrised-test-cases).
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user