簡體   English   中英

如何迭代 Catch2 中編譯時參數的所有排列?

[英]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 */ }

我想用AB的值的每種可能組合進行測試。 如何在 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 值的示例都是不可維護的。

最小的工作示例

https://godbolt.org/z/TzTG7PnW6

我讓它在沒有模板函數和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM