|
|
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.