Я ищу хороший способ использовать Catch для тестирования шаблонного класса. У меня есть что-то, что почти работает:Тестирование класса шаблонов C++ с использованием платформы 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); \
...
Однако, я не могу использовать более чем одну INFO в RUN_ALL, так как это создает код с дублирующим идентификатором.
FOO.cpp:270:3: error: redefinition of 'scopedMessage270'
RUN_ALL(test_number_one);
Любые идеи для решения проблемы, которая не требует все функции тестирования одной и той же подписи (RUN_ALL(test_number_one)
на линии 270. появляется)?
(Я бы также приветствовал указатели на статьи о тестировании кода шаблона с помощью CATCH, а также предложения по поиску таких статей без получения результатов об общей обработке исключений - т. Е. Try/catch.)
Короткий ответ: Используйте функторы: http://stackoverflow.com/questions/38494276/c-single-function- pointer-for-all-template-экземпляры – Zack