Bug 1876289 [wpt PR 44165] - Unskip loaf-source-location-redirect and deflake, a...
[gecko.git] / mfbt / tests / TestEnumTypeTraits.cpp
blob1065c92a7bfb5271a056dc82ab87f51e6a932191
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "mozilla/Assertions.h"
7 #include "mozilla/EnumTypeTraits.h"
9 #include <cstdint>
11 using namespace mozilla;
13 /* Feature check for EnumTypeFitsWithin. */
15 #define MAKE_FIXED_EMUM_FOR_TYPE(IntType) \
16 enum FixedEnumFor_##IntType : IntType{ \
17 A_##IntType, \
18 B_##IntType, \
19 C_##IntType, \
22 template <typename EnumType, typename IntType>
23 static void TestShouldFit() {
24 static_assert(EnumTypeFitsWithin<EnumType, IntType>::value,
25 "Should fit within exact/promoted integral type");
28 template <typename EnumType, typename IntType>
29 static void TestShouldNotFit() {
30 static_assert(!EnumTypeFitsWithin<EnumType, IntType>::value,
31 "Should not fit within");
34 void TestFitForTypes() {
35 // check for int8_t
36 MAKE_FIXED_EMUM_FOR_TYPE(int8_t);
37 TestShouldFit<FixedEnumFor_int8_t, int8_t>();
38 TestShouldFit<FixedEnumFor_int8_t, int16_t>();
39 TestShouldFit<FixedEnumFor_int8_t, int32_t>();
40 TestShouldFit<FixedEnumFor_int8_t, int64_t>();
42 TestShouldNotFit<FixedEnumFor_int8_t, uint8_t>();
43 TestShouldNotFit<FixedEnumFor_int8_t, uint16_t>();
44 TestShouldNotFit<FixedEnumFor_int8_t, uint32_t>();
45 TestShouldNotFit<FixedEnumFor_int8_t, uint64_t>();
47 // check for uint8_t
48 MAKE_FIXED_EMUM_FOR_TYPE(uint8_t);
49 TestShouldFit<FixedEnumFor_uint8_t, uint8_t>();
50 TestShouldFit<FixedEnumFor_uint8_t, uint16_t>();
51 TestShouldFit<FixedEnumFor_uint8_t, uint32_t>();
52 TestShouldFit<FixedEnumFor_uint8_t, uint64_t>();
54 TestShouldNotFit<FixedEnumFor_uint8_t, int8_t>();
55 TestShouldFit<FixedEnumFor_uint8_t, int16_t>();
56 TestShouldFit<FixedEnumFor_uint8_t, int32_t>();
57 TestShouldFit<FixedEnumFor_uint8_t, int64_t>();
59 // check for int16_t
60 MAKE_FIXED_EMUM_FOR_TYPE(int16_t);
61 TestShouldNotFit<FixedEnumFor_int16_t, int8_t>();
62 TestShouldFit<FixedEnumFor_int16_t, int16_t>();
63 TestShouldFit<FixedEnumFor_int16_t, int32_t>();
64 TestShouldFit<FixedEnumFor_int16_t, int64_t>();
66 TestShouldNotFit<FixedEnumFor_int16_t, uint8_t>();
67 TestShouldNotFit<FixedEnumFor_int16_t, uint16_t>();
68 TestShouldNotFit<FixedEnumFor_int16_t, uint32_t>();
69 TestShouldNotFit<FixedEnumFor_int16_t, uint64_t>();
71 // check for uint16_t
72 MAKE_FIXED_EMUM_FOR_TYPE(uint16_t);
73 TestShouldNotFit<FixedEnumFor_uint16_t, uint8_t>();
74 TestShouldFit<FixedEnumFor_uint16_t, uint16_t>();
75 TestShouldFit<FixedEnumFor_uint16_t, uint32_t>();
76 TestShouldFit<FixedEnumFor_uint16_t, uint64_t>();
78 TestShouldNotFit<FixedEnumFor_uint16_t, int8_t>();
79 TestShouldNotFit<FixedEnumFor_uint16_t, int16_t>();
80 TestShouldFit<FixedEnumFor_uint16_t, int32_t>();
81 TestShouldFit<FixedEnumFor_uint16_t, int64_t>();
83 // check for int32_t
84 MAKE_FIXED_EMUM_FOR_TYPE(int32_t);
85 TestShouldNotFit<FixedEnumFor_int32_t, int8_t>();
86 TestShouldNotFit<FixedEnumFor_int32_t, int16_t>();
87 TestShouldFit<FixedEnumFor_int32_t, int32_t>();
88 TestShouldFit<FixedEnumFor_int32_t, int64_t>();
90 TestShouldNotFit<FixedEnumFor_int32_t, uint8_t>();
91 TestShouldNotFit<FixedEnumFor_int32_t, uint16_t>();
92 TestShouldNotFit<FixedEnumFor_int32_t, uint32_t>();
93 TestShouldNotFit<FixedEnumFor_int32_t, uint64_t>();
95 // check for uint32_t
96 MAKE_FIXED_EMUM_FOR_TYPE(uint32_t);
97 TestShouldNotFit<FixedEnumFor_uint32_t, uint8_t>();
98 TestShouldNotFit<FixedEnumFor_uint32_t, uint16_t>();
99 TestShouldFit<FixedEnumFor_uint32_t, uint32_t>();
100 TestShouldFit<FixedEnumFor_uint32_t, uint64_t>();
102 TestShouldNotFit<FixedEnumFor_uint32_t, int8_t>();
103 TestShouldNotFit<FixedEnumFor_uint32_t, int16_t>();
104 TestShouldNotFit<FixedEnumFor_uint32_t, int32_t>();
105 TestShouldFit<FixedEnumFor_uint32_t, int64_t>();
107 // check for int64_t
108 MAKE_FIXED_EMUM_FOR_TYPE(int64_t);
109 TestShouldNotFit<FixedEnumFor_int64_t, int8_t>();
110 TestShouldNotFit<FixedEnumFor_int64_t, int16_t>();
111 TestShouldNotFit<FixedEnumFor_int64_t, int32_t>();
112 TestShouldFit<FixedEnumFor_int64_t, int64_t>();
114 TestShouldNotFit<FixedEnumFor_int64_t, uint8_t>();
115 TestShouldNotFit<FixedEnumFor_int64_t, uint16_t>();
116 TestShouldNotFit<FixedEnumFor_int64_t, uint32_t>();
117 TestShouldNotFit<FixedEnumFor_int64_t, uint64_t>();
119 // check for uint64_t
120 MAKE_FIXED_EMUM_FOR_TYPE(uint64_t);
121 TestShouldNotFit<FixedEnumFor_uint64_t, uint8_t>();
122 TestShouldNotFit<FixedEnumFor_uint64_t, uint16_t>();
123 TestShouldNotFit<FixedEnumFor_uint64_t, uint32_t>();
124 TestShouldFit<FixedEnumFor_uint64_t, uint64_t>();
126 TestShouldNotFit<FixedEnumFor_uint64_t, int8_t>();
127 TestShouldNotFit<FixedEnumFor_uint64_t, int16_t>();
128 TestShouldNotFit<FixedEnumFor_uint64_t, int32_t>();
129 TestShouldNotFit<FixedEnumFor_uint64_t, int64_t>();
132 // -
134 template <typename T, typename U>
135 static constexpr void AssertSameTypeAndValue(T a, U b) {
136 static_assert(std::is_same_v<T, U>);
137 MOZ_ASSERT(a == b);
140 void TestUnderlyingValue() {
141 enum class Pet : int16_t { Cat, Dog, Fish };
142 enum class Plant { Flower, Tree, Vine };
144 AssertSameTypeAndValue(UnderlyingValue(Pet::Cat), int16_t(0));
145 AssertSameTypeAndValue(UnderlyingValue(Pet::Dog), int16_t(1));
146 AssertSameTypeAndValue(UnderlyingValue(Pet::Fish), int16_t(2));
148 AssertSameTypeAndValue(UnderlyingValue(Plant::Flower), int(0));
149 AssertSameTypeAndValue(UnderlyingValue(Plant::Tree), int(1));
150 AssertSameTypeAndValue(UnderlyingValue(Plant::Vine), int(2));
153 // -
155 int main() {
156 TestFitForTypes();
157 TestUnderlyingValue();
158 return 0;