File size: 2,712 Bytes
8ae5fc5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include <metal.hpp>
#include "example.hpp"
#include <forward_list>
#include <list>
#include <utility>
#include <vector>
/// [test_case]
template<class Container, class Type, class Size>
struct test_case {
metal::invoke<Container, Type, std::allocator<Type>> 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<class... Cases>
struct test_cases : Cases... {
void operator()() {
// call operator () on every base class
void(std::initializer_list<int>{(static_cast<Cases*>(this)->operator()(), 0)...});
}
};
template<class Containers, class Types, class Sizes>
auto generate_test_cases()
-> metal::apply<
metal::lambda<test_cases>,
metal::transform<
metal::partial<metal::lambda<metal::apply>, metal::lambda<test_case>>,
metal::cartesian<Containers, Types, Sizes>
>
> {
return {};
}
using containers = metal::list<
metal::lambda<std::forward_list>,
metal::lambda<std::list>,
metal::lambda<std::vector>
>;
using types = metal::list<A, /* ..., */ Z>;
using sizes = metal::numbers<0, /* ..., */ MAX_SIZE>;
void test() {
auto cases = generate_test_cases<containers, types, sizes>(); // generate all test cases
cases(); // run
}
/// [automatic]
/// [inspect]
IS_SAME(
decltype(generate_test_cases<containers, types, sizes>()),
test_cases<
test_case<metal::lambda<std::forward_list>, A, metal::number<MIN_SIZE>>,
/* ... */
test_case<metal::lambda<std::forward_list>, A, metal::number<MAX_SIZE>>,
/* ... */
test_case<metal::lambda<std::forward_list>, Z, metal::number<MIN_SIZE>>,
/* ... */
test_case<metal::lambda<std::forward_list>, Z, metal::number<MAX_SIZE>>,
test_case<metal::lambda<std::list>, A, metal::number<MIN_SIZE>>,
/* ... */
test_case<metal::lambda<std::list>, A, metal::number<MAX_SIZE>>,
/* ... */
test_case<metal::lambda<std::list>, Z, metal::number<MIN_SIZE>>,
/* ... */
test_case<metal::lambda<std::list>, Z, metal::number<MAX_SIZE>>,
test_case<metal::lambda<std::vector>, A, metal::number<MIN_SIZE>>,
/* ... */
test_case<metal::lambda<std::vector>, A, metal::number<MAX_SIZE>>,
/* ... */
test_case<metal::lambda<std::vector>, Z, metal::number<MIN_SIZE>>,
/* ... */
test_case<metal::lambda<std::vector>, Z, metal::number<MAX_SIZE>>
>
);
/// [inspect]
|