1*a65addddSAndroid Build Coastguard Worker 2*a65addddSAndroid Build Coastguard Worker #ifndef FRUIT_TESTS_META_COMMON_H 3*a65addddSAndroid Build Coastguard Worker #define FRUIT_TESTS_META_COMMON_H 4*a65addddSAndroid Build Coastguard Worker 5*a65addddSAndroid Build Coastguard Worker #define FRUIT_IN_META_TEST 1 6*a65addddSAndroid Build Coastguard Worker 7*a65addddSAndroid Build Coastguard Worker #include <fruit/impl/injection_debug_errors.h> 8*a65addddSAndroid Build Coastguard Worker #include <fruit/impl/injection_errors.h> 9*a65addddSAndroid Build Coastguard Worker #include <fruit/impl/meta/basics.h> 10*a65addddSAndroid Build Coastguard Worker #include <fruit/impl/meta/errors.h> 11*a65addddSAndroid Build Coastguard Worker #include <fruit/impl/meta/immutable_map.h> 12*a65addddSAndroid Build Coastguard Worker #include <fruit/impl/meta/set.h> 13*a65addddSAndroid Build Coastguard Worker #include <fruit/impl/meta/vector.h> 14*a65addddSAndroid Build Coastguard Worker 15*a65addddSAndroid Build Coastguard Worker using namespace std; 16*a65addddSAndroid Build Coastguard Worker using namespace fruit; 17*a65addddSAndroid Build Coastguard Worker using namespace fruit::impl; 18*a65addddSAndroid Build Coastguard Worker using namespace fruit::impl::meta; 19*a65addddSAndroid Build Coastguard Worker 20*a65addddSAndroid Build Coastguard Worker template <typename T, typename U> 21*a65addddSAndroid Build Coastguard Worker struct DifferentError { 22*a65addddSAndroid Build Coastguard Worker static_assert(AlwaysFalse<T>::value, "T and U are different, but should have been equal/equivalent."); 23*a65addddSAndroid Build Coastguard Worker }; 24*a65addddSAndroid Build Coastguard Worker 25*a65addddSAndroid Build Coastguard Worker template <typename T, typename U> 26*a65addddSAndroid Build Coastguard Worker struct SameError { 27*a65addddSAndroid Build Coastguard Worker static_assert(AlwaysFalse<T>::value, "T and U are equal/equivalent but should have been different."); 28*a65addddSAndroid Build Coastguard Worker }; 29*a65addddSAndroid Build Coastguard Worker 30*a65addddSAndroid Build Coastguard Worker struct DifferentErrorTag { 31*a65addddSAndroid Build Coastguard Worker template <typename T, typename U> 32*a65addddSAndroid Build Coastguard Worker using apply = DifferentError<T, U>; 33*a65addddSAndroid Build Coastguard Worker }; 34*a65addddSAndroid Build Coastguard Worker 35*a65addddSAndroid Build Coastguard Worker struct SameErrorTag { 36*a65addddSAndroid Build Coastguard Worker template <typename T, typename U> 37*a65addddSAndroid Build Coastguard Worker using apply = SameError<T, U>; 38*a65addddSAndroid Build Coastguard Worker }; 39*a65addddSAndroid Build Coastguard Worker 40*a65addddSAndroid Build Coastguard Worker template <typename... Types> 41*a65addddSAndroid Build Coastguard Worker using ToSet = Vector<Types...>; 42*a65addddSAndroid Build Coastguard Worker 43*a65addddSAndroid Build Coastguard Worker struct ConstructErrorWithoutUnwrapping { 44*a65addddSAndroid Build Coastguard Worker template <typename ErrorTag, typename... Args> 45*a65addddSAndroid Build Coastguard Worker struct apply { 46*a65addddSAndroid Build Coastguard Worker using type = ConstructError(ErrorTag, Type<Args>...); 47*a65addddSAndroid Build Coastguard Worker }; 48*a65addddSAndroid Build Coastguard Worker }; 49*a65addddSAndroid Build Coastguard Worker 50*a65addddSAndroid Build Coastguard Worker using True = Bool<true>; 51*a65addddSAndroid Build Coastguard Worker using False = Bool<false>; 52*a65addddSAndroid Build Coastguard Worker 53*a65addddSAndroid Build Coastguard Worker #undef Assert 54*a65addddSAndroid Build Coastguard Worker 55*a65addddSAndroid Build Coastguard Worker #define Assert(...) static_assert(Eval<__VA_ARGS__>::value, "") 56*a65addddSAndroid Build Coastguard Worker #define AssertNot(...) Assert(Not(__VA_ARGS__)) 57*a65addddSAndroid Build Coastguard Worker #define AssertSame(...) \ 58*a65addddSAndroid Build Coastguard Worker static_assert( \ 59*a65addddSAndroid Build Coastguard Worker true || \ 60*a65addddSAndroid Build Coastguard Worker sizeof( \ 61*a65addddSAndroid Build Coastguard Worker typename CheckIfError<Eval<If(IsSame(__VA_ARGS__), True, \ 62*a65addddSAndroid Build Coastguard Worker ConstructErrorWithoutUnwrapping(DifferentErrorTag, __VA_ARGS__))>>::type), \ 63*a65addddSAndroid Build Coastguard Worker "") 64*a65addddSAndroid Build Coastguard Worker #define AssertSameType(...) \ 65*a65addddSAndroid Build Coastguard Worker static_assert( \ 66*a65addddSAndroid Build Coastguard Worker true || sizeof(typename CheckIfError< \ 67*a65addddSAndroid Build Coastguard Worker Eval<If(IsSame(__VA_ARGS__), True, ConstructError(DifferentErrorTag, __VA_ARGS__))>>::type), \ 68*a65addddSAndroid Build Coastguard Worker "") 69*a65addddSAndroid Build Coastguard Worker #define AssertSameSet(...) \ 70*a65addddSAndroid Build Coastguard Worker static_assert( \ 71*a65addddSAndroid Build Coastguard Worker true || sizeof(typename CheckIfError< \ 72*a65addddSAndroid Build Coastguard Worker Eval<If(IsSameSet(__VA_ARGS__), True, ConstructError(DifferentErrorTag, __VA_ARGS__))>>::type), \ 73*a65addddSAndroid Build Coastguard Worker "") 74*a65addddSAndroid Build Coastguard Worker #define AssertSameProof(...) \ 75*a65addddSAndroid Build Coastguard Worker static_assert(true || sizeof(typename CheckIfError<Eval<If(IsProofTreeEqualTo(__VA_ARGS__), True, \ 76*a65addddSAndroid Build Coastguard Worker ConstructError(DifferentErrorTag, __VA_ARGS__))>>::type), \ 77*a65addddSAndroid Build Coastguard Worker "") 78*a65addddSAndroid Build Coastguard Worker #define AssertSameForest(...) \ 79*a65addddSAndroid Build Coastguard Worker static_assert(true || sizeof(typename CheckIfError<Eval<CheckForestEqualTo(__VA_ARGS__)>>::type), "") 80*a65addddSAndroid Build Coastguard Worker #define AssertNotSame(...) \ 81*a65addddSAndroid Build Coastguard Worker static_assert( \ 82*a65addddSAndroid Build Coastguard Worker true || \ 83*a65addddSAndroid Build Coastguard Worker sizeof(typename CheckIfError<Eval<If(Not(IsSame(__VA_ARGS__)), True, \ 84*a65addddSAndroid Build Coastguard Worker ConstructErrorWithoutUnwrapping(SameErrorTag, __VA_ARGS__))>>::type), \ 85*a65addddSAndroid Build Coastguard Worker "") 86*a65addddSAndroid Build Coastguard Worker #define AssertNotSameType(...) \ 87*a65addddSAndroid Build Coastguard Worker static_assert( \ 88*a65addddSAndroid Build Coastguard Worker true || sizeof(typename CheckIfError< \ 89*a65addddSAndroid Build Coastguard Worker Eval<If(Not(IsSame(__VA_ARGS__)), True, ConstructError(SameErrorTag, __VA_ARGS__))>>::type), \ 90*a65addddSAndroid Build Coastguard Worker "") 91*a65addddSAndroid Build Coastguard Worker #define AssertNotSameProof(...) \ 92*a65addddSAndroid Build Coastguard Worker static_assert(true || sizeof(typename CheckIfError<Eval<If(Not(IsProofTreeEqualTo(__VA_ARGS__)), True, \ 93*a65addddSAndroid Build Coastguard Worker ConstructError(SameErrorTag, __VA_ARGS__))>>::type), \ 94*a65addddSAndroid Build Coastguard Worker "") 95*a65addddSAndroid Build Coastguard Worker #define AssertNotSameForest(...) \ 96*a65addddSAndroid Build Coastguard Worker static_assert( \ 97*a65addddSAndroid Build Coastguard Worker true || \ 98*a65addddSAndroid Build Coastguard Worker sizeof(typename CheckIfError< \ 99*a65addddSAndroid Build Coastguard Worker Eval<If(Not(IsForestEqualTo(__VA_ARGS__)), True, ConstructError(SameErrorTag, __VA_ARGS__))>>::type), \ 100*a65addddSAndroid Build Coastguard Worker "") 101*a65addddSAndroid Build Coastguard Worker 102*a65addddSAndroid Build Coastguard Worker #endif // FRUIT_TESTS_META_COMMON_H 103