Annotation of XNU/iokit/Tests/TestCollections.cpp, revision 1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.