Bug 1732219 - Add API for fetching the preview image. r=geckoview-reviewers,agi,mconley
[gecko.git] / mfbt / tests / TestSmallPointerArray.cpp
blob163b2b1df81f8f912b67ee26a00216f01cb26452
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/SmallPointerArray.h"
9 #define PTR1 (void*)0x4
10 #define PTR2 (void*)0x5
11 #define PTR3 (void*)0x6
13 // We explicitly test sizes up to 3 here, as that is when SmallPointerArray<>
14 // switches to the storage method used for larger arrays.
15 void TestArrayManipulation() {
16 using namespace mozilla;
17 SmallPointerArray<void> testArray;
19 MOZ_RELEASE_ASSERT(testArray.Length() == 0);
20 MOZ_RELEASE_ASSERT(sizeof(testArray) == 2 * sizeof(void*));
21 MOZ_RELEASE_ASSERT(!testArray.Contains(PTR1));
23 testArray.AppendElement(PTR1);
25 MOZ_RELEASE_ASSERT(testArray.Length() == 1);
26 MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
27 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
28 MOZ_RELEASE_ASSERT(testArray.Contains(PTR1));
30 testArray.AppendElement(PTR2);
32 MOZ_RELEASE_ASSERT(testArray.Length() == 2);
33 MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
34 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
35 MOZ_RELEASE_ASSERT(testArray[1] == PTR2);
36 MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR2);
37 MOZ_RELEASE_ASSERT(testArray.Contains(PTR2));
39 MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR1));
40 MOZ_RELEASE_ASSERT(!testArray.RemoveElement(PTR1));
42 MOZ_RELEASE_ASSERT(testArray.Length() == 1);
43 MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
44 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
45 MOZ_RELEASE_ASSERT(!testArray.Contains(PTR1));
47 testArray.AppendElement(PTR1);
49 MOZ_RELEASE_ASSERT(testArray.Length() == 2);
50 MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
51 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
52 MOZ_RELEASE_ASSERT(testArray[1] == PTR1);
53 MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR1);
54 MOZ_RELEASE_ASSERT(testArray.Contains(PTR1));
56 testArray.AppendElement(PTR3);
58 MOZ_RELEASE_ASSERT(testArray.Length() == 3);
59 MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
60 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
61 MOZ_RELEASE_ASSERT(testArray[1] == PTR1);
62 MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR1);
63 MOZ_RELEASE_ASSERT(testArray[2] == PTR3);
64 MOZ_RELEASE_ASSERT(testArray.ElementAt(2) == PTR3);
65 MOZ_RELEASE_ASSERT(testArray.Contains(PTR3));
67 MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR1));
69 MOZ_RELEASE_ASSERT(testArray.Length() == 2);
70 MOZ_RELEASE_ASSERT(testArray[0] == PTR2);
71 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR2);
72 MOZ_RELEASE_ASSERT(testArray[1] == PTR3);
73 MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR3);
75 MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR2));
77 MOZ_RELEASE_ASSERT(testArray.Length() == 1);
78 MOZ_RELEASE_ASSERT(testArray[0] == PTR3);
79 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR3);
81 MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR3));
83 MOZ_RELEASE_ASSERT(testArray.Length() == 0);
85 testArray.Clear();
87 MOZ_RELEASE_ASSERT(testArray.Length() == 0);
89 testArray.AppendElement(PTR1);
91 MOZ_RELEASE_ASSERT(testArray.Length() == 1);
92 MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
93 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
95 testArray.AppendElement(PTR2);
97 MOZ_RELEASE_ASSERT(testArray.Length() == 2);
98 MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
99 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
100 MOZ_RELEASE_ASSERT(testArray[1] == PTR2);
101 MOZ_RELEASE_ASSERT(testArray.ElementAt(1) == PTR2);
103 MOZ_RELEASE_ASSERT(testArray.RemoveElement(PTR2));
105 MOZ_RELEASE_ASSERT(testArray.Length() == 1);
106 MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
107 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
109 MOZ_RELEASE_ASSERT(!testArray.RemoveElement(PTR3));
111 MOZ_RELEASE_ASSERT(testArray.Length() == 1);
112 MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
113 MOZ_RELEASE_ASSERT(testArray.ElementAt(0) == PTR1);
116 void TestRangeBasedLoops() {
117 using namespace mozilla;
118 SmallPointerArray<void> testArray;
119 void* verification[3];
120 uint32_t entries = 0;
122 for (void* test : testArray) {
123 verification[entries++] = test;
126 MOZ_RELEASE_ASSERT(entries == 0);
128 testArray.AppendElement(PTR1);
130 for (void* test : testArray) {
131 verification[entries++] = test;
134 MOZ_RELEASE_ASSERT(entries == 1);
135 MOZ_RELEASE_ASSERT(verification[0] == PTR1);
137 entries = 0;
139 testArray.AppendElement(PTR2);
141 for (void* test : testArray) {
142 verification[entries++] = test;
145 MOZ_RELEASE_ASSERT(entries == 2);
146 MOZ_RELEASE_ASSERT(verification[0] == PTR1);
147 MOZ_RELEASE_ASSERT(verification[1] == PTR2);
149 entries = 0;
151 testArray.RemoveElement(PTR1);
153 for (void* test : testArray) {
154 verification[entries++] = test;
157 MOZ_RELEASE_ASSERT(entries == 1);
158 MOZ_RELEASE_ASSERT(verification[0] == PTR2);
160 entries = 0;
162 testArray.AppendElement(PTR1);
163 testArray.AppendElement(PTR3);
165 for (void* test : testArray) {
166 verification[entries++] = test;
169 MOZ_RELEASE_ASSERT(entries == 3);
170 MOZ_RELEASE_ASSERT(verification[0] == PTR2);
171 MOZ_RELEASE_ASSERT(verification[1] == PTR1);
172 MOZ_RELEASE_ASSERT(verification[2] == PTR3);
174 entries = 0;
176 testArray.RemoveElement(PTR1);
177 testArray.RemoveElement(PTR2);
178 testArray.RemoveElement(PTR3);
180 for (void* test : testArray) {
181 verification[entries++] = test;
184 MOZ_RELEASE_ASSERT(entries == 0);
186 testArray.Clear();
188 for (void* test : testArray) {
189 verification[entries++] = test;
192 MOZ_RELEASE_ASSERT(entries == 0);
195 void TestMove() {
196 using namespace mozilla;
198 SmallPointerArray<void> testArray;
199 testArray.AppendElement(PTR1);
200 testArray.AppendElement(PTR2);
202 SmallPointerArray<void> moved = std::move(testArray);
204 MOZ_RELEASE_ASSERT(testArray.IsEmpty());
205 MOZ_RELEASE_ASSERT(moved.Length() == 2);
206 MOZ_RELEASE_ASSERT(moved[0] == PTR1);
207 MOZ_RELEASE_ASSERT(moved[1] == PTR2);
209 // Heap case.
210 moved.AppendElement(PTR3);
212 SmallPointerArray<void> another = std::move(moved);
214 MOZ_RELEASE_ASSERT(testArray.IsEmpty());
215 MOZ_RELEASE_ASSERT(moved.IsEmpty());
216 MOZ_RELEASE_ASSERT(another.Length() == 3);
217 MOZ_RELEASE_ASSERT(another[0] == PTR1);
218 MOZ_RELEASE_ASSERT(another[1] == PTR2);
219 MOZ_RELEASE_ASSERT(another[2] == PTR3);
221 // Move assignment.
222 testArray = std::move(another);
224 MOZ_RELEASE_ASSERT(moved.IsEmpty());
225 MOZ_RELEASE_ASSERT(another.IsEmpty());
226 MOZ_RELEASE_ASSERT(testArray.Length() == 3);
227 MOZ_RELEASE_ASSERT(testArray[0] == PTR1);
228 MOZ_RELEASE_ASSERT(testArray[1] == PTR2);
229 MOZ_RELEASE_ASSERT(testArray[2] == PTR3);
232 int main() {
233 TestArrayManipulation();
234 TestRangeBasedLoops();
235 TestMove();
236 return 0;