Catch2:测试两个类型列表的所有排列



我需要在Catch2中编写一些单元测试,其中每个测试用例都应该针对两个类型列表的每个可能排列执行。我喜欢这样的东西

// Some types defined in my project
class A;
class B;
PERMUTATION_TEST_CASE ("Foo", (A, B), (float, double))
{
TestTypeX x;
TestTypeY y;
}

其中测试用例将使用执行4次

TestTypeX = A, TestTypeY = float
TestTypeX = A, TestTypeY = double
TestTypeX = B, TestTypeY = float
TestTypeX = B, TestTypeY = double

或者,类似的东西也可能是

constexpr A a;
constexpr B b;
TEMPLATE_TEST_CASE ("Foo", float, double)
{
auto x = GENERATE (a, b); // does not work because a and b have different types
TestType y; 
}

据我所知,catch2中没有这样的东西。在类型参数化测试用例中,有TEMPLATE_TEST_CASE解决了单个类型列表的问题,但没有解决两个列表的每个排列的问题,还有TEMPLATE_PRODUCT_TEST_CASE解决了第一个类型是模板的情况下的问题,然后用第二个列表的每种类型实例化——这也不是我在这里需要的。

有没有合适的catch2机制来解决我现在忽略的问题?我使用的是Catch2 3.1.0版本。

我在现实世界中的需求比这个2x2的例子大得多,所以手动指定所有排列不是我最喜欢的选择。

您可以创建类型列表的笛卡尔乘积,然后:

using MyTypes = cross_product<type_list<A, B>, type_list<float, double>>::type;
// using MyTypes = type_list<std::pair<A, float>, std::pair<A, double>,
//                           std::pair<B, float>, std::pair<B, double>>;
TEMPLATE_LIST_TEST_CASE("some_name", "[xxx]", MyTypes)
{
using TestTypeX = typename TestType::first_type;  // A or B
using TestTypeY = typename TestType::second_type; // float or double
// ...
}

以同样的方式,TEMPLATE_PRODUCT_TEST_CASE可以(ab(与包装器类型一起使用:

template <typename T>
struct A_with
{
using first_type = A;
using second_type = T;
};
template <typename T>
struct B_with
{
using first_type = B;
using second_type = T;
};
TEMPLATE_PRODUCT_TEST_CASE("some name", "[xxx]", (A_with, B_with), (float, double))
{
using TestTypeX = typename TestType::first_type;  // A or B
using TestTypeY = typename TestType::second_type; // float or double
// ...
}

最新更新