VirtualBox

source: vbox/trunk/src/VBox/Runtime/testcase/tstIprtList.cpp@ 36500

最後變更 在這個檔案從36500是 36500,由 vboxsync 提交於 14 年 前

IPRT: add a generic list class

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 16.3 KB
 
1/* $Id: tstIprtList.cpp 36500 2011-04-01 13:38:03Z vboxsync $ */
2/** @file
3 * IPRT Testcase - iprt::list.
4 */
5
6/*
7 * Copyright (C) 2011 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.alldomusa.eu.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27/*******************************************************************************
28* Header Files *
29*******************************************************************************/
30#include <iprt/cpp/list.h>
31
32#include <iprt/cpp/ministring.h>
33#include <iprt/test.h>
34#include <iprt/rand.h>
35
36/*******************************************************************************
37* Test Data *
38*******************************************************************************/
39static const char *gs_apcszTestStrings[] =
40{
41 "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
42 "Vestibulum non turpis vel metus pellentesque tincidunt at id massa.",
43 "Cras quis erat sed nulla ullamcorper molestie.",
44 "Mauris ac elit turpis, id pulvinar diam.",
45 "Nulla quis dolor dolor, in ultrices diam.",
46 "Vivamus ac quam non ipsum vehicula tempor ac ac arcu.",
47 "Aenean posuere lacus blandit erat semper eu iaculis ante eleifend.",
48 "Donec quis quam a lacus interdum sollicitudin quis eu est.",
49 "Morbi sed nisi a arcu commodo convallis.",
50 "Aenean molestie condimentum velit, non mattis magna ultricies quis.",
51 "Nulla id velit at mauris gravida mattis.",
52 "Phasellus viverra velit eu urna semper in porta arcu sollicitudin.",
53 "Pellentesque consequat turpis et tortor hendrerit id tempor ipsum lacinia.",
54 "Cras iaculis nulla quis risus pulvinar eget tempor lectus placerat.",
55 "Nullam in nulla sed sapien euismod euismod.",
56 "Morbi in tortor at magna sagittis fermentum ut eu nunc.",
57 "Nulla vitae ante sit amet dui molestie sagittis lacinia quis tellus.",
58 "Proin iaculis lorem ultricies metus bibendum tincidunt.",
59 "Sed gravida purus id risus sollicitudin ac porta orci vestibulum.",
60 "Duis quis purus non ligula consectetur cursus eu interdum erat.",
61 "Nullam non nunc in elit volutpat tempor in nec metus.",
62 "Aliquam id purus eget enim luctus molestie.",
63 "Sed id elit nec elit luctus scelerisque.",
64 "Suspendisse viverra leo non ligula congue ac luctus nisl vulputate.",
65 "Nulla dignissim lobortis nunc, eu tempus ipsum luctus sed.",
66 "Integer vel lacus lacus, quis condimentum felis.",
67 "Nulla ut lacus ac lacus gravida ultrices id sed ipsum.",
68 "Etiam non purus ut augue fermentum consequat.",
69 "Nam sit amet eros quis nibh blandit lacinia non posuere lectus.",
70 "Sed sit amet ipsum et dolor sagittis facilisis.",
71 "Ut congue nisi lacus, vel ultrices est.",
72 "Donec vel erat ut justo hendrerit sodales eu eget libero.",
73 "Integer a ipsum ac nunc eleifend congue convallis a urna.",
74 "Sed vel eros eu lectus imperdiet vehicula.",
75 "Vivamus eget turpis sed erat dapibus varius eget eu nulla.",
76 "Nam id nulla non elit eleifend commodo sed ac est.",
77 "Integer pulvinar dolor sodales velit pulvinar et facilisis eros scelerisque.",
78 "Ut mattis arcu ut libero imperdiet in rhoncus augue sodales.",
79 "Ut luctus turpis ligula, id dapibus felis.",
80 "Nullam sit amet sapien eget tellus hendrerit vestibulum eget in odio.",
81 "Phasellus non orci vitae mi placerat semper.",
82 "Quisque pharetra aliquet velit, quis tempor magna porttitor nec.",
83 "Praesent porta neque felis, vehicula facilisis odio.",
84 "Maecenas ultricies ipsum eu velit laoreet faucibus.",
85 "Mauris et nunc leo, et euismod quam.",
86 "Phasellus a felis et justo fringilla lacinia.",
87 "Vestibulum eget augue ante, ac viverra neque.",
88 "Mauris pellentesque ligula quis metus elementum venenatis.",
89 "Curabitur eu neque tellus, non porta sapien.",
90 "Ut mattis metus id enim aliquam laoreet et sed tortor.",
91 "Aenean quis nulla vitae nulla auctor lobortis a egestas turpis.",
92 "Praesent vitae ante a urna porta placerat non nec eros.",
93 "Donec quis neque eros, placerat adipiscing turpis.",
94 "Cras sit amet sapien risus, quis euismod arcu.",
95 "Integer volutpat massa eros, ac gravida mi.",
96 "Nunc vitae nunc sagittis diam vulputate suscipit.",
97 "Suspendisse quis mauris bibendum mauris aliquet pulvinar.",
98 "Donec volutpat vestibulum ligula, eget interdum tortor malesuada sit amet.",
99 "Mauris hendrerit dui non nibh varius sit amet fringilla orci pretium.",
100 "Phasellus a quam tellus, auctor lacinia sapien.",
101 "Sed dapibus leo vitae neque faucibus id porttitor sapien ultricies.",
102 "Maecenas euismod elit nec tortor sagittis pretium.",
103 "Ut tincidunt risus at erat fermentum sit amet molestie ante lacinia.",
104 "Nulla non leo nec lacus sollicitudin lobortis a a nisl.",
105 "Nunc vulputate erat vel libero elementum a interdum turpis malesuada.",
106 "Morbi id libero turpis, a lobortis dolor.",
107 "Donec vehicula imperdiet lorem, non pretium nulla tempus ut.",
108 "Morbi lacinia massa id nunc tempus in blandit risus blandit.",
109 "Sed feugiat orci id ipsum suscipit quis fringilla enim rutrum.",
110 "Mauris suscipit lobortis urna, vel dictum justo iaculis ac.",
111 "In rhoncus lectus tristique nunc blandit gravida placerat turpis rutrum.",
112 "Aliquam pellentesque ornare justo, sed hendrerit metus mattis a.",
113 "Nam aliquet lorem congue nisl blandit posuere.",
114 "Sed lobortis interdum ipsum, ac cursus erat lacinia in.",
115 "Maecenas vel tortor vel lorem facilisis interdum.",
116 "Aenean porttitor massa enim, eget dignissim est.",
117 "Nullam id libero lacus, mattis feugiat risus.",
118 "Fusce et dolor at eros ornare auctor malesuada vel ipsum.",
119 "Donec at massa sit amet lorem pellentesque interdum at ac lacus.",
120 "Praesent suscipit velit at justo suscipit eu vestibulum ligula interdum.",
121 "Aenean id justo nulla, vitae vulputate diam.",
122 "Fusce pellentesque leo quis orci pulvinar at pellentesque tellus dictum.",
123 "Ut facilisis purus at enim varius vulputate.",
124 "Donec malesuada bibendum sapien, sed pretium nisi cursus quis.",
125 "Mauris porttitor diam ut sapien pretium egestas.",
126 "Vestibulum ut justo eu libero semper convallis vitae et velit.",
127 "Quisque eleifend dapibus ligula, eu tincidunt massa rutrum at.",
128 "Sed euismod diam eget enim suscipit dictum.",
129 "Mauris fermentum orci eu nunc venenatis in sollicitudin tellus vestibulum.",
130 "Vivamus faucibus consequat turpis, lobortis vehicula lectus gravida eget.",
131 "Curabitur eu erat eu mi interdum scelerisque.",
132 "Morbi consequat molestie nulla, imperdiet elementum augue sagittis vel.",
133 "Sed ullamcorper velit suscipit arcu egestas quis commodo est hendrerit.",
134 "Proin vitae velit ut enim sollicitudin ultrices.",
135 "Curabitur posuere euismod lacus, sed volutpat erat adipiscing sit amet.",
136 "Cras sit amet sem lorem, in cursus augue.",
137 "Sed fermentum ultricies orci, quis hendrerit risus imperdiet et.",
138 "Proin nec arcu interdum ipsum molestie vestibulum.",
139 "Nulla quis quam non sem pretium scelerisque et eu velit.",
140 "Donec eu tellus nisl, ac vehicula tortor."
141};
142
143/*******************************************************************************
144* Tests *
145*******************************************************************************/
146template<typename T1, typename T2>
147static void test(const char* pcszDesc, T2 aTestData[], size_t cSize)
148{
149 RTTestISubF("%s with size of %u (items=%u)", pcszDesc, sizeof(T1), cSize);
150
151 /*
152 * Construction
153 */
154
155 /* Create a test list */
156 iprt::list<T1> testList;
157
158 RTTESTI_CHECK(testList.isEmpty());
159 RTTESTI_CHECK(testList.size() == 0);
160 RTTESTI_CHECK(testList.capacity() == iprt::list<T1>::DefaultCapacity);
161
162 /*
163 * Adding
164 */
165
166 /* Add the second half of the test data */
167 size_t cAdded = 1;
168 /* Start adding the second half of our test list */
169 for (size_t i = cSize / 2; i < cSize; ++i, ++cAdded)
170 {
171 testList.append(aTestData[i]);
172 RTTESTI_CHECK_RETV(testList.size() == cAdded);
173 RTTESTI_CHECK(testList.at(0) == aTestData[cSize / 2]);
174 RTTESTI_CHECK(testList[0] == aTestData[cSize / 2]);
175 RTTESTI_CHECK(testList.first() == aTestData[cSize / 2]);
176 RTTESTI_CHECK(testList.at(cAdded - 1) == aTestData[i]);
177 RTTESTI_CHECK(testList[cAdded - 1] == aTestData[i]);
178 RTTESTI_CHECK(testList.last() == aTestData[i]);
179 }
180 /* Check that all is correctly appended. */
181 RTTESTI_CHECK_RETV(testList.size() == cSize / 2);
182 RTTESTI_CHECK_RETV(testList.isEmpty() == false);
183 for (size_t i = 0; i < testList.size(); ++i)
184 RTTESTI_CHECK(testList.at(i) == aTestData[cSize / 2 + i]);
185 /* Start prepending the first half of our test list. Iterate reverse to get
186 * the correct sorting back. */
187 for (size_t i = cSize / 2; i > 0; --i, ++cAdded)
188 {
189 testList.prepend(aTestData[i - 1]);
190 RTTESTI_CHECK_RETV(testList.size() == cAdded);
191 RTTESTI_CHECK(testList.at(0) == aTestData[i - 1]);
192 RTTESTI_CHECK(testList[0] == aTestData[i - 1]);
193 RTTESTI_CHECK(testList.first() == aTestData[i - 1]);
194 RTTESTI_CHECK(testList.at(cAdded - 1) == aTestData[cSize - 1]);
195 RTTESTI_CHECK(testList[cAdded - 1] == aTestData[cSize - 1]);
196 RTTESTI_CHECK(testList.last() == aTestData[cSize - 1]);
197 }
198 /* Check that all is correctly prepended. */
199 RTTESTI_CHECK_RETV(testList.size() == cSize);
200 RTTESTI_CHECK_RETV(testList.isEmpty() == false);
201 for (size_t i = 0; i < testList.size(); ++i)
202 RTTESTI_CHECK(testList.at(i) == aTestData[i]);
203
204 /*
205 * Copy operator
206 */
207 iprt::list<T1> testList2(testList);
208 /* Check that all is correctly appended. */
209 RTTESTI_CHECK_RETV(testList2.size() == cSize);
210 for (size_t i = 0; i < testList2.size(); ++i)
211 RTTESTI_CHECK(testList2.at(i) == aTestData[i]);
212
213 /*
214 * "=" operator
215 */
216 iprt::list<T1> testList3;
217 testList3 = testList;
218 /* Check that all is correctly appended. */
219 RTTESTI_CHECK_RETV(testList3.size() == cSize);
220 for (size_t i = 0; i < testList3.size(); ++i)
221 RTTESTI_CHECK(testList3.at(i) == aTestData[i]);
222
223 /*
224 * Append list
225 */
226 testList2.append(testList3);
227 /* Check that all is correctly appended. */
228 RTTESTI_CHECK_RETV(testList2.size() == cSize * 2);
229 for (size_t i = 0; i < testList2.size(); ++i)
230 RTTESTI_CHECK(testList2.at(i) == aTestData[i % cSize]);
231
232 /*
233 * Prepend list
234 */
235 testList2.prepend(testList3);
236 /* Check that all is correctly appended. */
237 RTTESTI_CHECK_RETV(testList2.size() == cSize * 3);
238 for (size_t i = 0; i < testList2.size(); ++i)
239 RTTESTI_CHECK(testList2.at(i) == aTestData[i % cSize]);
240
241 /*
242 * "value" method
243 */
244 for (size_t i = 0; i < testList2.size(); ++i)
245 RTTESTI_CHECK(testList2.value(i) == aTestData[i % cSize]);
246 for (size_t i = 0; i < testList2.size(); ++i)
247 RTTESTI_CHECK(testList2.value(i, T1()) == aTestData[i % cSize]);
248 RTTESTI_CHECK(testList2.value(testList2.size() + 1) == T1()); /* Invalid index */
249 RTTESTI_CHECK(testList2.value(testList2.size() + 1, T1()) == T1()); /* Invalid index */
250
251 /*
252 * operator[] (reading)
253 */
254 for (size_t i = 0; i < testList.size(); ++i)
255 RTTESTI_CHECK(testList[i] == aTestData[i]);
256 /*
257 * operator[] (writing)
258 *
259 * Replace with inverted array.
260 */
261 for (size_t i = 0; i < cSize; ++i)
262 testList[i] = aTestData[cSize - i - 1];
263 RTTESTI_CHECK_RETV(testList.size() == cSize);
264 for (size_t i = 0; i < testList.size(); ++i)
265 RTTESTI_CHECK(testList[i] == aTestData[cSize - i - 1]);
266
267 /*
268 * Replace
269 *
270 * Replace with inverted array (Must be original array when finished).
271 */
272 for (size_t i = 0; i < cSize; ++i)
273 testList.replace(i, aTestData[i]);
274 RTTESTI_CHECK_RETV(testList.size() == cSize);
275 for (size_t i = 0; i < testList.size(); ++i)
276 RTTESTI_CHECK(testList[i] == aTestData[i]);
277
278 /*
279 * Removing
280 */
281
282 /* Remove Range */
283 testList2.removeRange(cSize, cSize * 2);
284 RTTESTI_CHECK_RETV(testList2.size() == cSize * 2);
285 for (size_t i = 0; i < testList2.size(); ++i)
286 RTTESTI_CHECK(testList2.at(i) == aTestData[i % cSize]);
287
288 /* Remove the first half (reverse) */
289 size_t cRemoved = 1;
290 for (size_t i = cSize / 2; i > 0; --i, ++cRemoved)
291 {
292 testList.removeAt(i - 1);
293 RTTESTI_CHECK_RETV(testList.size() == cSize - cRemoved);
294 }
295 RTTESTI_CHECK_RETV(testList.size() == cSize / 2);
296 /* Check that all is correctly removed and only the second part of the list
297 * is still there. */
298 for (size_t i = 0; i < testList.size(); ++i)
299 RTTESTI_CHECK(testList.at(i) == aTestData[cSize / 2 + i]);
300
301 /*
302 * setCapacitiy
303 */
304 testList.setCapacity(cSize * 5);
305 RTTESTI_CHECK(testList.capacity() == cSize * 5);
306 RTTESTI_CHECK_RETV(testList.size() == cSize / 2);
307 /* As the capacity just increased, we should still have all entries from
308 * the previous list. */
309 for (size_t i = 0; i < testList.size(); ++i)
310 RTTESTI_CHECK(testList.at(i) == aTestData[cSize / 2 + i]);
311 /* Decrease the capacity so it will be smaller than the count of items in
312 * the list. The list should be shrink automatically, but the remaining
313 * items should be still valid. */
314 testList.setCapacity(cSize / 4);
315 RTTESTI_CHECK_RETV(testList.size() == cSize / 4);
316 RTTESTI_CHECK(testList.capacity() == cSize / 4);
317 for (size_t i = 0; i < testList.size(); ++i)
318 RTTESTI_CHECK(testList.at(i) == aTestData[cSize / 2 + i]);
319
320 /* Clear all */
321 testList.clear();
322 RTTESTI_CHECK_RETV(testList.isEmpty());
323 RTTESTI_CHECK_RETV(testList.size() == 0);
324 RTTESTI_CHECK(testList.capacity() == iprt::list<T1>::DefaultCapacity);
325}
326
327int main()
328{
329 /* How many integer test items should be created. */
330 static const size_t s_cTestCount = 1000;
331
332 RTTEST hTest;
333 int rc = RTTestInitAndCreate("tstIprtList", &hTest);
334 if (rc)
335 return rc;
336 RTTestBanner(hTest);
337
338 /* Some host info. */
339 RTTestIPrintf(RTTESTLVL_ALWAYS, "sizeof(void*)=%d", sizeof(void*));
340
341 /*
342 * The tests.
343 */
344
345 /*
346 * Native types.
347 */
348 uint8_t au8TestInts[s_cTestCount];
349 for (size_t i = 0; i < RT_ELEMENTS(au8TestInts); ++i)
350 au8TestInts[i] = (float)RTRandU32() / UINT32_MAX * UINT8_MAX;
351 test<uint8_t, uint8_t>("Native type", au8TestInts, RT_ELEMENTS(au8TestInts));
352 uint16_t au16TestInts[s_cTestCount];
353 for (size_t i = 0; i < RT_ELEMENTS(au16TestInts); ++i)
354 au16TestInts[i] = (float)RTRandU32() / UINT32_MAX * UINT16_MAX;
355 test<uint16_t, uint16_t>("Native type", au16TestInts, RT_ELEMENTS(au16TestInts));
356 uint32_t au32TestInts[s_cTestCount];
357 for (size_t i = 0; i < RT_ELEMENTS(au32TestInts); ++i)
358 au32TestInts[i] = RTRandU32();
359 test<uint32_t, uint32_t>("Native type", au32TestInts, RT_ELEMENTS(au32TestInts));
360 /*
361 * Specialized type.
362 */
363 uint64_t au64TestInts[s_cTestCount];
364 for (size_t i = 0; i < RT_ELEMENTS(au64TestInts); ++i)
365 au64TestInts[i] = RTRandU64();
366 test<uint64_t, uint64_t>("Specialized type", au64TestInts, RT_ELEMENTS(au64TestInts));
367 /*
368 * Big size type (translate to internal pointer list).
369 */
370 test<iprt::MiniString, const char*>("Class type", gs_apcszTestStrings, RT_ELEMENTS(gs_apcszTestStrings));
371
372 /*
373 * Summary.
374 */
375 return RTTestSummaryAndDestroy(hTest);
376}
377
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette