|
|
1.1 root 1: /*
2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: #if DEBUG
23: #include "Tests.h"
24:
25: #include <libkern/c++/OSArray.h>
26: #include <libkern/c++/OSSet.h>
27: #include <libkern/c++/OSDictionary.h>
28: #include <libkern/c++/OSString.h>
29: #include <libkern/c++/OSSymbol.h>
30: #include <libkern/c++/OSCollectionIterator.h>
31:
32: void testArray()
33: {
34: bool res = true;
35: void *spaceCheck, *spaceCheck2 , *spaceCheck3;
36: int i, j, count, count2;
37: OSObject *cache[numStrCache], *str, *sym;
38: OSArray *array1, *array2;
39:
40: // Do first test without memory leak tests to initialise the metaclass
41: array1 = OSArray::withCapacity(1);
42: TEST_ASSERT('A', "0a", array1);
43: if (array1)
44: array1->release();
45:
46: // Grow the symbol pool to maximum
47: for (i = 0; i < numStrCache; i++)
48: cache[i] = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
49: for (i = 0; i < numStrCache; i++)
50: cache[i]->release();
51:
52: // Create and destroy an array
53: spaceCheck = checkPointSpace();
54: array1 = OSArray::withCapacity(1);
55: TEST_ASSERT('A', "1a", array1);
56: if (array1) {
57: TEST_ASSERT('A', "1b", !array1->getCount());
58: TEST_ASSERT('A', "1c", 1 == array1->getCapacity());
59: TEST_ASSERT('A', "1d", 1 == array1->getCapacityIncrement());
60: TEST_ASSERT('A', "1e", 4 == array1->setCapacityIncrement(4));
61: TEST_ASSERT('A', "1f", 4 == array1->getCapacityIncrement());
62: TEST_ASSERT('A', "1g", 8 == array1->ensureCapacity(5));
63:
64: spaceCheck2 = checkPointSpace();
65: cache[0] = IOString::withCStringNoCopy(strCache[0]);
66:
67: spaceCheck3 = checkPointSpace();
68: TEST_ASSERT('A', "1h", array1->setObject(cache[0]));
69: TEST_ASSERT('A', "1i", cache[0] == array1->getObject(0));
70: cache[0]->release();
71: res = res && checkSpace("(A)1j", spaceCheck3, 0);
72:
73: TEST_ASSERT('A', "1k", 1 == array1->getCount());
74: array1->flushCollection();
75: TEST_ASSERT('A', "1l", !array1->getCount());
76: res = res && checkSpace("(A)1m", spaceCheck2, 0);
77:
78: array1->release();
79: }
80: res = res && checkSpace("(A)1", spaceCheck, 0);
81:
82: // Check the creation of a sizable OSArray from an array of IOObjects
83: // Also check indexing into the array.
84: spaceCheck = checkPointSpace();
85: for (i = 0; i < numStrCache; i++)
86: cache[i] = OSString::withCStringNoCopy(strCache[i]);
87: array1 = OSArray::withObjects(cache, numStrCache, numStrCache);
88: TEST_ASSERT('A', "2a", array1);
89: for (i = 0; i < numStrCache; i++)
90: cache[i]->release();
91: if (array1) {
92: TEST_ASSERT('A', "2b", numStrCache == (int) array1->getCount());
93: TEST_ASSERT('A', "2c", numStrCache == (int) array1->getCapacity());
94: TEST_ASSERT('A', "2d",
95: numStrCache == (int) array1->getCapacityIncrement());
96:
97: for (i = 0; (str = array1->getObject(i)); i++) {
98: if (str != cache[i]) {
99: verPrintf(("testArray(A) test 2e%d failed\n", i));
100: res = false;
101: }
102: }
103: TEST_ASSERT('A', "2f", numStrCache == i);
104: array1->release();
105: }
106: res = res && checkSpace("(A)2", spaceCheck, 0);
107:
108: // Test array creation from another array by both the setObject method
109: // and the withArray factory. And test __takeObject code first
110: // with tail removal then with head removal
111: spaceCheck = checkPointSpace();
112: for (i = 0; i < numStrCache; i++)
113: cache[i] = OSString::withCStringNoCopy(strCache[i]);
114: array1 = OSArray::withObjects(cache, numStrCache, numStrCache);
115: TEST_ASSERT('A', "3a", array1);
116: for (i = 0; i < numStrCache; i++)
117: cache[i]->release();
118: array2 = 0;
119: if (array1) {
120: array2 = OSArray::withCapacity(1);
121: TEST_ASSERT('A', "3b", array2);
122: TEST_ASSERT('A', "3c", !array2->getCount());
123: TEST_ASSERT('A', "3d", array2->setObject(array1));
124: TEST_ASSERT('A', "3e", array1->getCount() == array2->getCount());
125: }
126: if (array2) {
127: count = 0;
128: TEST_ASSERT('A', "3f", numStrCache == (int) array2->getCount());
129: for (i = array2->getCount(); (str = array2->__takeObject(--i)); ) {
130: if (str != cache[i]) {
131: verPrintf(("testArray(A) test 3g%d failed\n", i));
132: res = false;
133: }
134: count += ((int) array2->getCount() == i);
135: str->release();
136: }
137: TEST_ASSERT('A', "3h", count == numStrCache);
138: TEST_ASSERT('A', "3i", -1 == i);
139: TEST_ASSERT('A', "3j", !array2->getCount());
140:
141: spaceCheck2 = checkPointSpace();
142: array2->flushCollection();
143: res = res && checkSpace("(A)3k", spaceCheck2, 0);
144:
145: array2->release();
146: array2 = 0;
147: }
148: if (array1) {
149: array2 = OSArray::withArray(array1, numStrCache - 1);
150: TEST_ASSERT('A', "3l", !array2);
151: array2 = OSArray::withArray(array1, array1->getCount());
152: TEST_ASSERT('A', "3m", array2);
153: array1->release();
154: }
155: if (array2) {
156: count = 0;
157: TEST_ASSERT('A', "3o", numStrCache == (int) array2->getCount());
158: for (i = 0; (str = array2->__takeObject(0)); i++) {
159: count += (str == cache[i]);
160: str->release();
161: }
162: TEST_ASSERT('A', "3p", count == numStrCache);
163: TEST_ASSERT('A', "3q", !array2->getCount());
164: array2->release();
165: array2 = 0;
166: }
167: res = res && checkSpace("(A)3", spaceCheck, 0);
168:
169: // Test object replacement from one array to another
170: spaceCheck = checkPointSpace();
171: array1 = OSArray::withCapacity(numStrCache);
172: TEST_ASSERT('A', "4a", array1);
173: if (array1) {
174: count = count2 = 0;
175: for (i = 0; i < numStrCache; i++) {
176: str = OSString::withCStringNoCopy(strCache[i]);
177: count += array1->setObject(str);
178: count2 += (str == array1->lastObject());
179: str->release();
180: }
181: TEST_ASSERT('A', "4b", numStrCache == (int) array1->getCount());
182: TEST_ASSERT('A', "4c", count == numStrCache);
183: TEST_ASSERT('A', "4d", count2 == numStrCache);
184: }
185: array2 = OSArray::withCapacity(1);
186: TEST_ASSERT('A', "4e", array2);
187: if (array2) {
188: count = count2 = 0;
189: str = (OSObject *) OSSymbol::withCStringNoCopy(strCache[0]);
190: for (i = 0; i < numStrCache; i++) {
191: sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
192: count += array2->setObject(sym, 0);
193: count2 += (str == array2->lastObject());
194: sym->release();
195: }
196: str->release();
197: TEST_ASSERT('A', "4f", numStrCache == (int) array2->getCount());
198: TEST_ASSERT('A', "4g", count == numStrCache);
199: TEST_ASSERT('A', "4h", count2 == numStrCache);
200: }
201: if (array1 && array2) {
202:
203: count = count2 = 0;
204: for (i = array1->getCount() - 1; (sym = array2->__takeObject(0)); i--) {
205: str = array1->replaceObject(sym, i);
206: count += (str != 0);
207: count2 += (sym != str);
208: if (str)
209: str->release();
210: if (sym)
211: sym->release();
212: }
213: TEST_ASSERT('A', "4k", numStrCache == (int) array1->getCount());
214: TEST_ASSERT('A', "4l", count == numStrCache);
215: TEST_ASSERT('A', "4m", count2 == numStrCache);
216: array1->release();
217: array2->release();
218: }
219: else {
220: if (array1) array1->release();
221: if (array2) array2->release();
222: }
223: res = res && checkSpace("(A)4", spaceCheck, 0);
224:
225: // Test array duplicate removal
226: spaceCheck = checkPointSpace();
227: array1 = OSArray::withCapacity(numStrCache);
228: TEST_ASSERT('A', "5a", array1);
229: if (array1) {
230: for (i = 0; i < numStrCache; i++) {
231: sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
232: count += array1->setObject(sym);
233: sym->release();
234: }
235: TEST_ASSERT('A', "5b", numStrCache == (int) array1->getCount());
236:
237: // remove duplicates
238: for (i = 0; (sym = array1->getObject(i)); )
239: if (sym->getRetainCount() == 1)
240: i++;
241: else {
242: //sym = array1->__takeObject(i);
243: //sym->release();
244: array1->removeObject(i);
245: }
246: TEST_ASSERT('A', "5c", numStrCache != (int) array1->getCount());
247:
248: // check to see that all symbols are really there
249: for (count = 0, i = 0; i < numStrCache; i++) {
250: sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
251: for (count2 = false, j = 0; (str = array1->getObject(j)); j++)
252: if (str == sym) {
253: count2 = true;
254: break;
255: }
256: count += count2;
257: sym->release();
258: }
259: TEST_ASSERT('A', "5c", count == numStrCache);
260: array1->release();
261: }
262: res = res && checkSpace("(S)5", spaceCheck, 0);
263:
264: if (res)
265: verPrintf(("testArray: All OSArray Tests passed\n"));
266: else
267: logPrintf(("testArray: Some OSArray Tests failed\n"));
268: }
269:
270: void testSet()
271: {
272: bool res = true;
273: void *spaceCheck, *spaceCheck2 , *spaceCheck3;
274: int i, count, count2;
275: OSObject *cache[numStrCache], *str, *sym;
276: OSSet *set1, *set2;
277: OSArray *array;
278:
279: // Do first test without memory leak tests to initialise the metaclass
280: set1 = OSSet::withCapacity(1);
281: TEST_ASSERT('S', "0a", set1);
282: if (set1)
283: set1->release();
284:
285: // Grow the symbol pool to maximum
286: for (i = 0; i < numStrCache; i++)
287: cache[i] = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
288: for (i = 0; i < numStrCache; i++)
289: cache[i]->release();
290:
291: // Create and destroy an set
292: spaceCheck = checkPointSpace();
293: set1 = OSSet::withCapacity(1);
294: TEST_ASSERT('S', "1a", set1);
295: if (set1) {
296: TEST_ASSERT('S', "1b", !set1->getCount());
297: TEST_ASSERT('S', "1c", 1 == set1->getCapacity());
298: TEST_ASSERT('S', "1d", 1 == set1->getCapacityIncrement());
299: TEST_ASSERT('S', "1e", 4 == set1->setCapacityIncrement(4));
300: TEST_ASSERT('S', "1f", 4 == set1->getCapacityIncrement());
301: TEST_ASSERT('S', "1g", 8 == set1->ensureCapacity(5));
302:
303: spaceCheck2 = checkPointSpace();
304: cache[0] = IOString::withCStringNoCopy(strCache[0]);
305:
306: spaceCheck3 = checkPointSpace();
307: TEST_ASSERT('S', "1h", set1->setObject(cache[0]));
308: TEST_ASSERT('S', "1i", set1->containsObject(cache[0]));
309: TEST_ASSERT('S', "1j", cache[0] == set1->getAnyObject());
310: cache[0]->release();
311: res = res && checkSpace("(S)1k", spaceCheck3, 0);
312:
313: TEST_ASSERT('S', "1l", 1 == set1->getCount());
314: set1->flushCollection();
315: TEST_ASSERT('S', "1m", !set1->getCount());
316: res = res && checkSpace("(S)1n", spaceCheck2, 0);
317:
318: set1->release();
319: }
320: res = res && checkSpace("(S)1", spaceCheck, 0);
321:
322: // Check the creation of a sizable OSSet from an set of IOObjects
323: // Also check member test of set.
324: spaceCheck = checkPointSpace();
325: for (i = 0; i < numStrCache; i++)
326: cache[i] = OSString::withCStringNoCopy(strCache[i]);
327: set1 = OSSet::withObjects(cache, numStrCache, numStrCache);
328: TEST_ASSERT('S', "2a", set1);
329: for (i = 0; i < numStrCache; i++)
330: cache[i]->release();
331: if (set1) {
332: TEST_ASSERT('S', "2b", numStrCache == (int) set1->getCount());
333: TEST_ASSERT('S', "2c", numStrCache == (int) set1->getCapacity());
334: TEST_ASSERT('S', "2d",
335: numStrCache == (int) set1->getCapacityIncrement());
336:
337: count = 0;
338: for (i = set1->getCount(); --i >= 0; )
339: count += set1->member(cache[i]);
340:
341: TEST_ASSERT('S', "2e", numStrCache == count);
342: set1->release();
343: }
344: res = res && checkSpace("(S)2", spaceCheck, 0);
345:
346: // Test set creation from another set by both the setObject method
347: // and the withArray factory. And test __takeObject code first
348: // with tail removal then with head removal
349: spaceCheck = checkPointSpace();
350: for (i = 0; i < numStrCache; i++)
351: cache[i] = OSString::withCStringNoCopy(strCache[i]);
352: set1 = OSSet::withObjects(cache, numStrCache, numStrCache);
353: TEST_ASSERT('S', "3a", set1);
354: for (i = 0; i < numStrCache; i++)
355: cache[i]->release();
356: set2 = 0;
357: if (set1) {
358: set2 = OSSet::withCapacity(set1->getCount());
359: TEST_ASSERT('S', "3b", set2);
360: TEST_ASSERT('S', "3c", !set2->getCount());
361: TEST_ASSERT('S', "3d", set2->setObject(set1));
362: TEST_ASSERT('S', "3e", set1->getCount() == set2->getCount());
363: }
364: if (set2) {
365: TEST_ASSERT('S', "3f", numStrCache == (int) set2->getCount());
366: count = count2 = 0;
367: while ( (str = set2->getAnyObject()) ) {
368: count += set2->__takeObject(str);
369: count2 += set1->member(str);
370: str->release();
371: }
372: TEST_ASSERT('S', "3g", !set2->getCount());
373: TEST_ASSERT('S', "3h", numStrCache == count);
374: TEST_ASSERT('S', "3i", numStrCache == count2);
375:
376: spaceCheck2 = checkPointSpace();
377: set2->flushCollection();
378: res = res && checkSpace("(S)3j", spaceCheck2, 0);
379:
380: set2->release();
381: set2 = 0;
382: }
383: if (set1) {
384: set2 = OSSet::withSet(set1, numStrCache - 1);
385: TEST_ASSERT('S', "3k", !set2);
386: set2 = OSSet::withSet(set1, set1->getCount());
387: TEST_ASSERT('S', "3l", set2);
388: set1->release();
389: }
390: if (set2) {
391: TEST_ASSERT('S', "3m", numStrCache == (int) set2->getCount());
392: i = count = count2 = 0;
393: while ( (str = set2->getAnyObject()) ) {
394: count += set2->__takeObject(str);
395: count2 += (cache[i++] == str);
396: str->release();
397: }
398: TEST_ASSERT('S', "3n", !set2->getCount());
399: TEST_ASSERT('S', "3o", numStrCache == count);
400: TEST_ASSERT('S', "3p", numStrCache == count2);
401:
402: set2->release();
403: set2 = 0;
404: }
405: res = res && checkSpace("(S)3", spaceCheck, 0);
406:
407: // Test duplicate removal
408: spaceCheck = checkPointSpace();
409: set2 = 0;
410: set1 = OSSet::withCapacity(numStrCache);
411: TEST_ASSERT('S', "4a", set1);
412: if (set1) {
413: count = 0;
414: for (i = 0; i < numStrCache; i++) {
415: sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
416: count += set1->setObject(sym);
417: sym->release();
418: }
419: TEST_ASSERT('S', "4b", numStrCache != (int) set1->getCount());
420: TEST_ASSERT('S', "4c", count == (int) set1->getCount());
421:
422: count = count2 = 0;
423: for (i = 0; i < numStrCache; i++) {
424: sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
425: count += set1->member(sym);
426: count2 += sym->getRetainCount();
427: sym->release();
428: }
429: TEST_ASSERT('S', "4d", count == numStrCache);
430: TEST_ASSERT('S', "4e", count2 == numStrCache * 2);
431:
432: set2 = OSSet::withSet(set1, 2 * set1->getCount());
433: }
434: TEST_ASSERT('S', "4f", set2);
435: if (set2) {
436: set2->setObject(set1);
437: TEST_ASSERT('S', "4g", set1->getCount() == set2->getCount());
438: set1->release();
439: set2->release();
440: }
441: res = res && checkSpace("(S)4", spaceCheck, 0);
442:
443: // Test array duplicate removal
444: spaceCheck = checkPointSpace();
445: array = OSArray::withCapacity(numStrCache);
446: for (i = 0; i < numStrCache; i++) {
447: sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
448: count += array->setObject(sym);
449: sym->release();
450: }
451: set1 = OSSet::withArray(array, numStrCache);
452: TEST_ASSERT('S', "5a", set1);
453: if (set1) {
454: TEST_ASSERT('S', "5b", array->getCount() != set1->getCount());
455: array->release();
456:
457: count = count2 = set1->getCount();
458: while ( (sym = set1->getAnyObject()) ) {
459: count -= set1->__takeObject(sym);
460: count2 -= sym->getRetainCount();
461: sym->release();
462: }
463: TEST_ASSERT('S', "5c", !count);
464: TEST_ASSERT('S', "5d", !count2);
465: set1->release();
466: }
467: res = res && checkSpace("(S)5", spaceCheck, 0);
468:
469: if (res)
470: verPrintf(("testSet: All OSSet Tests passed\n"));
471: else
472: logPrintf(("testSet: Some OSSet Tests failed\n"));
473: }
474:
475: void testDictionary()
476: {
477: bool res = true;
478: void *spaceCheck, *spaceCheck2, *spaceCheck3;
479: OSObject *cache[numStrCache];
480: OSString *str;
481: const OSSymbol *symCache[numStrCache], *sym;
482: OSDictionary *dict1, *dict2;
483: int i, numSymbols, count1, count2;
484:
485: // Do first test without memory leak tests to initialise the metaclass
486: dict1 = OSDictionary::withCapacity(1);
487: TEST_ASSERT('D', "0a", dict1);
488: if (dict1)
489: dict1->release();
490:
491: // Grow the symbol pool to maximum
492: for (i = 0; i < numStrCache; i++)
493: symCache[i] = OSSymbol::withCStringNoCopy(strCache[i]);
494: for (i = 0; i < numStrCache; i++)
495: symCache[i]->release();
496:
497: // Create and destroy a dictionary
498: spaceCheck = checkPointSpace();
499: dict1 = OSDictionary::withCapacity(1);
500: TEST_ASSERT('D', "1a", dict1);
501: if (dict1) {
502: TEST_ASSERT('D', "1b", !dict1->getCount());
503: TEST_ASSERT('D', "1c", 1 == dict1->getCapacity());
504: TEST_ASSERT('D', "1d", 1 == dict1->getCapacityIncrement());
505: TEST_ASSERT('D', "1e", 4 == dict1->setCapacityIncrement(4));
506: TEST_ASSERT('D', "1f", 4 == dict1->getCapacityIncrement());
507: TEST_ASSERT('D', "1g", 8 == dict1->ensureCapacity(5));
508:
509: spaceCheck2 = checkPointSpace();
510: sym = OSSymbol::withCStringNoCopy(strCache[0]);
511:
512: spaceCheck3 = checkPointSpace();
513: TEST_ASSERT('D', "1h", dict1->setObject((OSObject *) sym, sym));
514: TEST_ASSERT('D', "1i", (OSObject *) sym == dict1->getObject(sym));
515: sym->release();
516: TEST_ASSERT('D', "1i", 2 == sym->getRetainCount());
517: res = res && checkSpace("(D)1j", spaceCheck3, 0);
518:
519: TEST_ASSERT('D', "1k", 1 == dict1->getCount());
520: dict1->flushCollection();
521: TEST_ASSERT('D', "1l", !dict1->getCount());
522: res = res && checkSpace("(D)1m", spaceCheck2, 0);
523:
524: dict1->release();
525: }
526: res = res && checkSpace("(D)1", spaceCheck, 0);
527:
528: // Check the creation of a sizable OSDictionary from an array of IOObjects
529: // Also check indexing into the array.
530: spaceCheck = checkPointSpace();
531: for (i = 0, numSymbols = 0; i < numStrCache; i++) {
532: sym = OSSymbol::withCStringNoCopy(strCache[i]);
533: if (1 == sym->getRetainCount())
534: symCache[numSymbols++] = sym;
535: else
536: sym->release();
537: }
538: dict1 = OSDictionary::withObjects(
539: (OSObject **) symCache, symCache, numSymbols, numSymbols);
540: TEST_ASSERT('D', "2a", dict1);
541: count1 = count2 = 0;
542: for (i = 0; i < numSymbols; i++)
543: count1 += (symCache[i]->getRetainCount() == 3);
544: TEST_ASSERT('D', "2b", count1 == numSymbols);
545: if (dict1) {
546: TEST_ASSERT('D', "2c", numSymbols == (int) dict1->getCount());
547: TEST_ASSERT('D', "2d", numSymbols == (int) dict1->getCapacity());
548: TEST_ASSERT('D', "2e",
549: numSymbols == (int) dict1->getCapacityIncrement());
550:
551: for (i = dict1->getCount(); --i >= 0; ) {
552: str = (OSString *) dict1->getObject(symCache[i]);
553: if (str != (OSString *) symCache[i]) {
554: verPrintf(("testDictionary(D) test 2f%d failed\n", i));
555: res = false;
556: }
557: }
558: dict1->release();
559: }
560: count1 = count2 = 0;
561: for (i = 0; i < numSymbols; i++) {
562: count1 += (symCache[i]->getRetainCount() == 1);
563: symCache[i]->release();
564: }
565: TEST_ASSERT('D', "2g", count1 == numSymbols);
566: res = res && checkSpace("(D)2", spaceCheck, 0);
567:
568: // Check the creation of a sizable Dictionary from an array of IOStrings
569: // Also check searching dictionary use OSString for a key.
570: spaceCheck = checkPointSpace();
571: for (i = 0, numSymbols = 0; i < numStrCache; i++) {
572: sym = OSSymbol::withCStringNoCopy(strCache[i]);
573: if (1 == sym->getRetainCount()) {
574: cache[numSymbols] = OSString::withCStringNoCopy(strCache[i]);
575: symCache[numSymbols] = sym;
576: numSymbols++;
577: }
578: else
579: sym->release();
580: }
581: dict1 = OSDictionary::withObjects((OSObject **) symCache,
582: (OSString **) cache,
583: numSymbols, numSymbols);
584: TEST_ASSERT('D', "3a", dict1);
585: count1 = count2 = 0;
586: for (i = 0; i < numSymbols; i++) {
587: count1 += (symCache[i]->getRetainCount() == 3);
588: count2 += (cache[i]->getRetainCount() == 1);
589: }
590: TEST_ASSERT('D', "3b", count1 == numSymbols);
591: TEST_ASSERT('D', "3c", count2 == numSymbols);
592: if (dict1) {
593: count1 = count2 = 0;
594: for (i = 0; i < numSymbols; i++) {
595: str = (OSString *) cache[i];
596: count1 += (symCache[i] == (const OSSymbol *) dict1->getObject(str));
597: count2 += (symCache[i]->getRetainCount() == 3);
598: }
599: TEST_ASSERT('D', "3d", count1 == numSymbols);
600: TEST_ASSERT('D', "3e", count2 == numSymbols);
601:
602: count1 = count2 = 0;
603: for (i = 0; i < numSymbols; i++) {
604: const char *cStr = ((OSString *) cache[i])->getCStringNoCopy();
605:
606: count1 += (symCache[i] == (const OSSymbol *) dict1->getObject(cStr));
607: count2 += (symCache[i]->getRetainCount() == 3);
608: }
609: TEST_ASSERT('D', "3f", count1 == numSymbols);
610: TEST_ASSERT('D', "3g", count2 == numSymbols);
611:
612: dict1->release();
613: }
614: count1 = count2 = 0;
615: for (i = 0; i < numSymbols; i++) {
616: count1 += (symCache[i]->getRetainCount() == 1);
617: count2 += (cache[i]->getRetainCount() == 1);
618: symCache[i]->release();
619: cache[i]->release();
620: }
621: TEST_ASSERT('D', "3h", count1 == numSymbols);
622: res = res && checkSpace("(D)3", spaceCheck, 0);
623:
624: // Check the creation of a small dictionary then grow it one item at a time
625: // Create a new dictionary from the old dictionary.
626: // Finally remove each item permanently.
627: spaceCheck = checkPointSpace();
628: for (i = 0, numSymbols = 0; i < numStrCache; i++) {
629: sym = OSSymbol::withCStringNoCopy(strCache[i]);
630: if (1 == sym->getRetainCount()) {
631: cache[numSymbols] = OSString::withCStringNoCopy(strCache[i]);
632: symCache[numSymbols] = sym;
633: numSymbols++;
634: }
635: else
636: sym->release();
637: }
638: dict2 = 0;
639: dict1 = OSDictionary::withCapacity(1);
640: TEST_ASSERT('D', "4a", dict1);
641: if (dict1) {
642: count1 = count2 = 0;
643: for (i = 0; i < numSymbols; i++) {
644: sym = symCache[i];
645: count1 += ((OSObject *) sym == dict1->setObject((OSObject *) sym,
646: sym->getCStringNoCopy()));
647: count2 += (sym->getRetainCount() == 3);
648: }
649: TEST_ASSERT('D', "4b", numSymbols == (int) dict1->getCount());
650: TEST_ASSERT('D', "4c", numSymbols == count1);
651: TEST_ASSERT('D', "4d", numSymbols == count2);
652:
653: dict2 = OSDictionary::withDictionary(dict1, numSymbols-1);
654: TEST_ASSERT('D', "4b", !dict2);
655: dict2 = OSDictionary::withDictionary(dict1, numSymbols);
656: }
657: TEST_ASSERT('D', "4e", dict2);
658: if (dict2) {
659: dict1->release(); dict1 = 0;
660:
661: TEST_ASSERT('D', "4f", numSymbols == (int) dict2->getCount());
662:
663: count1 = count2 = 0;
664: for (i = 0; i < numSymbols; i++) {
665: OSObject *replacedObject;
666:
667: sym = symCache[i];
668: str = (OSString *) cache[i];
669: replacedObject = dict2->setObject(str, str);
670: count1 += ((OSString *) sym == replacedObject);
671: replacedObject->release();
672: count2 += (sym->getRetainCount() == 2);
673: str->release();
674: }
675: TEST_ASSERT('D', "4g", numSymbols == count1);
676: TEST_ASSERT('D', "4h", numSymbols == count2);
677:
678: count1 = count2 = 0;
679: for (i = 0; i < numSymbols; i++) {
680: sym = symCache[i];
681: str = (OSString *) cache[i];
682: count1 += (str == dict2->__takeObject(sym));
683: str->release();
684: count2 += (sym->getRetainCount() == 1);
685: sym->release();
686: }
687: TEST_ASSERT('D', "4i", numSymbols == count1);
688: TEST_ASSERT('D', "4j", numSymbols == count2);
689: TEST_ASSERT('D', "4k", !dict2->getCount());
690: dict2->release(); dict2 = 0;
691: }
692: else if (dict1)
693: dict1->release();
694: res = res && checkSpace("(D)4", spaceCheck, 0);
695:
696: if (res)
697: verPrintf(("testDictionary: All OSDictionary Tests passed\n"));
698: else
699: logPrintf(("testDictionary: Some OSDictionary Tests failed\n"));
700: }
701:
702: void testIterator()
703: {
704: bool res = true;
705: void *spaceCheck;
706: OSObject *cache[numStrCache];
707: OSString *str = 0;
708: const OSSymbol *symCache[numStrCache], *sym;
709: OSDictionary *dict;
710: OSSet *set;
711: OSArray *array, *bigReturn;
712: OSCollectionIterator *iter1, *iter2;
713: int i, numSymbols, count1, count2, count3;
714:
715: // Setup symbol and string pools
716: for (i = 0, numSymbols = 0; i < numStrCache; i++) {
717: sym = OSSymbol::withCStringNoCopy(strCache[i]);
718: if (1 == sym->getRetainCount()) {
719: cache[numSymbols] = OSString::withCStringNoCopy(strCache[i]);
720: symCache[numSymbols] = sym;
721: numSymbols++;
722: }
723: else
724: sym->release();
725: }
726:
727: // Test the array iterator
728: spaceCheck = checkPointSpace();
729: iter1 = iter2 = 0;
730: array = OSArray::withCapacity(numSymbols);
731: TEST_ASSERT('I', "1a", array);
732: if (array) {
733: count1 = count2 = 0;
734: for (i = numSymbols; --i >= 0; )
735: count1 += array->setObject(cache[i], 0);
736: TEST_ASSERT('I', "1b", count1 == numSymbols);
737:
738: iter1 = OSCollectionIterator::withCollection(array);
739: iter2 = OSCollectionIterator::withCollection(array);
740: }
741: TEST_ASSERT('I', "1c", iter1);
742: TEST_ASSERT('I', "1d", iter2);
743: if (iter1 && iter2) {
744: count1 = count2 = count3 = 0;
745: for (i = 0; (str = (IOString *) iter1->getNextObject()); i++) {
746: bigReturn = iter2->nextEntries();
747: count1 += (bigReturn->getCount() == 1);
748: count2 += (cache[i] == bigReturn->getObject(0));
749: count3 += (cache[i] == str);
750: }
751: TEST_ASSERT('I', "1e", count1 == numSymbols);
752: TEST_ASSERT('I', "1f", count2 == numSymbols);
753: TEST_ASSERT('I', "1g", count3 == numSymbols);
754: TEST_ASSERT('I', "1h", iter1->valid());
755: TEST_ASSERT('I', "1i", iter2->valid());
756:
757: iter1->reset();
758: str = (OSString *) array->__takeObject(0);
759: array->setObject(str, 0);
760: str->release();
761: TEST_ASSERT('I', "1j", !iter1->getNextObject());
762: TEST_ASSERT('I', "1k", !iter1->valid());
763:
764: iter1->reset();
765: count1 = count2 = count3 = 0;
766: for (i = 0; ; i++) {
767: if (i & 1)
768: str = (OSString *) iter1->getNextObject();
769: else if ( (bigReturn = iter1->nextEntries()) )
770: str = (OSString *) bigReturn->getObject(0);
771: else
772: str = 0;
773:
774: if (!str)
775: break;
776: count1 += (cache[i] == str);
777: }
778: TEST_ASSERT('I', "1l", count1 == numSymbols);
779: TEST_ASSERT('I', "1m", i == numSymbols);
780: TEST_ASSERT('I', "1n", iter1->valid());
781:
782: TEST_ASSERT('I', "1o", 3 == array->getRetainCount());
783: array->release();
784: }
785:
786: if (iter1) iter1->release();
787: if (iter2) iter2->release();
788: res = res && checkSpace("(I)1", spaceCheck, 0);
789:
790: // Test the set iterator
791: spaceCheck = checkPointSpace();
792: iter1 = 0;
793: set = OSSet::withCapacity(numSymbols);
794: TEST_ASSERT('I', "2a", set);
795: if (set) {
796: count1 = count2 = 0;
797: for (i = 0; i < numSymbols; i++)
798: count1 += set->setObject(cache[i]);
799: TEST_ASSERT('I', "2b", count1 == numSymbols);
800:
801: iter1 = OSCollectionIterator::withCollection(set);
802: iter2 = OSCollectionIterator::withCollection(set);
803: }
804: TEST_ASSERT('I', "2c", iter1);
805: TEST_ASSERT('I', "2d", iter2);
806: if (iter1 && iter2) {
807: count1 = count2 = count3 = 0;
808: for (i = 0; (str = (IOString *) iter1->getNextObject()); i++) {
809: bigReturn = iter2->nextEntries();
810: count1 += (bigReturn->getCount() == 1);
811: count2 += (cache[i] == bigReturn->getObject(0));
812: count3 += (cache[i] == str);
813: }
814: TEST_ASSERT('I', "2e", count1 == numSymbols);
815: TEST_ASSERT('I', "2f", count2 == numSymbols);
816: TEST_ASSERT('I', "2g", count3 == numSymbols);
817: TEST_ASSERT('I', "2h", iter1->valid());
818: TEST_ASSERT('I', "2i", iter2->valid());
819:
820: iter1->reset();
821: count1 = count2 = count3 = 0;
822: for (i = 0; ; i++) {
823: if (i & 1)
824: str = (OSString *) iter1->getNextObject();
825: else if ( (bigReturn = iter1->nextEntries()) )
826: str = (OSString *) bigReturn->getObject(0);
827: else
828: str = 0;
829:
830: if (!str)
831: break;
832: count1 += (cache[i] == str);
833: }
834: TEST_ASSERT('I', "2l", count1 == numSymbols);
835: TEST_ASSERT('I', "2m", i == numSymbols);
836: TEST_ASSERT('I', "2n", iter1->valid());
837:
838: iter1->reset();
839: str = (OSString *) set->getAnyObject();
840: (void) set->__takeObject(str);
841: set->setObject(str);
842: str->release();
843: TEST_ASSERT('I', "2j", !iter1->getNextObject());
844: TEST_ASSERT('I', "2k", !iter1->valid());
845:
846: TEST_ASSERT('I', "2o", 3 == set->getRetainCount());
847: set->release();
848: }
849:
850: if (iter1) iter1->release();
851: if (iter2) iter2->release();
852: res = res && checkSpace("(I)2", spaceCheck, 0);
853:
854: // Test the dictionary iterator
855: spaceCheck = checkPointSpace();
856: iter1 = 0;
857: dict = OSDictionary::withCapacity(numSymbols);
858: TEST_ASSERT('I', "3a", dict);
859: if (dict) {
860: count1 = count2 = 0;
861: for (i = 0; i < numSymbols; i++)
862: count1 += (0 != dict->setObject(cache[i], symCache[i]));
863: TEST_ASSERT('I', "3b", count1 == numSymbols);
864:
865: iter1 = OSCollectionIterator::withCollection(dict);
866: iter2 = OSCollectionIterator::withCollection(dict);
867: }
868: TEST_ASSERT('I', "3c", iter1);
869: TEST_ASSERT('I', "3d", iter2);
870: if (iter1 && iter2) {
871: count1 = count2 = count3 = 0;
872: for (i = 0; (sym = (const IOSymbol *) iter1->getNextObject()); i++) {
873: bigReturn = iter2->nextEntries();
874: count1 += (bigReturn->getCount() == 2);
875: count2 += (cache[i] == bigReturn->getObject(1));
876: count3 += (symCache[i] == sym);
877: }
878: TEST_ASSERT('I', "3e", count1 == numSymbols);
879: TEST_ASSERT('I', "3f", count2 == numSymbols);
880: TEST_ASSERT('I', "3g", count3 == numSymbols);
881: TEST_ASSERT('I', "3h", iter1->valid());
882: TEST_ASSERT('I', "3i", iter2->valid());
883:
884: iter1->reset();
885: count1 = count2 = count3 = 0;
886: i = 0;
887: for (i = 0; ; i++) {
888: if (i & 1) {
889: sym = (const OSSymbol *) iter1->getNextObject();
890: str = 0;
891: }
892: else if ( (bigReturn = iter1->nextEntries()) ) {
893: sym = (const OSSymbol *) bigReturn->getObject(0);
894: str = (OSString *) bigReturn->getObject(1);
895: }
896: else
897: sym = 0;
898:
899: if (!sym)
900: break;
901:
902: count1 += (symCache[i] == sym);
903: count2 += (!str || cache[i] == str);
904: }
905: TEST_ASSERT('I', "3l", count1 == numSymbols);
906: TEST_ASSERT('I', "3m", count2 == numSymbols);
907: TEST_ASSERT('I', "3n", i == numSymbols);
908: TEST_ASSERT('I', "3o", iter1->valid());
909:
910: iter1->reset();
911: str = (OSString *) dict->__takeObject(symCache[numSymbols-1]);
912: dict->setObject(str, symCache[numSymbols-1]);
913: str->release();
914: TEST_ASSERT('I', "3j", !iter1->getNextObject());
915: TEST_ASSERT('I', "3k", !iter1->valid());
916:
917: TEST_ASSERT('I', "3p", 3 == dict->getRetainCount());
918: dict->release();
919: }
920:
921: if (iter1) iter1->release();
922: if (iter2) iter2->release();
923: res = res && checkSpace("(I)3", spaceCheck, 0);
924:
925: count1 = count2 = count3 = 0;
926: for (i = 0; i < numSymbols; i++) {
927: count1 += (1 == cache[i]->getRetainCount());
928: count2 += (1 == symCache[i]->getRetainCount());
929: cache[i]->release();
930: symCache[i]->release();
931: }
932: TEST_ASSERT('I', "4a", count1 == numSymbols);
933: TEST_ASSERT('I', "4b", count2 == numSymbols);
934:
935: if (res)
936: verPrintf(("testIterator: All OSCollectionIterator Tests passed\n"));
937: else
938: logPrintf(("testIterator: Some OSCollectionIterator Tests failed\n"));
939: }
940:
941: #endif /* DEBUG */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.