xref: /aosp_15_r20/external/openthread/tests/unit/test_heap_array.cpp (revision cfb92d1480a9e65faed56933e9c12405f45898b4)
1*cfb92d14SAndroid Build Coastguard Worker /*
2*cfb92d14SAndroid Build Coastguard Worker  *  Copyright (c) 2022, 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 "test_platform.h"
30*cfb92d14SAndroid Build Coastguard Worker 
31*cfb92d14SAndroid Build Coastguard Worker #include <string.h>
32*cfb92d14SAndroid Build Coastguard Worker 
33*cfb92d14SAndroid Build Coastguard Worker #include <openthread/config.h>
34*cfb92d14SAndroid Build Coastguard Worker 
35*cfb92d14SAndroid Build Coastguard Worker #include "test_util.hpp"
36*cfb92d14SAndroid Build Coastguard Worker 
37*cfb92d14SAndroid Build Coastguard Worker #include "common/heap_array.hpp"
38*cfb92d14SAndroid Build Coastguard Worker #include "common/type_traits.hpp"
39*cfb92d14SAndroid Build Coastguard Worker 
40*cfb92d14SAndroid Build Coastguard Worker namespace ot {
41*cfb92d14SAndroid Build Coastguard Worker 
42*cfb92d14SAndroid Build Coastguard Worker // Counters tracking number of times `Entry` constructor and
43*cfb92d14SAndroid Build Coastguard Worker // destructor are invoked. These are used to verify that the `Array`
44*cfb92d14SAndroid Build Coastguard Worker // properly calls constructor/destructor when allocating and copying
45*cfb92d14SAndroid Build Coastguard Worker // array buffer.
46*cfb92d14SAndroid Build Coastguard Worker static uint16_t sConstructorCalls = 0;
47*cfb92d14SAndroid Build Coastguard Worker static uint16_t sDestructorCalls  = 0;
48*cfb92d14SAndroid Build Coastguard Worker 
49*cfb92d14SAndroid Build Coastguard Worker class Entry
50*cfb92d14SAndroid Build Coastguard Worker {
51*cfb92d14SAndroid Build Coastguard Worker public:
Entry(void)52*cfb92d14SAndroid Build Coastguard Worker     Entry(void)
53*cfb92d14SAndroid Build Coastguard Worker         : mValue(0)
54*cfb92d14SAndroid Build Coastguard Worker         , mInitialized(true)
55*cfb92d14SAndroid Build Coastguard Worker     {
56*cfb92d14SAndroid Build Coastguard Worker         sConstructorCalls++;
57*cfb92d14SAndroid Build Coastguard Worker     }
58*cfb92d14SAndroid Build Coastguard Worker 
Entry(uint16_t aValue)59*cfb92d14SAndroid Build Coastguard Worker     explicit Entry(uint16_t aValue)
60*cfb92d14SAndroid Build Coastguard Worker         : mValue(aValue)
61*cfb92d14SAndroid Build Coastguard Worker         , mInitialized(true)
62*cfb92d14SAndroid Build Coastguard Worker     {
63*cfb92d14SAndroid Build Coastguard Worker         sConstructorCalls++;
64*cfb92d14SAndroid Build Coastguard Worker     }
65*cfb92d14SAndroid Build Coastguard Worker 
Entry(const Entry & aEntry)66*cfb92d14SAndroid Build Coastguard Worker     Entry(const Entry &aEntry)
67*cfb92d14SAndroid Build Coastguard Worker         : mValue(aEntry.mValue)
68*cfb92d14SAndroid Build Coastguard Worker         , mInitialized(true)
69*cfb92d14SAndroid Build Coastguard Worker     {
70*cfb92d14SAndroid Build Coastguard Worker         sConstructorCalls++;
71*cfb92d14SAndroid Build Coastguard Worker     }
72*cfb92d14SAndroid Build Coastguard Worker 
~Entry(void)73*cfb92d14SAndroid Build Coastguard Worker     ~Entry(void) { sDestructorCalls++; }
74*cfb92d14SAndroid Build Coastguard Worker 
GetValue(void) const75*cfb92d14SAndroid Build Coastguard Worker     uint16_t GetValue(void) const { return mValue; }
SetValue(uint16_t aValue)76*cfb92d14SAndroid Build Coastguard Worker     void     SetValue(uint16_t aValue) { mValue = aValue; }
IsInitialized(void) const77*cfb92d14SAndroid Build Coastguard Worker     bool     IsInitialized(void) const { return mInitialized; }
operator ==(const Entry & aOther) const78*cfb92d14SAndroid Build Coastguard Worker     bool     operator==(const Entry &aOther) const { return mValue == aOther.mValue; }
Matches(uint16_t aValue) const79*cfb92d14SAndroid Build Coastguard Worker     bool     Matches(uint16_t aValue) const { return mValue == aValue; }
80*cfb92d14SAndroid Build Coastguard Worker 
81*cfb92d14SAndroid Build Coastguard Worker private:
82*cfb92d14SAndroid Build Coastguard Worker     uint16_t mValue;
83*cfb92d14SAndroid Build Coastguard Worker     bool     mInitialized;
84*cfb92d14SAndroid Build Coastguard Worker };
85*cfb92d14SAndroid Build Coastguard Worker 
86*cfb92d14SAndroid Build Coastguard Worker template <typename EntryType>
VerifyEntry(const EntryType & aEntry,const Heap::Array<EntryType,2> & aArray,int aExpectedValue)87*cfb92d14SAndroid Build Coastguard Worker void VerifyEntry(const EntryType &aEntry, const Heap::Array<EntryType, 2> &aArray, int aExpectedValue)
88*cfb92d14SAndroid Build Coastguard Worker {
89*cfb92d14SAndroid Build Coastguard Worker     // Verify the entry in a given array with an expected value.
90*cfb92d14SAndroid Build Coastguard Worker     // Specializations of this template are defined below for `EntryType`
91*cfb92d14SAndroid Build Coastguard Worker     // being `uint16_t` or `Entry` class.
92*cfb92d14SAndroid Build Coastguard Worker 
93*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aEntry);
94*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArray);
95*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aExpectedValue);
96*cfb92d14SAndroid Build Coastguard Worker 
97*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(false, "Specializations of this template method MUST be used instead");
98*cfb92d14SAndroid Build Coastguard Worker }
99*cfb92d14SAndroid Build Coastguard Worker 
VerifyEntry(const uint16_t & aEntry,const Heap::Array<uint16_t,2> & aArray,int aExpectedValue)100*cfb92d14SAndroid Build Coastguard Worker template <> void VerifyEntry(const uint16_t &aEntry, const Heap::Array<uint16_t, 2> &aArray, int aExpectedValue)
101*cfb92d14SAndroid Build Coastguard Worker {
102*cfb92d14SAndroid Build Coastguard Worker     OT_UNUSED_VARIABLE(aArray);
103*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aEntry == static_cast<uint16_t>(aExpectedValue));
104*cfb92d14SAndroid Build Coastguard Worker }
105*cfb92d14SAndroid Build Coastguard Worker 
VerifyEntry(const Entry & aEntry,const Heap::Array<Entry,2> & aArray,int aExpectedValue)106*cfb92d14SAndroid Build Coastguard Worker template <> void VerifyEntry(const Entry &aEntry, const Heap::Array<Entry, 2> &aArray, int aExpectedValue)
107*cfb92d14SAndroid Build Coastguard Worker {
108*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aEntry.IsInitialized());
109*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aEntry.GetValue() == static_cast<uint16_t>(aExpectedValue));
110*cfb92d14SAndroid Build Coastguard Worker 
111*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aArray.ContainsMatching(aEntry.GetValue()));
112*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aArray.FindMatching(aEntry.GetValue()) == &aEntry);
113*cfb92d14SAndroid Build Coastguard Worker }
114*cfb92d14SAndroid Build Coastguard Worker 
VerifyArray(const Heap::Array<EntryType,2> & aArray,Args...aArgs)115*cfb92d14SAndroid Build Coastguard Worker template <typename EntryType, typename... Args> void VerifyArray(const Heap::Array<EntryType, 2> &aArray, Args... aArgs)
116*cfb92d14SAndroid Build Coastguard Worker {
117*cfb92d14SAndroid Build Coastguard Worker     // Verify that array content matches the `aArgs` sequence
118*cfb92d14SAndroid Build Coastguard Worker     // (which can be empty).
119*cfb92d14SAndroid Build Coastguard Worker 
120*cfb92d14SAndroid Build Coastguard Worker     constexpr uint16_t kUnusedValue = 0xffff;
121*cfb92d14SAndroid Build Coastguard Worker 
122*cfb92d14SAndroid Build Coastguard Worker     int      values[] = {aArgs..., 0};
123*cfb92d14SAndroid Build Coastguard Worker     uint16_t index    = 0;
124*cfb92d14SAndroid Build Coastguard Worker 
125*cfb92d14SAndroid Build Coastguard Worker     printf(" - Array (len:%u, capacity:%u) = { ", aArray.GetLength(), aArray.GetCapacity());
126*cfb92d14SAndroid Build Coastguard Worker 
127*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aArray.GetLength() == sizeof...(aArgs));
128*cfb92d14SAndroid Build Coastguard Worker 
129*cfb92d14SAndroid Build Coastguard Worker     if (aArray.GetLength() == 0)
130*cfb92d14SAndroid Build Coastguard Worker     {
131*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aArray.AsCArray() == nullptr);
132*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aArray.Front() == nullptr);
133*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aArray.Back() == nullptr);
134*cfb92d14SAndroid Build Coastguard Worker     }
135*cfb92d14SAndroid Build Coastguard Worker     else
136*cfb92d14SAndroid Build Coastguard Worker     {
137*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aArray.AsCArray() != nullptr);
138*cfb92d14SAndroid Build Coastguard Worker     }
139*cfb92d14SAndroid Build Coastguard Worker 
140*cfb92d14SAndroid Build Coastguard Worker     for (const EntryType &entry : aArray)
141*cfb92d14SAndroid Build Coastguard Worker     {
142*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(index < aArray.GetLength());
143*cfb92d14SAndroid Build Coastguard Worker 
144*cfb92d14SAndroid Build Coastguard Worker         VerifyEntry(entry, aArray, values[index]);
145*cfb92d14SAndroid Build Coastguard Worker 
146*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aArray.Contains(entry));
147*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aArray.Find(entry) == &entry);
148*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(aArray.IndexOf(entry) == index);
149*cfb92d14SAndroid Build Coastguard Worker 
150*cfb92d14SAndroid Build Coastguard Worker         if (index == 0)
151*cfb92d14SAndroid Build Coastguard Worker         {
152*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(aArray.Front() == &entry);
153*cfb92d14SAndroid Build Coastguard Worker         }
154*cfb92d14SAndroid Build Coastguard Worker 
155*cfb92d14SAndroid Build Coastguard Worker         if (index == aArray.GetLength())
156*cfb92d14SAndroid Build Coastguard Worker         {
157*cfb92d14SAndroid Build Coastguard Worker             VerifyOrQuit(aArray.Back() == &entry);
158*cfb92d14SAndroid Build Coastguard Worker         }
159*cfb92d14SAndroid Build Coastguard Worker 
160*cfb92d14SAndroid Build Coastguard Worker         printf("%u ", values[index]);
161*cfb92d14SAndroid Build Coastguard Worker 
162*cfb92d14SAndroid Build Coastguard Worker         index++;
163*cfb92d14SAndroid Build Coastguard Worker     }
164*cfb92d14SAndroid Build Coastguard Worker 
165*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(index == aArray.GetLength());
166*cfb92d14SAndroid Build Coastguard Worker 
167*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(!aArray.Contains(EntryType(kUnusedValue)));
168*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(aArray.Find(EntryType(kUnusedValue)) == nullptr);
169*cfb92d14SAndroid Build Coastguard Worker 
170*cfb92d14SAndroid Build Coastguard Worker     if (TypeTraits::IsSame<EntryType, Entry>::kValue)
171*cfb92d14SAndroid Build Coastguard Worker     {
172*cfb92d14SAndroid Build Coastguard Worker         printf("} (constructor-calls:%u, destructor-calls:%u)\n", sConstructorCalls, sDestructorCalls);
173*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(sConstructorCalls - sDestructorCalls == aArray.GetLength());
174*cfb92d14SAndroid Build Coastguard Worker     }
175*cfb92d14SAndroid Build Coastguard Worker     else
176*cfb92d14SAndroid Build Coastguard Worker     {
177*cfb92d14SAndroid Build Coastguard Worker         printf("}\n");
178*cfb92d14SAndroid Build Coastguard Worker     }
179*cfb92d14SAndroid Build Coastguard Worker }
180*cfb92d14SAndroid Build Coastguard Worker 
TestHeapArrayOfUint16(void)181*cfb92d14SAndroid Build Coastguard Worker void TestHeapArrayOfUint16(void)
182*cfb92d14SAndroid Build Coastguard Worker {
183*cfb92d14SAndroid Build Coastguard Worker     Heap::Array<uint16_t, 2> array;
184*cfb92d14SAndroid Build Coastguard Worker     Heap::Array<uint16_t, 2> array2;
185*cfb92d14SAndroid Build Coastguard Worker     uint16_t                *entry;
186*cfb92d14SAndroid Build Coastguard Worker 
187*cfb92d14SAndroid Build Coastguard Worker     printf("\n\n====================================================================================\n");
188*cfb92d14SAndroid Build Coastguard Worker     printf("TestHeapArrayOfUint16\n\n");
189*cfb92d14SAndroid Build Coastguard Worker 
190*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
191*cfb92d14SAndroid Build Coastguard Worker     printf("After constructor\n");
192*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 0);
193*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array);
194*cfb92d14SAndroid Build Coastguard Worker 
195*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
196*cfb92d14SAndroid Build Coastguard Worker     printf("PushBack(aEntry)\n");
197*cfb92d14SAndroid Build Coastguard Worker 
198*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(1));
199*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 1);
200*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 2);
201*cfb92d14SAndroid Build Coastguard Worker 
202*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(2));
203*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 1, 2);
204*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 2);
205*cfb92d14SAndroid Build Coastguard Worker 
206*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(3));
207*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 1, 2, 3);
208*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 4);
209*cfb92d14SAndroid Build Coastguard Worker 
210*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
211*cfb92d14SAndroid Build Coastguard Worker     printf("entry = PushBack()\n");
212*cfb92d14SAndroid Build Coastguard Worker 
213*cfb92d14SAndroid Build Coastguard Worker     entry = array.PushBack();
214*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(entry != nullptr);
215*cfb92d14SAndroid Build Coastguard Worker     *entry = 4;
216*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 1, 2, 3, 4);
217*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 4);
218*cfb92d14SAndroid Build Coastguard Worker 
219*cfb92d14SAndroid Build Coastguard Worker     entry = array.PushBack();
220*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(entry != nullptr);
221*cfb92d14SAndroid Build Coastguard Worker     *entry = 5;
222*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 1, 2, 3, 4, 5);
223*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 6);
224*cfb92d14SAndroid Build Coastguard Worker 
225*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
226*cfb92d14SAndroid Build Coastguard Worker     printf("Clear()\n");
227*cfb92d14SAndroid Build Coastguard Worker 
228*cfb92d14SAndroid Build Coastguard Worker     array.Clear();
229*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array);
230*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 6);
231*cfb92d14SAndroid Build Coastguard Worker 
232*cfb92d14SAndroid Build Coastguard Worker     *array.PushBack() = 11;
233*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(22));
234*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(33));
235*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(44));
236*cfb92d14SAndroid Build Coastguard Worker     *array.PushBack() = 55;
237*cfb92d14SAndroid Build Coastguard Worker 
238*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 11, 22, 33, 44, 55);
239*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 6);
240*cfb92d14SAndroid Build Coastguard Worker 
241*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(66));
242*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(77));
243*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 11, 22, 33, 44, 55, 66, 77);
244*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 8);
245*cfb92d14SAndroid Build Coastguard Worker 
246*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
247*cfb92d14SAndroid Build Coastguard Worker     printf("PopBack()\n");
248*cfb92d14SAndroid Build Coastguard Worker 
249*cfb92d14SAndroid Build Coastguard Worker     array.PopBack();
250*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 11, 22, 33, 44, 55, 66);
251*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 8);
252*cfb92d14SAndroid Build Coastguard Worker 
253*cfb92d14SAndroid Build Coastguard Worker     array.PopBack();
254*cfb92d14SAndroid Build Coastguard Worker     array.PopBack();
255*cfb92d14SAndroid Build Coastguard Worker     array.PopBack();
256*cfb92d14SAndroid Build Coastguard Worker     array.PopBack();
257*cfb92d14SAndroid Build Coastguard Worker     array.PopBack();
258*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 11);
259*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 8);
260*cfb92d14SAndroid Build Coastguard Worker 
261*cfb92d14SAndroid Build Coastguard Worker     array.PopBack();
262*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array);
263*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 8);
264*cfb92d14SAndroid Build Coastguard Worker 
265*cfb92d14SAndroid Build Coastguard Worker     array.PopBack();
266*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array);
267*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 8);
268*cfb92d14SAndroid Build Coastguard Worker 
269*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t num = 0; num < 11; num++)
270*cfb92d14SAndroid Build Coastguard Worker     {
271*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.PushBack(num + 0x100));
272*cfb92d14SAndroid Build Coastguard Worker     }
273*cfb92d14SAndroid Build Coastguard Worker 
274*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10a);
275*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 12);
276*cfb92d14SAndroid Build Coastguard Worker 
277*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
278*cfb92d14SAndroid Build Coastguard Worker     printf("Free()\n");
279*cfb92d14SAndroid Build Coastguard Worker 
280*cfb92d14SAndroid Build Coastguard Worker     array.Free();
281*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array);
282*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 0);
283*cfb92d14SAndroid Build Coastguard Worker 
284*cfb92d14SAndroid Build Coastguard Worker     array.Free();
285*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array);
286*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 0);
287*cfb92d14SAndroid Build Coastguard Worker 
288*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
289*cfb92d14SAndroid Build Coastguard Worker     printf("ReserveCapacity()\n");
290*cfb92d14SAndroid Build Coastguard Worker 
291*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.ReserveCapacity(5));
292*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array);
293*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 5);
294*cfb92d14SAndroid Build Coastguard Worker 
295*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(0));
296*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 0);
297*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 5);
298*cfb92d14SAndroid Build Coastguard Worker 
299*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t num = 1; num < 5; num++)
300*cfb92d14SAndroid Build Coastguard Worker     {
301*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.PushBack(num));
302*cfb92d14SAndroid Build Coastguard Worker     }
303*cfb92d14SAndroid Build Coastguard Worker 
304*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 0, 1, 2, 3, 4);
305*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 5);
306*cfb92d14SAndroid Build Coastguard Worker 
307*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.PushBack(5));
308*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 0, 1, 2, 3, 4, 5);
309*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 7);
310*cfb92d14SAndroid Build Coastguard Worker 
311*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.ReserveCapacity(3));
312*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 0, 1, 2, 3, 4, 5);
313*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 7);
314*cfb92d14SAndroid Build Coastguard Worker 
315*cfb92d14SAndroid Build Coastguard Worker     SuccessOrQuit(array.ReserveCapacity(10));
316*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array, 0, 1, 2, 3, 4, 5);
317*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 10);
318*cfb92d14SAndroid Build Coastguard Worker 
319*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
320*cfb92d14SAndroid Build Coastguard Worker     printf("TakeFrom()\n");
321*cfb92d14SAndroid Build Coastguard Worker 
322*cfb92d14SAndroid Build Coastguard Worker     for (uint16_t num = 0; num < 7; num++)
323*cfb92d14SAndroid Build Coastguard Worker     {
324*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array2.PushBack(num + 0x20));
325*cfb92d14SAndroid Build Coastguard Worker     }
326*cfb92d14SAndroid Build Coastguard Worker 
327*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array2, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26);
328*cfb92d14SAndroid Build Coastguard Worker 
329*cfb92d14SAndroid Build Coastguard Worker     array2.TakeFrom(static_cast<Heap::Array<uint16_t, 2> &&>(array));
330*cfb92d14SAndroid Build Coastguard Worker 
331*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array);
332*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array.GetCapacity() == 0);
333*cfb92d14SAndroid Build Coastguard Worker 
334*cfb92d14SAndroid Build Coastguard Worker     VerifyArray(array2, 0, 1, 2, 3, 4, 5);
335*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(array2.GetCapacity() == 10);
336*cfb92d14SAndroid Build Coastguard Worker 
337*cfb92d14SAndroid Build Coastguard Worker     printf("\n -- PASS\n");
338*cfb92d14SAndroid Build Coastguard Worker }
339*cfb92d14SAndroid Build Coastguard Worker 
TestHeapArray(void)340*cfb92d14SAndroid Build Coastguard Worker void TestHeapArray(void)
341*cfb92d14SAndroid Build Coastguard Worker {
342*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sConstructorCalls == 0);
343*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sDestructorCalls == 0);
344*cfb92d14SAndroid Build Coastguard Worker 
345*cfb92d14SAndroid Build Coastguard Worker     printf("\n\n====================================================================================\n");
346*cfb92d14SAndroid Build Coastguard Worker     printf("TestHeapArray\n\n");
347*cfb92d14SAndroid Build Coastguard Worker 
348*cfb92d14SAndroid Build Coastguard Worker     {
349*cfb92d14SAndroid Build Coastguard Worker         Heap::Array<Entry, 2> array;
350*cfb92d14SAndroid Build Coastguard Worker         Heap::Array<Entry, 2> array2;
351*cfb92d14SAndroid Build Coastguard Worker         Entry                *entry;
352*cfb92d14SAndroid Build Coastguard Worker 
353*cfb92d14SAndroid Build Coastguard Worker         printf("------------------------------------------------------------------------------------\n");
354*cfb92d14SAndroid Build Coastguard Worker         printf("After constructor\n");
355*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 0);
356*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array);
357*cfb92d14SAndroid Build Coastguard Worker 
358*cfb92d14SAndroid Build Coastguard Worker         printf("------------------------------------------------------------------------------------\n");
359*cfb92d14SAndroid Build Coastguard Worker         printf("PushBack(aEntry)\n");
360*cfb92d14SAndroid Build Coastguard Worker 
361*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.PushBack(Entry(1)));
362*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1);
363*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 2);
364*cfb92d14SAndroid Build Coastguard Worker 
365*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.PushBack(Entry(2)));
366*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1, 2);
367*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 2);
368*cfb92d14SAndroid Build Coastguard Worker 
369*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.PushBack(Entry(3)));
370*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1, 2, 3);
371*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 4);
372*cfb92d14SAndroid Build Coastguard Worker 
373*cfb92d14SAndroid Build Coastguard Worker         entry = array.PushBack();
374*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(entry != nullptr);
375*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(entry->IsInitialized());
376*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(entry->GetValue() == 0);
377*cfb92d14SAndroid Build Coastguard Worker         entry->SetValue(4);
378*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1, 2, 3, 4);
379*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 4);
380*cfb92d14SAndroid Build Coastguard Worker 
381*cfb92d14SAndroid Build Coastguard Worker         entry = array.PushBack();
382*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(entry != nullptr);
383*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(entry->IsInitialized());
384*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(entry->GetValue() == 0);
385*cfb92d14SAndroid Build Coastguard Worker         entry->SetValue(5);
386*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1, 2, 3, 4, 5);
387*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 6);
388*cfb92d14SAndroid Build Coastguard Worker 
389*cfb92d14SAndroid Build Coastguard Worker         printf("------------------------------------------------------------------------------------\n");
390*cfb92d14SAndroid Build Coastguard Worker         printf("PopBack()\n");
391*cfb92d14SAndroid Build Coastguard Worker 
392*cfb92d14SAndroid Build Coastguard Worker         array.PopBack();
393*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1, 2, 3, 4);
394*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 6);
395*cfb92d14SAndroid Build Coastguard Worker 
396*cfb92d14SAndroid Build Coastguard Worker         array.PopBack();
397*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1, 2, 3);
398*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 6);
399*cfb92d14SAndroid Build Coastguard Worker 
400*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.PushBack(Entry(7)));
401*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1, 2, 3, 7);
402*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 6);
403*cfb92d14SAndroid Build Coastguard Worker 
404*cfb92d14SAndroid Build Coastguard Worker         array.PopBack();
405*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 1, 2, 3);
406*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 6);
407*cfb92d14SAndroid Build Coastguard Worker 
408*cfb92d14SAndroid Build Coastguard Worker         printf("------------------------------------------------------------------------------------\n");
409*cfb92d14SAndroid Build Coastguard Worker         printf("Clear()\n");
410*cfb92d14SAndroid Build Coastguard Worker 
411*cfb92d14SAndroid Build Coastguard Worker         array.Clear();
412*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array);
413*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 6);
414*cfb92d14SAndroid Build Coastguard Worker 
415*cfb92d14SAndroid Build Coastguard Worker         for (uint16_t num = 0; num < 11; num++)
416*cfb92d14SAndroid Build Coastguard Worker         {
417*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(array.PushBack(Entry(num)));
418*cfb92d14SAndroid Build Coastguard Worker         }
419*cfb92d14SAndroid Build Coastguard Worker 
420*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
421*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 12);
422*cfb92d14SAndroid Build Coastguard Worker 
423*cfb92d14SAndroid Build Coastguard Worker         printf("------------------------------------------------------------------------------------\n");
424*cfb92d14SAndroid Build Coastguard Worker         printf("Free()\n");
425*cfb92d14SAndroid Build Coastguard Worker         array.Free();
426*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array);
427*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 0);
428*cfb92d14SAndroid Build Coastguard Worker 
429*cfb92d14SAndroid Build Coastguard Worker         printf("------------------------------------------------------------------------------------\n");
430*cfb92d14SAndroid Build Coastguard Worker         printf("ReserveCapacity()\n");
431*cfb92d14SAndroid Build Coastguard Worker 
432*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.ReserveCapacity(5));
433*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array);
434*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 5);
435*cfb92d14SAndroid Build Coastguard Worker 
436*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.PushBack(Entry(0)));
437*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 0);
438*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 5);
439*cfb92d14SAndroid Build Coastguard Worker 
440*cfb92d14SAndroid Build Coastguard Worker         for (uint16_t num = 1; num < 5; num++)
441*cfb92d14SAndroid Build Coastguard Worker         {
442*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(array.PushBack(Entry(num)));
443*cfb92d14SAndroid Build Coastguard Worker         }
444*cfb92d14SAndroid Build Coastguard Worker 
445*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 0, 1, 2, 3, 4);
446*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 5);
447*cfb92d14SAndroid Build Coastguard Worker 
448*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.PushBack(Entry(5)));
449*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 0, 1, 2, 3, 4, 5);
450*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 7);
451*cfb92d14SAndroid Build Coastguard Worker 
452*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.ReserveCapacity(3));
453*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 0, 1, 2, 3, 4, 5);
454*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 7);
455*cfb92d14SAndroid Build Coastguard Worker 
456*cfb92d14SAndroid Build Coastguard Worker         SuccessOrQuit(array.ReserveCapacity(10));
457*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array, 0, 1, 2, 3, 4, 5);
458*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 10);
459*cfb92d14SAndroid Build Coastguard Worker 
460*cfb92d14SAndroid Build Coastguard Worker         printf("------------------------------------------------------------------------------------\n");
461*cfb92d14SAndroid Build Coastguard Worker         printf("TakeFrom()\n");
462*cfb92d14SAndroid Build Coastguard Worker 
463*cfb92d14SAndroid Build Coastguard Worker         for (uint16_t num = 0; num < 7; num++)
464*cfb92d14SAndroid Build Coastguard Worker         {
465*cfb92d14SAndroid Build Coastguard Worker             SuccessOrQuit(array2.PushBack(Entry(num + 0x20)));
466*cfb92d14SAndroid Build Coastguard Worker         }
467*cfb92d14SAndroid Build Coastguard Worker 
468*cfb92d14SAndroid Build Coastguard Worker         array2.TakeFrom(static_cast<Heap::Array<Entry, 2> &&>(array));
469*cfb92d14SAndroid Build Coastguard Worker 
470*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetLength() == 0);
471*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array.GetCapacity() == 0);
472*cfb92d14SAndroid Build Coastguard Worker 
473*cfb92d14SAndroid Build Coastguard Worker         VerifyArray(array2, 0, 1, 2, 3, 4, 5);
474*cfb92d14SAndroid Build Coastguard Worker         VerifyOrQuit(array2.GetCapacity() == 10);
475*cfb92d14SAndroid Build Coastguard Worker     }
476*cfb92d14SAndroid Build Coastguard Worker 
477*cfb92d14SAndroid Build Coastguard Worker     printf("------------------------------------------------------------------------------------\n");
478*cfb92d14SAndroid Build Coastguard Worker     printf("Array destructor\n");
479*cfb92d14SAndroid Build Coastguard Worker     printf(" - (constructor-calls:%u, destructor-calls:%u)\n", sConstructorCalls, sDestructorCalls);
480*cfb92d14SAndroid Build Coastguard Worker     VerifyOrQuit(sConstructorCalls == sDestructorCalls,
481*cfb92d14SAndroid Build Coastguard Worker                  "Array destructor failed to invoke destructor on all its existing entries");
482*cfb92d14SAndroid Build Coastguard Worker 
483*cfb92d14SAndroid Build Coastguard Worker     printf("\n -- PASS\n");
484*cfb92d14SAndroid Build Coastguard Worker }
485*cfb92d14SAndroid Build Coastguard Worker 
486*cfb92d14SAndroid Build Coastguard Worker } // namespace ot
487*cfb92d14SAndroid Build Coastguard Worker 
main(void)488*cfb92d14SAndroid Build Coastguard Worker int main(void)
489*cfb92d14SAndroid Build Coastguard Worker {
490*cfb92d14SAndroid Build Coastguard Worker     ot::TestHeapArrayOfUint16();
491*cfb92d14SAndroid Build Coastguard Worker     ot::TestHeapArray();
492*cfb92d14SAndroid Build Coastguard Worker     printf("\nAll tests passed.\n");
493*cfb92d14SAndroid Build Coastguard Worker     return 0;
494*cfb92d14SAndroid Build Coastguard Worker }
495