#include #include "example.hpp" #include #include #include #include /// [test_case] template struct test_case { metal::invoke> sequence; test_case() : sequence(Size{}) { /* set-up */ } ~test_case() { /* tear-down */ } void operator ()() { /* algorithm(this->sequence) */ } }; /// [test_case] struct A {}; struct Z {}; constexpr std::size_t MIN_SIZE = 0; constexpr std::size_t MAX_SIZE = 1; /// [automatic] template struct test_cases : Cases... { void operator()() { // call operator () on every base class void(std::initializer_list{(static_cast(this)->operator()(), 0)...}); } }; template auto generate_test_cases() -> metal::apply< metal::lambda, metal::transform< metal::partial, metal::lambda>, metal::cartesian > > { return {}; } using containers = metal::list< metal::lambda, metal::lambda, metal::lambda >; using types = metal::list; using sizes = metal::numbers<0, /* ..., */ MAX_SIZE>; void test() { auto cases = generate_test_cases(); // generate all test cases cases(); // run } /// [automatic] /// [inspect] IS_SAME( decltype(generate_test_cases()), test_cases< test_case, A, metal::number>, /* ... */ test_case, A, metal::number>, /* ... */ test_case, Z, metal::number>, /* ... */ test_case, Z, metal::number>, test_case, A, metal::number>, /* ... */ test_case, A, metal::number>, /* ... */ test_case, Z, metal::number>, /* ... */ test_case, Z, metal::number>, test_case, A, metal::number>, /* ... */ test_case, A, metal::number>, /* ... */ test_case, Z, metal::number>, /* ... */ test_case, Z, metal::number> > ); /// [inspect]