xref: /aosp_15_r20/external/google-fruit/tests/meta/common.h (revision a65addddcf69f38db5b288d787b6b7571a57bb8f)
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