Catch を使用してテンプレート化されたクラスをテストする良い方法を探しています。私はほとんど動作するものを持っています:
#define RUN_ALL(fn, params) \
fn<uint8_t, bool>(params); \
fn<uint8_t, char>(params); \
fn<uint16_t, bool>(params); \
fn<uint16_t, char>(params); \
fn<uint32_t, bool>(params); \
fn<uint32_t, char>(params); \
fn<uint64_t, bool>(params); \
fn<uint64_t, char>(params);
template<typename A, typename B>
void test_number_one() {
REQUIRE(...)
}
TEST_CASE("Foo::Foo() works nicely", "[SmallGraph]") {
RUN_ALL(test_number_one)
}
このセットアップは、最初の失敗までのみ実行されます。これは、8 つのケースすべてが同じように失敗する可能性が高いため、問題ありません。ただし、障害が発生したときにどのテンプレート引数のセットが使用されているかを知っておくと便利です。私の考えはこれを行うことです:
#define RUN_ALL_P(fn, params) \
INFO("Testing <uint8_t, bool>"); \
fn<uint8_t, bool>(params); \
INFO("Testing <uint8_t, char>"); \
fn<uint8_t, char>(params); \
INFO("Testing <uint16_t, bool>"); \
fn<uint16_t, bool>(params); \
...
ただし、RUN_ALL で複数の INFO を使用することはできません。これを行うと、重複した識別子を持つコードが生成されるためです。
FOO.cpp:270:3: error: redefinition of 'scopedMessage270'
RUN_ALL(test_number_one);
(RUN_ALL(test_number_one)
は 270 行目に表示されます。)
すべてのテスト関数を同じ署名にする必要がない回避策のアイデアはありますか?
(また、CATCH を使用したテンプレート コードのテストに関する記事へのポインタ、および一般的な例外処理 (つまり、try/catch) に関する多くの結果を取得せずにそのような記事を検索する方法に関する提案も歓迎します。)