xref: /aosp_15_r20/external/openthread/tests/unit/test_array.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
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