You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
5.8 KiB
103 lines
5.8 KiB
4 months ago
|
|
||
|
#ifndef FRUIT_TESTS_META_COMMON_H
|
||
|
#define FRUIT_TESTS_META_COMMON_H
|
||
|
|
||
|
#define FRUIT_IN_META_TEST 1
|
||
|
|
||
|
#include <fruit/impl/injection_debug_errors.h>
|
||
|
#include <fruit/impl/injection_errors.h>
|
||
|
#include <fruit/impl/meta/basics.h>
|
||
|
#include <fruit/impl/meta/errors.h>
|
||
|
#include <fruit/impl/meta/immutable_map.h>
|
||
|
#include <fruit/impl/meta/set.h>
|
||
|
#include <fruit/impl/meta/vector.h>
|
||
|
|
||
|
using namespace std;
|
||
|
using namespace fruit;
|
||
|
using namespace fruit::impl;
|
||
|
using namespace fruit::impl::meta;
|
||
|
|
||
|
template <typename T, typename U>
|
||
|
struct DifferentError {
|
||
|
static_assert(AlwaysFalse<T>::value, "T and U are different, but should have been equal/equivalent.");
|
||
|
};
|
||
|
|
||
|
template <typename T, typename U>
|
||
|
struct SameError {
|
||
|
static_assert(AlwaysFalse<T>::value, "T and U are equal/equivalent but should have been different.");
|
||
|
};
|
||
|
|
||
|
struct DifferentErrorTag {
|
||
|
template <typename T, typename U>
|
||
|
using apply = DifferentError<T, U>;
|
||
|
};
|
||
|
|
||
|
struct SameErrorTag {
|
||
|
template <typename T, typename U>
|
||
|
using apply = SameError<T, U>;
|
||
|
};
|
||
|
|
||
|
template <typename... Types>
|
||
|
using ToSet = Vector<Types...>;
|
||
|
|
||
|
struct ConstructErrorWithoutUnwrapping {
|
||
|
template <typename ErrorTag, typename... Args>
|
||
|
struct apply {
|
||
|
using type = ConstructError(ErrorTag, Type<Args>...);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
using True = Bool<true>;
|
||
|
using False = Bool<false>;
|
||
|
|
||
|
#undef Assert
|
||
|
|
||
|
#define Assert(...) static_assert(Eval<__VA_ARGS__>::value, "")
|
||
|
#define AssertNot(...) Assert(Not(__VA_ARGS__))
|
||
|
#define AssertSame(...) \
|
||
|
static_assert( \
|
||
|
true || \
|
||
|
sizeof( \
|
||
|
typename CheckIfError<Eval<If(IsSame(__VA_ARGS__), True, \
|
||
|
ConstructErrorWithoutUnwrapping(DifferentErrorTag, __VA_ARGS__))>>::type), \
|
||
|
"")
|
||
|
#define AssertSameType(...) \
|
||
|
static_assert( \
|
||
|
true || sizeof(typename CheckIfError< \
|
||
|
Eval<If(IsSame(__VA_ARGS__), True, ConstructError(DifferentErrorTag, __VA_ARGS__))>>::type), \
|
||
|
"")
|
||
|
#define AssertSameSet(...) \
|
||
|
static_assert( \
|
||
|
true || sizeof(typename CheckIfError< \
|
||
|
Eval<If(IsSameSet(__VA_ARGS__), True, ConstructError(DifferentErrorTag, __VA_ARGS__))>>::type), \
|
||
|
"")
|
||
|
#define AssertSameProof(...) \
|
||
|
static_assert(true || sizeof(typename CheckIfError<Eval<If(IsProofTreeEqualTo(__VA_ARGS__), True, \
|
||
|
ConstructError(DifferentErrorTag, __VA_ARGS__))>>::type), \
|
||
|
"")
|
||
|
#define AssertSameForest(...) \
|
||
|
static_assert(true || sizeof(typename CheckIfError<Eval<CheckForestEqualTo(__VA_ARGS__)>>::type), "")
|
||
|
#define AssertNotSame(...) \
|
||
|
static_assert( \
|
||
|
true || \
|
||
|
sizeof(typename CheckIfError<Eval<If(Not(IsSame(__VA_ARGS__)), True, \
|
||
|
ConstructErrorWithoutUnwrapping(SameErrorTag, __VA_ARGS__))>>::type), \
|
||
|
"")
|
||
|
#define AssertNotSameType(...) \
|
||
|
static_assert( \
|
||
|
true || sizeof(typename CheckIfError< \
|
||
|
Eval<If(Not(IsSame(__VA_ARGS__)), True, ConstructError(SameErrorTag, __VA_ARGS__))>>::type), \
|
||
|
"")
|
||
|
#define AssertNotSameProof(...) \
|
||
|
static_assert(true || sizeof(typename CheckIfError<Eval<If(Not(IsProofTreeEqualTo(__VA_ARGS__)), True, \
|
||
|
ConstructError(SameErrorTag, __VA_ARGS__))>>::type), \
|
||
|
"")
|
||
|
#define AssertNotSameForest(...) \
|
||
|
static_assert( \
|
||
|
true || \
|
||
|
sizeof(typename CheckIfError< \
|
||
|
Eval<If(Not(IsForestEqualTo(__VA_ARGS__)), True, ConstructError(SameErrorTag, __VA_ARGS__))>>::type), \
|
||
|
"")
|
||
|
|
||
|
#endif // FRUIT_TESTS_META_COMMON_H
|