1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker * Copyright (c) 2021, The OpenThread Authors.
3*cfb92d14SAndroid Build Coastguard Worker * All rights reserved.
4*cfb92d14SAndroid Build Coastguard Worker *
5*cfb92d14SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without
6*cfb92d14SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met:
7*cfb92d14SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright
8*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer.
9*cfb92d14SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright
10*cfb92d14SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the
11*cfb92d14SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution.
12*cfb92d14SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the
13*cfb92d14SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products
14*cfb92d14SAndroid Build Coastguard Worker * derived from this software without specific prior written permission.
15*cfb92d14SAndroid Build Coastguard Worker *
16*cfb92d14SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17*cfb92d14SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*cfb92d14SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*cfb92d14SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20*cfb92d14SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21*cfb92d14SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22*cfb92d14SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23*cfb92d14SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24*cfb92d14SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25*cfb92d14SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*cfb92d14SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE.
27*cfb92d14SAndroid Build Coastguard Worker */
28*cfb92d14SAndroid Build Coastguard Worker
29*cfb92d14SAndroid Build Coastguard Worker #include <stdarg.h>
30*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
31*cfb92d14SAndroid Build Coastguard Worker
32*cfb92d14SAndroid Build Coastguard Worker #include "test_platform.h"
33*cfb92d14SAndroid Build Coastguard Worker
34*cfb92d14SAndroid Build Coastguard Worker #include <openthread/config.h>
35*cfb92d14SAndroid Build Coastguard Worker
36*cfb92d14SAndroid Build Coastguard Worker #include "common/array.hpp"
37*cfb92d14SAndroid Build Coastguard Worker #include "common/debug.hpp"
38*cfb92d14SAndroid Build Coastguard Worker #include "common/equatable.hpp"
39*cfb92d14SAndroid Build Coastguard Worker #include "common/type_traits.hpp"
40*cfb92d14SAndroid Build Coastguard Worker #include "instance/instance.hpp"
41*cfb92d14SAndroid Build Coastguard Worker
42*cfb92d14SAndroid Build Coastguard Worker #include "test_util.h"
43*cfb92d14SAndroid Build Coastguard Worker
44*cfb92d14SAndroid Build Coastguard Worker namespace ot {
45*cfb92d14SAndroid Build Coastguard Worker
TestArray(void)46*cfb92d14SAndroid Build Coastguard Worker void TestArray(void)
47*cfb92d14SAndroid Build Coastguard Worker {
48*cfb92d14SAndroid Build Coastguard Worker constexpr uint16_t kMaxSize = 10;
49*cfb92d14SAndroid Build Coastguard Worker constexpr uint16_t kStartValue = 100;
50*cfb92d14SAndroid Build Coastguard Worker
51*cfb92d14SAndroid Build Coastguard Worker Array<uint16_t, kMaxSize> array;
52*cfb92d14SAndroid Build Coastguard Worker uint8_t index;
53*cfb92d14SAndroid Build Coastguard Worker uint16_t seed;
54*cfb92d14SAndroid Build Coastguard Worker
55*cfb92d14SAndroid Build Coastguard Worker // All methods after constructor
56*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.IsEmpty());
57*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!array.IsFull());
58*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.GetLength() == 0);
59*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.GetMaxSize() == kMaxSize);
60*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.At(0) == nullptr);
61*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.Front() == nullptr);
62*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.Back() == nullptr);
63*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.PopBack() == nullptr);
64*cfb92d14SAndroid Build Coastguard Worker
65*cfb92d14SAndroid Build Coastguard Worker seed = kStartValue;
66*cfb92d14SAndroid Build Coastguard Worker
67*cfb92d14SAndroid Build Coastguard Worker for (uint8_t len = 1; len <= kMaxSize; len++)
68*cfb92d14SAndroid Build Coastguard Worker {
69*cfb92d14SAndroid Build Coastguard Worker for (uint8_t iter = 0; iter < 2; iter++)
70*cfb92d14SAndroid Build Coastguard Worker {
71*cfb92d14SAndroid Build Coastguard Worker // On `iter == 0` use `PushBack(aEntry)` and on `iter == 1`
72*cfb92d14SAndroid Build Coastguard Worker // `PushBack()` version which returns a pointer to the newly
73*cfb92d14SAndroid Build Coastguard Worker // added entry.
74*cfb92d14SAndroid Build Coastguard Worker
75*cfb92d14SAndroid Build Coastguard Worker if (iter == 0)
76*cfb92d14SAndroid Build Coastguard Worker {
77*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array.PushBack(seed + len));
78*cfb92d14SAndroid Build Coastguard Worker }
79*cfb92d14SAndroid Build Coastguard Worker else
80*cfb92d14SAndroid Build Coastguard Worker {
81*cfb92d14SAndroid Build Coastguard Worker uint16_t *entry = array.PushBack();
82*cfb92d14SAndroid Build Coastguard Worker
83*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(entry != nullptr);
84*cfb92d14SAndroid Build Coastguard Worker *entry = seed + len;
85*cfb92d14SAndroid Build Coastguard Worker }
86*cfb92d14SAndroid Build Coastguard Worker
87*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!array.IsEmpty());
88*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.IsFull() == (len == kMaxSize));
89*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.GetLength() == len);
90*cfb92d14SAndroid Build Coastguard Worker
91*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.Front() != nullptr);
92*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(*array.Front() == seed + 1);
93*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.Back() != nullptr);
94*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(*array.Back() == seed + len);
95*cfb92d14SAndroid Build Coastguard Worker
96*cfb92d14SAndroid Build Coastguard Worker for (index = 0; index < len; index++)
97*cfb92d14SAndroid Build Coastguard Worker {
98*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array[index] == seed + index + 1);
99*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.At(index) != nullptr);
100*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(*array.At(index) == seed + index + 1);
101*cfb92d14SAndroid Build Coastguard Worker
102*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.Contains(seed + index + 1));
103*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.Find(seed + index + 1) == &array[index]);
104*cfb92d14SAndroid Build Coastguard Worker
105*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!array.Contains(seed));
106*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.Find(seed) == nullptr);
107*cfb92d14SAndroid Build Coastguard Worker }
108*cfb92d14SAndroid Build Coastguard Worker
109*cfb92d14SAndroid Build Coastguard Worker index = 0;
110*cfb92d14SAndroid Build Coastguard Worker
111*cfb92d14SAndroid Build Coastguard Worker for (uint16_t value : array)
112*cfb92d14SAndroid Build Coastguard Worker {
113*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(value == array[index]);
114*cfb92d14SAndroid Build Coastguard Worker index++;
115*cfb92d14SAndroid Build Coastguard Worker }
116*cfb92d14SAndroid Build Coastguard Worker
117*cfb92d14SAndroid Build Coastguard Worker index = 0;
118*cfb92d14SAndroid Build Coastguard Worker
119*cfb92d14SAndroid Build Coastguard Worker for (uint16_t &entry : array)
120*cfb92d14SAndroid Build Coastguard Worker {
121*cfb92d14SAndroid Build Coastguard Worker // Uddate the value stored at the entry
122*cfb92d14SAndroid Build Coastguard Worker entry++;
123*cfb92d14SAndroid Build Coastguard Worker
124*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(entry == array[index]);
125*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.IndexOf(entry) == index);
126*cfb92d14SAndroid Build Coastguard Worker
127*cfb92d14SAndroid Build Coastguard Worker index++;
128*cfb92d14SAndroid Build Coastguard Worker }
129*cfb92d14SAndroid Build Coastguard Worker
130*cfb92d14SAndroid Build Coastguard Worker seed++;
131*cfb92d14SAndroid Build Coastguard Worker
132*cfb92d14SAndroid Build Coastguard Worker // On `iter == 0` we verify `PopBack()` and remove the
133*cfb92d14SAndroid Build Coastguard Worker // last entry. It will be added again from next `iter`
134*cfb92d14SAndroid Build Coastguard Worker // loop (on `iter == 1`).
135*cfb92d14SAndroid Build Coastguard Worker
136*cfb92d14SAndroid Build Coastguard Worker if (iter == 0)
137*cfb92d14SAndroid Build Coastguard Worker {
138*cfb92d14SAndroid Build Coastguard Worker uint16_t *entry = array.PopBack();
139*cfb92d14SAndroid Build Coastguard Worker
140*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(entry != nullptr);
141*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(*entry == seed + len);
142*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.GetLength() == len - 1);
143*cfb92d14SAndroid Build Coastguard Worker }
144*cfb92d14SAndroid Build Coastguard Worker }
145*cfb92d14SAndroid Build Coastguard Worker }
146*cfb92d14SAndroid Build Coastguard Worker
147*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.IsFull());
148*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.PushBack(0) == kErrorNoBufs);
149*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.PushBack() == nullptr);
150*cfb92d14SAndroid Build Coastguard Worker
151*cfb92d14SAndroid Build Coastguard Worker for (uint8_t len = kMaxSize; len >= 1; len--)
152*cfb92d14SAndroid Build Coastguard Worker {
153*cfb92d14SAndroid Build Coastguard Worker uint16_t *entry;
154*cfb92d14SAndroid Build Coastguard Worker
155*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.GetLength() == len);
156*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.Back() == &array[len - 1]);
157*cfb92d14SAndroid Build Coastguard Worker
158*cfb92d14SAndroid Build Coastguard Worker entry = array.PopBack();
159*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(entry != nullptr);
160*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(*entry == seed + len);
161*cfb92d14SAndroid Build Coastguard Worker
162*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.GetLength() == len - 1);
163*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!array.IsFull());
164*cfb92d14SAndroid Build Coastguard Worker }
165*cfb92d14SAndroid Build Coastguard Worker
166*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.IsEmpty());
167*cfb92d14SAndroid Build Coastguard Worker
168*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array.PushBack(seed));
169*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!array.IsEmpty());
170*cfb92d14SAndroid Build Coastguard Worker
171*cfb92d14SAndroid Build Coastguard Worker array.Clear();
172*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array.IsEmpty());
173*cfb92d14SAndroid Build Coastguard Worker }
174*cfb92d14SAndroid Build Coastguard Worker
TestArrayCopyAndFindMatching(void)175*cfb92d14SAndroid Build Coastguard Worker void TestArrayCopyAndFindMatching(void)
176*cfb92d14SAndroid Build Coastguard Worker {
177*cfb92d14SAndroid Build Coastguard Worker constexpr uint16_t kMaxSize = 10;
178*cfb92d14SAndroid Build Coastguard Worker
179*cfb92d14SAndroid Build Coastguard Worker enum MatchMode : uint8_t
180*cfb92d14SAndroid Build Coastguard Worker {
181*cfb92d14SAndroid Build Coastguard Worker kMatchAll,
182*cfb92d14SAndroid Build Coastguard Worker kMatchNone,
183*cfb92d14SAndroid Build Coastguard Worker kMatchOddYear,
184*cfb92d14SAndroid Build Coastguard Worker kMatchEvenYear,
185*cfb92d14SAndroid Build Coastguard Worker };
186*cfb92d14SAndroid Build Coastguard Worker
187*cfb92d14SAndroid Build Coastguard Worker struct Entry : public Unequatable<Entry>
188*cfb92d14SAndroid Build Coastguard Worker {
189*cfb92d14SAndroid Build Coastguard Worker Entry(void) = default;
190*cfb92d14SAndroid Build Coastguard Worker
191*cfb92d14SAndroid Build Coastguard Worker Entry(const char *aName, uint16_t aYear)
192*cfb92d14SAndroid Build Coastguard Worker : mName(aName)
193*cfb92d14SAndroid Build Coastguard Worker , mYear(aYear)
194*cfb92d14SAndroid Build Coastguard Worker {
195*cfb92d14SAndroid Build Coastguard Worker }
196*cfb92d14SAndroid Build Coastguard Worker
197*cfb92d14SAndroid Build Coastguard Worker bool operator==(const Entry &aOther) const { return (mName == aOther.mName) && (mYear == aOther.mYear); }
198*cfb92d14SAndroid Build Coastguard Worker bool Matches(const char *aName) const { return strcmp(aName, mName) == 0; }
199*cfb92d14SAndroid Build Coastguard Worker bool Matches(uint16_t aYear) const { return aYear == mYear; }
200*cfb92d14SAndroid Build Coastguard Worker
201*cfb92d14SAndroid Build Coastguard Worker bool Matches(MatchMode aMatchMode) const
202*cfb92d14SAndroid Build Coastguard Worker {
203*cfb92d14SAndroid Build Coastguard Worker bool matches = false;
204*cfb92d14SAndroid Build Coastguard Worker
205*cfb92d14SAndroid Build Coastguard Worker switch (aMatchMode)
206*cfb92d14SAndroid Build Coastguard Worker {
207*cfb92d14SAndroid Build Coastguard Worker case kMatchAll:
208*cfb92d14SAndroid Build Coastguard Worker matches = true;
209*cfb92d14SAndroid Build Coastguard Worker break;
210*cfb92d14SAndroid Build Coastguard Worker case kMatchNone:
211*cfb92d14SAndroid Build Coastguard Worker matches = false;
212*cfb92d14SAndroid Build Coastguard Worker break;
213*cfb92d14SAndroid Build Coastguard Worker case kMatchOddYear:
214*cfb92d14SAndroid Build Coastguard Worker matches = ((mYear % 2) != 0);
215*cfb92d14SAndroid Build Coastguard Worker break;
216*cfb92d14SAndroid Build Coastguard Worker case kMatchEvenYear:
217*cfb92d14SAndroid Build Coastguard Worker matches = ((mYear % 2) == 0);
218*cfb92d14SAndroid Build Coastguard Worker break;
219*cfb92d14SAndroid Build Coastguard Worker }
220*cfb92d14SAndroid Build Coastguard Worker
221*cfb92d14SAndroid Build Coastguard Worker return matches;
222*cfb92d14SAndroid Build Coastguard Worker }
223*cfb92d14SAndroid Build Coastguard Worker
224*cfb92d14SAndroid Build Coastguard Worker const char *mName;
225*cfb92d14SAndroid Build Coastguard Worker uint16_t mYear;
226*cfb92d14SAndroid Build Coastguard Worker };
227*cfb92d14SAndroid Build Coastguard Worker
228*cfb92d14SAndroid Build Coastguard Worker static const MatchMode kMatchModes[] = {kMatchAll, kMatchNone, kMatchEvenYear, kMatchOddYear};
229*cfb92d14SAndroid Build Coastguard Worker
230*cfb92d14SAndroid Build Coastguard Worker static const char *kMatchModeStrings[] = {
231*cfb92d14SAndroid Build Coastguard Worker "kMatchAll",
232*cfb92d14SAndroid Build Coastguard Worker "kMatchNone",
233*cfb92d14SAndroid Build Coastguard Worker "kMatchOddYear",
234*cfb92d14SAndroid Build Coastguard Worker "kMatchEvenYear",
235*cfb92d14SAndroid Build Coastguard Worker };
236*cfb92d14SAndroid Build Coastguard Worker
237*cfb92d14SAndroid Build Coastguard Worker Entry ps1("PS", 1994);
238*cfb92d14SAndroid Build Coastguard Worker Entry ps2("PS2", 1999);
239*cfb92d14SAndroid Build Coastguard Worker Entry ps3("PS3", 2006);
240*cfb92d14SAndroid Build Coastguard Worker Entry ps4("PS4", 2013);
241*cfb92d14SAndroid Build Coastguard Worker Entry ps5("PS5", 2020);
242*cfb92d14SAndroid Build Coastguard Worker
243*cfb92d14SAndroid Build Coastguard Worker Array<Entry, kMaxSize> array1;
244*cfb92d14SAndroid Build Coastguard Worker Array<Entry, kMaxSize> array2;
245*cfb92d14SAndroid Build Coastguard Worker Array<Entry, kMaxSize> array3(array1);
246*cfb92d14SAndroid Build Coastguard Worker
247*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1.IsEmpty());
248*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.IsEmpty());
249*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array3.IsEmpty());
250*cfb92d14SAndroid Build Coastguard Worker
251*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array1.PushBack(ps1));
252*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array1.PushBack(ps2));
253*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array1.PushBack(ps3));
254*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array1.PushBack(ps4));
255*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1.GetLength() == 4);
256*cfb92d14SAndroid Build Coastguard Worker
257*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array2.PushBack(ps3));
258*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array2.PushBack(ps5));
259*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.GetLength() == 2);
260*cfb92d14SAndroid Build Coastguard Worker
261*cfb92d14SAndroid Build Coastguard Worker array3 = array2 = array1;
262*cfb92d14SAndroid Build Coastguard Worker
263*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1.GetLength() == 4);
264*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.GetLength() == 4);
265*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array3.GetLength() == 4);
266*cfb92d14SAndroid Build Coastguard Worker
267*cfb92d14SAndroid Build Coastguard Worker for (uint8_t index = 0; index < array1.GetLength(); index++)
268*cfb92d14SAndroid Build Coastguard Worker {
269*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1[index] == array2[index]);
270*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1[index] == array3[index]);
271*cfb92d14SAndroid Build Coastguard Worker }
272*cfb92d14SAndroid Build Coastguard Worker
273*cfb92d14SAndroid Build Coastguard Worker array3.Clear();
274*cfb92d14SAndroid Build Coastguard Worker
275*cfb92d14SAndroid Build Coastguard Worker array1 = array3;
276*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1.IsEmpty());
277*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1.GetLength() == 0);
278*cfb92d14SAndroid Build Coastguard Worker
279*cfb92d14SAndroid Build Coastguard Worker {
280*cfb92d14SAndroid Build Coastguard Worker Array<Entry, kMaxSize> array4(array2);
281*cfb92d14SAndroid Build Coastguard Worker
282*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array4.GetLength() == 4);
283*cfb92d14SAndroid Build Coastguard Worker
284*cfb92d14SAndroid Build Coastguard Worker for (uint8_t index = 0; index < array1.GetLength(); index++)
285*cfb92d14SAndroid Build Coastguard Worker {
286*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2[index] == array4[index]);
287*cfb92d14SAndroid Build Coastguard Worker }
288*cfb92d14SAndroid Build Coastguard Worker }
289*cfb92d14SAndroid Build Coastguard Worker
290*cfb92d14SAndroid Build Coastguard Worker SuccessOrQuit(array2.PushBack(ps5));
291*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.GetLength() == 5);
292*cfb92d14SAndroid Build Coastguard Worker
293*cfb92d14SAndroid Build Coastguard Worker for (const Entry &entry : array2)
294*cfb92d14SAndroid Build Coastguard Worker {
295*cfb92d14SAndroid Build Coastguard Worker Entry *match;
296*cfb92d14SAndroid Build Coastguard Worker
297*cfb92d14SAndroid Build Coastguard Worker printf("- Name:%-3s Year:%d\n", entry.mName, entry.mYear);
298*cfb92d14SAndroid Build Coastguard Worker
299*cfb92d14SAndroid Build Coastguard Worker match = array2.FindMatching(entry.mName);
300*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(match != nullptr);
301*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(match == &entry);
302*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.ContainsMatching(entry.mName));
303*cfb92d14SAndroid Build Coastguard Worker
304*cfb92d14SAndroid Build Coastguard Worker match = array2.FindMatching(entry.mYear);
305*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(match != nullptr);
306*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(match == &entry);
307*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.ContainsMatching(entry.mYear));
308*cfb92d14SAndroid Build Coastguard Worker }
309*cfb92d14SAndroid Build Coastguard Worker
310*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.FindMatching("PS6") == nullptr);
311*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!array2.ContainsMatching("PS6"));
312*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.FindMatching(static_cast<uint16_t>(2001)) == nullptr);
313*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!array2.ContainsMatching(static_cast<uint16_t>(2001)));
314*cfb92d14SAndroid Build Coastguard Worker
315*cfb92d14SAndroid Build Coastguard Worker // Test removing of entries at every index.
316*cfb92d14SAndroid Build Coastguard Worker
317*cfb92d14SAndroid Build Coastguard Worker array1 = array2;
318*cfb92d14SAndroid Build Coastguard Worker
319*cfb92d14SAndroid Build Coastguard Worker for (const Entry &entryToRemove : array1)
320*cfb92d14SAndroid Build Coastguard Worker {
321*cfb92d14SAndroid Build Coastguard Worker Entry *match;
322*cfb92d14SAndroid Build Coastguard Worker
323*cfb92d14SAndroid Build Coastguard Worker // Test `Remove()`
324*cfb92d14SAndroid Build Coastguard Worker
325*cfb92d14SAndroid Build Coastguard Worker array2 = array1;
326*cfb92d14SAndroid Build Coastguard Worker match = array2.Find(entryToRemove);
327*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(match != nullptr);
328*cfb92d14SAndroid Build Coastguard Worker array2.Remove(*match);
329*cfb92d14SAndroid Build Coastguard Worker
330*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.GetLength() == array1.GetLength() - 1);
331*cfb92d14SAndroid Build Coastguard Worker
332*cfb92d14SAndroid Build Coastguard Worker for (const Entry &entry : array2)
333*cfb92d14SAndroid Build Coastguard Worker {
334*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(entry != entryToRemove);
335*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1.Contains(entry));
336*cfb92d14SAndroid Build Coastguard Worker }
337*cfb92d14SAndroid Build Coastguard Worker
338*cfb92d14SAndroid Build Coastguard Worker // Test `RemoveMatching()`
339*cfb92d14SAndroid Build Coastguard Worker
340*cfb92d14SAndroid Build Coastguard Worker array2 = array1;
341*cfb92d14SAndroid Build Coastguard Worker array2.RemoveMatching(entryToRemove.mName);
342*cfb92d14SAndroid Build Coastguard Worker
343*cfb92d14SAndroid Build Coastguard Worker printf("\n- - - - - - - - - - - - - - - - - - - - - - - - ");
344*cfb92d14SAndroid Build Coastguard Worker printf("\nArray after `RemoveMatching()` on entry %s\n", entryToRemove.mName);
345*cfb92d14SAndroid Build Coastguard Worker
346*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.GetLength() == array1.GetLength() - 1);
347*cfb92d14SAndroid Build Coastguard Worker
348*cfb92d14SAndroid Build Coastguard Worker for (const Entry &entry : array2)
349*cfb92d14SAndroid Build Coastguard Worker {
350*cfb92d14SAndroid Build Coastguard Worker printf("- Name:%-3s Year:%d\n", entry.mName, entry.mYear);
351*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(entry != entryToRemove);
352*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1.Contains(entry));
353*cfb92d14SAndroid Build Coastguard Worker }
354*cfb92d14SAndroid Build Coastguard Worker
355*cfb92d14SAndroid Build Coastguard Worker // Test `RemoveMatchin()` with a non-existing match
356*cfb92d14SAndroid Build Coastguard Worker
357*cfb92d14SAndroid Build Coastguard Worker array2.RemoveMatching(entryToRemove.mName);
358*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.GetLength() == array1.GetLength() - 1);
359*cfb92d14SAndroid Build Coastguard Worker
360*cfb92d14SAndroid Build Coastguard Worker // Test `RemoveAllMatching()` removing a single matching entry.
361*cfb92d14SAndroid Build Coastguard Worker
362*cfb92d14SAndroid Build Coastguard Worker array2 = array1;
363*cfb92d14SAndroid Build Coastguard Worker array2.RemoveAllMatching(entryToRemove.mName);
364*cfb92d14SAndroid Build Coastguard Worker
365*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.GetLength() == array1.GetLength() - 1);
366*cfb92d14SAndroid Build Coastguard Worker
367*cfb92d14SAndroid Build Coastguard Worker for (const Entry &entry : array2)
368*cfb92d14SAndroid Build Coastguard Worker {
369*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(entry != entryToRemove);
370*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array1.Contains(entry));
371*cfb92d14SAndroid Build Coastguard Worker }
372*cfb92d14SAndroid Build Coastguard Worker
373*cfb92d14SAndroid Build Coastguard Worker array2.RemoveAllMatching(entryToRemove.mName);
374*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.GetLength() == array1.GetLength() - 1);
375*cfb92d14SAndroid Build Coastguard Worker
376*cfb92d14SAndroid Build Coastguard Worker // Test `RemoveAllMatching()` using different match modes
377*cfb92d14SAndroid Build Coastguard Worker // removing different subsets.
378*cfb92d14SAndroid Build Coastguard Worker
379*cfb92d14SAndroid Build Coastguard Worker for (MatchMode matchMode : kMatchModes)
380*cfb92d14SAndroid Build Coastguard Worker {
381*cfb92d14SAndroid Build Coastguard Worker array3 = array2;
382*cfb92d14SAndroid Build Coastguard Worker
383*cfb92d14SAndroid Build Coastguard Worker array3.RemoveAllMatching(matchMode);
384*cfb92d14SAndroid Build Coastguard Worker
385*cfb92d14SAndroid Build Coastguard Worker printf("\nArray after `RemoveAllMatching(%s)\n", kMatchModeStrings[matchMode]);
386*cfb92d14SAndroid Build Coastguard Worker
387*cfb92d14SAndroid Build Coastguard Worker for (const Entry &entry : array3)
388*cfb92d14SAndroid Build Coastguard Worker {
389*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(!entry.Matches(matchMode));
390*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.Contains(entry));
391*cfb92d14SAndroid Build Coastguard Worker printf("- Name:%-3s Year:%d\n", entry.mName, entry.mYear);
392*cfb92d14SAndroid Build Coastguard Worker }
393*cfb92d14SAndroid Build Coastguard Worker
394*cfb92d14SAndroid Build Coastguard Worker for (const Entry &entry : array2)
395*cfb92d14SAndroid Build Coastguard Worker {
396*cfb92d14SAndroid Build Coastguard Worker if (!entry.Matches(matchMode))
397*cfb92d14SAndroid Build Coastguard Worker {
398*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array2.Contains(entry));
399*cfb92d14SAndroid Build Coastguard Worker }
400*cfb92d14SAndroid Build Coastguard Worker }
401*cfb92d14SAndroid Build Coastguard Worker
402*cfb92d14SAndroid Build Coastguard Worker array3.RemoveAllMatching(kMatchAll);
403*cfb92d14SAndroid Build Coastguard Worker VerifyOrQuit(array3.IsEmpty());
404*cfb92d14SAndroid Build Coastguard Worker }
405*cfb92d14SAndroid Build Coastguard Worker }
406*cfb92d14SAndroid Build Coastguard Worker
407*cfb92d14SAndroid Build Coastguard Worker printf("\n");
408*cfb92d14SAndroid Build Coastguard Worker }
409*cfb92d14SAndroid Build Coastguard Worker
TestArrayIndexType(void)410*cfb92d14SAndroid Build Coastguard Worker void TestArrayIndexType(void)
411*cfb92d14SAndroid Build Coastguard Worker {
412*cfb92d14SAndroid Build Coastguard Worker typedef Array<uint16_t, 255> Array1;
413*cfb92d14SAndroid Build Coastguard Worker typedef Array<uint16_t, 256> Array2;
414*cfb92d14SAndroid Build Coastguard Worker typedef Array<uint16_t, 100, uint16_t> Array3;
415*cfb92d14SAndroid Build Coastguard Worker
416*cfb92d14SAndroid Build Coastguard Worker static_assert(TypeTraits::IsSame<Array1::IndexType, uint8_t>::kValue, "Array1::IndexType is incorrect");
417*cfb92d14SAndroid Build Coastguard Worker static_assert(TypeTraits::IsSame<Array2::IndexType, uint16_t>::kValue, "Array2::IndexType is incorrect");
418*cfb92d14SAndroid Build Coastguard Worker static_assert(TypeTraits::IsSame<Array3::IndexType, uint16_t>::kValue, "Array3::IndexType is incorrect");
419*cfb92d14SAndroid Build Coastguard Worker }
420*cfb92d14SAndroid Build Coastguard Worker
421*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
422*cfb92d14SAndroid Build Coastguard Worker
main(void)423*cfb92d14SAndroid Build Coastguard Worker int main(void)
424*cfb92d14SAndroid Build Coastguard Worker {
425*cfb92d14SAndroid Build Coastguard Worker ot::TestArray();
426*cfb92d14SAndroid Build Coastguard Worker ot::TestArrayCopyAndFindMatching();
427*cfb92d14SAndroid Build Coastguard Worker ot::TestArrayIndexType();
428*cfb92d14SAndroid Build Coastguard Worker
429*cfb92d14SAndroid Build Coastguard Worker printf("All tests passed\n");
430*cfb92d14SAndroid Build Coastguard Worker return 0;
431*cfb92d14SAndroid Build Coastguard Worker }
432