blob: 9f680025b00b72c70d4758c7189ec33ca2a0bfdb [file] [log] [blame]
#include "doctest.h"
#include <vector>
// typedefs are required if variadic macro support is not available (otherwise the commas are a problem)
typedef doctest::Types<char, short, int> int_types;
typedef doctest::Types<double, double> float_types; // note that types won't be filtered for uniqueness
// =================================================================================================
// NORMAL TEMPLATED TEST CASES
// =================================================================================================
TEST_CASE_TEMPLATE("signed integers stuff", T, int_types) {
T var = T();
--var;
CHECK(var == -1);
}
// teach the library how to stringify this type - otherwise <> will be used
TYPE_TO_STRING(std::vector<int>);
TEST_CASE_TEMPLATE("vector stuff", T, doctest::Types<std::vector<int> >) {
T vec(10);
CHECK(vec.size() == 20); // fill fail
}
// =================================================================================================
// NAMED TEMPLATED TEST CASES WITH DEFERRED INSTANTIATION
// =================================================================================================
TEST_CASE_TEMPLATE_DEFINE("default construction", T, test_id) {
T var = T();
CHECK(doctest::Approx(var) == T());
}
TEST_CASE_TEMPLATE_INSTANTIATE(test_id, int_types);
TEST_CASE_TEMPLATE_INSTANTIATE(test_id, float_types);
// =================================================================================================
// MULTIPLE TYPES AS PARAMETERS
// =================================================================================================
template <typename first, typename second>
struct TypePair
{
typedef first A;
typedef second B;
};
typedef doctest::Types<
TypePair<int, char>,
TypePair<char, int>,
TypePair<bool, int>
> pairs;
TEST_CASE_TEMPLATE("multiple types", T, pairs) {
typedef typename T::A T1;
typedef typename T::B T2;
T1 t1 = T1();
T2 t2 = T2();
// use T1 and T2 types
CHECK(t1 == T1());
CHECK(t2 != T2());
}
// if variadic macros are supported then "TypePair<int, int>" can be passed directly to the macro (otherwise the commas are a problem)
// currently the string result will be "int_pair" instead of "TypePair<int, int>" because of the way the type stringification works
typedef TypePair<int, int> int_pair;
TYPE_TO_STRING(int_pair);
TEST_CASE_TEMPLATE("bad stringification of type pair", T, doctest::Types<int_pair>) {
typedef typename T::A T1;
typedef typename T::B T2;
T1 t1 = T1();
T2 t2 = T2();
// use T1 and T2 types
CHECK(t1 == T1());
CHECK(t2 != T2());
}