Bug 1714154 [wpt PR 29187] - Fix OOF fragments to be up-to-date under certain conditi...
[gecko.git] / mfbt / tests / TestEnumSet.cpp
blob035c1fcfee9acdc34a5f30881ecee51882c4aabe
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/EnumSet.h"
8 #include "mozilla/Vector.h"
10 #include <type_traits>
12 using namespace mozilla;
14 enum SeaBird {
15 PENGUIN,
16 ALBATROSS,
17 FULMAR,
18 PRION,
19 SHEARWATER,
20 GADFLY_PETREL,
21 TRUE_PETREL,
22 DIVING_PETREL,
23 STORM_PETREL,
24 PELICAN,
25 GANNET,
26 BOOBY,
27 CORMORANT,
28 FRIGATEBIRD,
29 TROPICBIRD,
30 SKUA,
31 GULL,
32 TERN,
33 SKIMMER,
34 AUK
37 enum class SmallEnum : uint8_t {
38 Foo,
39 Bar,
42 enum class BigEnum : uint64_t {
43 Foo,
44 Bar = 35,
47 class EnumSetSuite {
48 public:
49 EnumSetSuite()
50 : mAlcidae(),
51 mDiomedeidae(ALBATROSS),
52 mPetrelProcellariidae(GADFLY_PETREL, TRUE_PETREL),
53 mNonPetrelProcellariidae(FULMAR, PRION, SHEARWATER),
54 mPetrels(GADFLY_PETREL, TRUE_PETREL, DIVING_PETREL, STORM_PETREL) {}
56 void runTests() {
57 testSize();
58 testContains();
59 testAddTo();
60 testAdd();
61 testAddAll();
62 testUnion();
63 testRemoveFrom();
64 testRemove();
65 testRemoveAllFrom();
66 testRemoveAll();
67 testIntersect();
68 testInsersection();
69 testEquality();
70 testDuplicates();
71 testIteration();
72 testInitializerListConstuctor();
73 testBigEnum();
76 private:
77 void testEnumSetLayout() {
78 #ifndef DEBUG
79 static_assert(sizeof(EnumSet<SmallEnum>) == sizeof(SmallEnum),
80 "EnumSet should be no bigger than the enum by default");
81 static_assert(sizeof(EnumSet<SmallEnum, uint32_t>) == sizeof(uint32_t),
82 "EnumSet should be able to have its size overriden.");
83 static_assert(std::is_trivially_copyable_v<EnumSet<SmallEnum>>,
84 "EnumSet should be lightweight outside of debug.");
85 #endif
88 void testSize() {
89 MOZ_RELEASE_ASSERT(mAlcidae.size() == 0);
90 MOZ_RELEASE_ASSERT(mDiomedeidae.size() == 1);
91 MOZ_RELEASE_ASSERT(mPetrelProcellariidae.size() == 2);
92 MOZ_RELEASE_ASSERT(mNonPetrelProcellariidae.size() == 3);
93 MOZ_RELEASE_ASSERT(mPetrels.size() == 4);
96 void testContains() {
97 MOZ_RELEASE_ASSERT(!mPetrels.contains(PENGUIN));
98 MOZ_RELEASE_ASSERT(!mPetrels.contains(ALBATROSS));
99 MOZ_RELEASE_ASSERT(!mPetrels.contains(FULMAR));
100 MOZ_RELEASE_ASSERT(!mPetrels.contains(PRION));
101 MOZ_RELEASE_ASSERT(!mPetrels.contains(SHEARWATER));
102 MOZ_RELEASE_ASSERT(mPetrels.contains(GADFLY_PETREL));
103 MOZ_RELEASE_ASSERT(mPetrels.contains(TRUE_PETREL));
104 MOZ_RELEASE_ASSERT(mPetrels.contains(DIVING_PETREL));
105 MOZ_RELEASE_ASSERT(mPetrels.contains(STORM_PETREL));
106 MOZ_RELEASE_ASSERT(!mPetrels.contains(PELICAN));
107 MOZ_RELEASE_ASSERT(!mPetrels.contains(GANNET));
108 MOZ_RELEASE_ASSERT(!mPetrels.contains(BOOBY));
109 MOZ_RELEASE_ASSERT(!mPetrels.contains(CORMORANT));
110 MOZ_RELEASE_ASSERT(!mPetrels.contains(FRIGATEBIRD));
111 MOZ_RELEASE_ASSERT(!mPetrels.contains(TROPICBIRD));
112 MOZ_RELEASE_ASSERT(!mPetrels.contains(SKUA));
113 MOZ_RELEASE_ASSERT(!mPetrels.contains(GULL));
114 MOZ_RELEASE_ASSERT(!mPetrels.contains(TERN));
115 MOZ_RELEASE_ASSERT(!mPetrels.contains(SKIMMER));
116 MOZ_RELEASE_ASSERT(!mPetrels.contains(AUK));
119 void testCopy() {
120 EnumSet<SeaBird> likes = mPetrels;
121 likes -= TRUE_PETREL;
122 MOZ_RELEASE_ASSERT(mPetrels.size() == 4);
123 MOZ_RELEASE_ASSERT(mPetrels.contains(TRUE_PETREL));
125 MOZ_RELEASE_ASSERT(likes.size() == 3);
126 MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
127 MOZ_RELEASE_ASSERT(likes.contains(DIVING_PETREL));
128 MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
131 void testAddTo() {
132 EnumSet<SeaBird> seen = mPetrels;
133 seen += CORMORANT;
134 seen += TRUE_PETREL;
135 MOZ_RELEASE_ASSERT(mPetrels.size() == 4);
136 MOZ_RELEASE_ASSERT(!mPetrels.contains(CORMORANT));
137 MOZ_RELEASE_ASSERT(seen.size() == 5);
138 MOZ_RELEASE_ASSERT(seen.contains(GADFLY_PETREL));
139 MOZ_RELEASE_ASSERT(seen.contains(TRUE_PETREL));
140 MOZ_RELEASE_ASSERT(seen.contains(DIVING_PETREL));
141 MOZ_RELEASE_ASSERT(seen.contains(STORM_PETREL));
142 MOZ_RELEASE_ASSERT(seen.contains(CORMORANT));
145 void testAdd() {
146 EnumSet<SeaBird> seen = mPetrels + CORMORANT + STORM_PETREL;
147 MOZ_RELEASE_ASSERT(mPetrels.size() == 4);
148 MOZ_RELEASE_ASSERT(!mPetrels.contains(CORMORANT));
149 MOZ_RELEASE_ASSERT(seen.size() == 5);
150 MOZ_RELEASE_ASSERT(seen.contains(GADFLY_PETREL));
151 MOZ_RELEASE_ASSERT(seen.contains(TRUE_PETREL));
152 MOZ_RELEASE_ASSERT(seen.contains(DIVING_PETREL));
153 MOZ_RELEASE_ASSERT(seen.contains(STORM_PETREL));
154 MOZ_RELEASE_ASSERT(seen.contains(CORMORANT));
157 void testAddAll() {
158 EnumSet<SeaBird> procellariidae;
159 procellariidae += mPetrelProcellariidae;
160 procellariidae += mNonPetrelProcellariidae;
161 MOZ_RELEASE_ASSERT(procellariidae.size() == 5);
163 // Both procellariidae and mPetrels include GADFLY_PERTEL and TRUE_PETREL
164 EnumSet<SeaBird> procellariiformes;
165 procellariiformes += mDiomedeidae;
166 procellariiformes += procellariidae;
167 procellariiformes += mPetrels;
168 MOZ_RELEASE_ASSERT(procellariiformes.size() == 8);
171 void testUnion() {
172 EnumSet<SeaBird> procellariidae =
173 mPetrelProcellariidae + mNonPetrelProcellariidae;
174 MOZ_RELEASE_ASSERT(procellariidae.size() == 5);
176 // Both procellariidae and mPetrels include GADFLY_PETREL and TRUE_PETREL
177 EnumSet<SeaBird> procellariiformes =
178 mDiomedeidae + procellariidae + mPetrels;
179 MOZ_RELEASE_ASSERT(procellariiformes.size() == 8);
182 void testRemoveFrom() {
183 EnumSet<SeaBird> likes = mPetrels;
184 likes -= TRUE_PETREL;
185 likes -= DIVING_PETREL;
186 MOZ_RELEASE_ASSERT(likes.size() == 2);
187 MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
188 MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
191 void testRemove() {
192 EnumSet<SeaBird> likes = mPetrels - TRUE_PETREL - DIVING_PETREL;
193 MOZ_RELEASE_ASSERT(likes.size() == 2);
194 MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
195 MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
198 void testRemoveAllFrom() {
199 EnumSet<SeaBird> likes = mPetrels;
200 likes -= mPetrelProcellariidae;
201 MOZ_RELEASE_ASSERT(likes.size() == 2);
202 MOZ_RELEASE_ASSERT(likes.contains(DIVING_PETREL));
203 MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
206 void testRemoveAll() {
207 EnumSet<SeaBird> likes = mPetrels - mPetrelProcellariidae;
208 MOZ_RELEASE_ASSERT(likes.size() == 2);
209 MOZ_RELEASE_ASSERT(likes.contains(DIVING_PETREL));
210 MOZ_RELEASE_ASSERT(likes.contains(STORM_PETREL));
213 void testIntersect() {
214 EnumSet<SeaBird> likes = mPetrels;
215 likes &= mPetrelProcellariidae;
216 MOZ_RELEASE_ASSERT(likes.size() == 2);
217 MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
218 MOZ_RELEASE_ASSERT(likes.contains(TRUE_PETREL));
221 void testInsersection() {
222 EnumSet<SeaBird> likes = mPetrels & mPetrelProcellariidae;
223 MOZ_RELEASE_ASSERT(likes.size() == 2);
224 MOZ_RELEASE_ASSERT(likes.contains(GADFLY_PETREL));
225 MOZ_RELEASE_ASSERT(likes.contains(TRUE_PETREL));
228 void testEquality() {
229 EnumSet<SeaBird> likes = mPetrels & mPetrelProcellariidae;
230 MOZ_RELEASE_ASSERT(likes == EnumSet<SeaBird>(GADFLY_PETREL, TRUE_PETREL));
233 void testDuplicates() {
234 EnumSet<SeaBird> likes = mPetrels;
235 likes += GADFLY_PETREL;
236 likes += TRUE_PETREL;
237 likes += DIVING_PETREL;
238 likes += STORM_PETREL;
239 MOZ_RELEASE_ASSERT(likes.size() == 4);
240 MOZ_RELEASE_ASSERT(likes == mPetrels);
243 void testIteration() {
244 EnumSet<SeaBird> birds;
245 Vector<SeaBird> vec;
247 for (auto bird : birds) {
248 MOZ_RELEASE_ASSERT(vec.append(bird));
250 MOZ_RELEASE_ASSERT(vec.length() == 0);
252 birds += DIVING_PETREL;
253 birds += GADFLY_PETREL;
254 birds += STORM_PETREL;
255 birds += TRUE_PETREL;
256 for (auto bird : birds) {
257 MOZ_RELEASE_ASSERT(vec.append(bird));
260 MOZ_RELEASE_ASSERT(vec.length() == 4);
261 MOZ_RELEASE_ASSERT(vec[0] == GADFLY_PETREL);
262 MOZ_RELEASE_ASSERT(vec[1] == TRUE_PETREL);
263 MOZ_RELEASE_ASSERT(vec[2] == DIVING_PETREL);
264 MOZ_RELEASE_ASSERT(vec[3] == STORM_PETREL);
267 void testInitializerListConstuctor() {
268 EnumSet<SeaBird> empty{};
269 MOZ_RELEASE_ASSERT(empty.size() == 0);
271 EnumSet<SeaBird> someBirds{SKIMMER, GULL, BOOBY};
272 MOZ_RELEASE_ASSERT(someBirds.size() == 3);
273 MOZ_RELEASE_ASSERT(someBirds.contains(SKIMMER));
274 MOZ_RELEASE_ASSERT(someBirds.contains(GULL));
275 MOZ_RELEASE_ASSERT(someBirds.contains(BOOBY));
278 void testBigEnum() {
279 EnumSet<BigEnum> set;
280 set += BigEnum::Bar;
281 MOZ_RELEASE_ASSERT(set.serialize() ==
282 (uint64_t(1) << uint64_t(BigEnum::Bar)));
285 EnumSet<SeaBird> mAlcidae;
286 EnumSet<SeaBird> mDiomedeidae;
287 EnumSet<SeaBird> mPetrelProcellariidae;
288 EnumSet<SeaBird> mNonPetrelProcellariidae;
289 EnumSet<SeaBird> mPetrels;
292 int main() {
293 EnumSetSuite suite;
294 suite.runTests();
295 return 0;