Ich bin auf der Suche nach einer guten Möglichkeit, Catch zu verwenden, um eine Vorlagenklasse zu testen. Ich habe etwas, das fast funktioniert:Test C++ Template-Klasse mit Catch-Framework
#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)
}
Diese Einstellung nur bis zum ersten Ausfall führen wird, was in Ordnung ist, weil es sehr wahrscheinlich ist, dass alle acht Fälle die gleiche Art und Weise fehlschlagen. Es wäre jedoch hilfreich zu wissen, welche Gruppe von Vorlagenargumenten bei einem Fehler verwendet wird. Meine Idee ist es, dies zu tun:
#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); \
...
Allerdings habe ich nicht mehr als eine INFO in RUN_ALL weil so Code generiert mit einer doppelten Kennung tun können.
FOO.cpp:270:3: error: redefinition of 'scopedMessage270'
RUN_ALL(test_number_one);
(RUN_ALL(test_number_one)
erscheint auf der Leitung 270.)
Alle Ideen für eine Abhilfe, die nicht alle Testfunktionen auf die gleiche Signatur erfordert?
(Ich würde auch gerne Hinweise auf Artikel zum Testen von Vorlagencode mit CATCH, sowie Vorschläge, wie man nach solchen Artikeln suchen, ohne eine Reihe von Ergebnissen über die allgemeine Handhabung der Ausnahme zu erhalten - dh versuchen/fangen.)
Kurze Antwort: Verwenden Sie functors: http://stackoverflow.com/questions/38494276/c-single-function- pointer-for-all-template-instances – Zack