[英]How do I iterate over all permutations of compile-time parameters in Catch2?
我有一個函數,我想用Catch2測試每個可能的輸入。 這個函數有多個編譯時常量作為它的參數。 為簡單起見,假設我有兩個枚舉
enum class A { a, b};
enum class B { a, b};
和功能
template<A a, B b> void foo() { /* do something */ }
我想用A
和B
的值的每種可能組合進行測試。 如何在 Catch2 中實現這一點? 我希望這是可能的,而不必列出所有可能的排列。
A a = GENERATE(A::a, A::b);
B b = GENERATE(B::a, B::b);
不能解決問題,因為我希望它們成為編譯時常量,即我需要constexpr A a = GENERATE(...)
不起作用。
使用TEMPLATE_TEST_CASE_SIG
會起作用:
TEMPLATE_TEST_CASE_SIG("foo works", "[foo]",
((A T, B V), T, V), (A::a,B::a), (A::b, B::a), (A::a,B::b),(A::b,B::b)) {
foo<T, V>();
}
但這需要我列出 A 和 B 的每個可能排列,這對於任何大於 2*2 值的示例都是不可維護的。
我讓它在沒有模板函數和constexpr
的情況下工作(這不是你想要的),但這應該讓你更接近
#include "catch2/catch_all.hpp"
#include <iostream>
enum class A {
a, b
};
enum class B {
a, b
};
// No longer a template function, but serves to print the enumeration
void foo(A a, B b) {
std::cout << " A: " << static_cast<int>(a) << " B: " << static_cast<int>(b) << std::endl;
}
TEST_CASE("Foo") {
//constexpr is still refusing to compile here, so i had to remove it.
A a = GENERATE(as <A>{}, A::a, A::b);
// ^ --- This is what gets us our enum to 'generate'
B b = GENERATE(as <B>{}, B::a, B::b);
foo(a, b);
}
這會生成輸出:
A: 0 B: 0
A: 0 B: 1
A: 1 B: 0
A: 1 B: 1
===============================================================================
test cases: 1 | 1 passed
assertions: - none -
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.