- bool res = true;
- void *spaceCheck, *spaceCheck2 , *spaceCheck3;
- int i, j, count, count2;
- OSObject *cache[numStrCache], *str, *sym;
- OSArray *array1, *array2;
-
- // Do first test without memory leak tests to initialise the metaclass
- array1 = OSArray::withCapacity(1);
- TEST_ASSERT('A', "0a", array1);
- if (array1)
- array1->release();
-
- // Grow the symbol pool to maximum
- for (i = 0; i < numStrCache; i++)
- cache[i] = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
- for (i = 0; i < numStrCache; i++)
- cache[i]->release();
-
- // Create and destroy an array
- spaceCheck = checkPointSpace();
- array1 = OSArray::withCapacity(1);
- TEST_ASSERT('A', "1a", array1);
- if (array1) {
- TEST_ASSERT('A', "1b", !array1->getCount());
- TEST_ASSERT('A', "1c", 1 == array1->getCapacity());
- TEST_ASSERT('A', "1d", 1 == array1->getCapacityIncrement());
- TEST_ASSERT('A', "1e", 4 == array1->setCapacityIncrement(4));
- TEST_ASSERT('A', "1f", 4 == array1->getCapacityIncrement());
- TEST_ASSERT('A', "1g", 8 == array1->ensureCapacity(5));
-
- spaceCheck2 = checkPointSpace();
- cache[0] = IOString::withCStringNoCopy(strCache[0]);
-
- spaceCheck3 = checkPointSpace();
- TEST_ASSERT('A', "1h", array1->setObject(cache[0]));
- TEST_ASSERT('A', "1i", cache[0] == array1->getObject(0));
- cache[0]->release();
- res = res && checkSpace("(A)1j", spaceCheck3, 0);
-
- TEST_ASSERT('A', "1k", 1 == array1->getCount());
- array1->flushCollection();
- TEST_ASSERT('A', "1l", !array1->getCount());
- res = res && checkSpace("(A)1m", spaceCheck2, 0);
-
- array1->release();
- }
- res = res && checkSpace("(A)1", spaceCheck, 0);
-
- // Check the creation of a sizable OSArray from an array of IOObjects
- // Also check indexing into the array.
- spaceCheck = checkPointSpace();
- for (i = 0; i < numStrCache; i++)
- cache[i] = OSString::withCStringNoCopy(strCache[i]);
- array1 = OSArray::withObjects(cache, numStrCache, numStrCache);
- TEST_ASSERT('A', "2a", array1);
- for (i = 0; i < numStrCache; i++)
- cache[i]->release();
- if (array1) {
- TEST_ASSERT('A', "2b", numStrCache == (int) array1->getCount());
- TEST_ASSERT('A', "2c", numStrCache == (int) array1->getCapacity());
- TEST_ASSERT('A', "2d",
- numStrCache == (int) array1->getCapacityIncrement());
-
- for (i = 0; (str = array1->getObject(i)); i++) {
- if (str != cache[i]) {
- verPrintf(("testArray(A) test 2e%d failed\n", i));
- res = false;
- }
- }
- TEST_ASSERT('A', "2f", numStrCache == i);
- array1->release();
- }
- res = res && checkSpace("(A)2", spaceCheck, 0);
-
- // Test array creation from another array by both the setObject method
- // and the withArray factory. And test __takeObject code first
- // with tail removal then with head removal
- spaceCheck = checkPointSpace();
- for (i = 0; i < numStrCache; i++)
- cache[i] = OSString::withCStringNoCopy(strCache[i]);
- array1 = OSArray::withObjects(cache, numStrCache, numStrCache);
- TEST_ASSERT('A', "3a", array1);
- for (i = 0; i < numStrCache; i++)
- cache[i]->release();
- array2 = 0;
- if (array1) {
- array2 = OSArray::withCapacity(1);
- TEST_ASSERT('A', "3b", array2);
- TEST_ASSERT('A', "3c", !array2->getCount());
- TEST_ASSERT('A', "3d", array2->setObject(array1));
- TEST_ASSERT('A', "3e", array1->getCount() == array2->getCount());
- }
- if (array2) {
- count = 0;
- TEST_ASSERT('A', "3f", numStrCache == (int) array2->getCount());
- for (i = array2->getCount(); (str = array2->__takeObject(--i)); ) {
- if (str != cache[i]) {
- verPrintf(("testArray(A) test 3g%d failed\n", i));
- res = false;
- }
- count += ((int) array2->getCount() == i);
- str->release();
- }
- TEST_ASSERT('A', "3h", count == numStrCache);
- TEST_ASSERT('A', "3i", -1 == i);
- TEST_ASSERT('A', "3j", !array2->getCount());
-
- spaceCheck2 = checkPointSpace();
- array2->flushCollection();
- res = res && checkSpace("(A)3k", spaceCheck2, 0);
-
- array2->release();
- array2 = 0;
- }
- if (array1) {
- array2 = OSArray::withArray(array1, numStrCache - 1);
- TEST_ASSERT('A', "3l", !array2);
- array2 = OSArray::withArray(array1, array1->getCount());
- TEST_ASSERT('A', "3m", array2);
- array1->release();
- }
- if (array2) {
- count = 0;
- TEST_ASSERT('A', "3o", numStrCache == (int) array2->getCount());
- for (i = 0; (str = array2->__takeObject(0)); i++) {
- count += (str == cache[i]);
- str->release();
- }
- TEST_ASSERT('A', "3p", count == numStrCache);
- TEST_ASSERT('A', "3q", !array2->getCount());
- array2->release();
- array2 = 0;
- }
- res = res && checkSpace("(A)3", spaceCheck, 0);
-
- // Test object replacement from one array to another
- spaceCheck = checkPointSpace();
- array1 = OSArray::withCapacity(numStrCache);
- TEST_ASSERT('A', "4a", array1);
- if (array1) {
- count = count2 = 0;
- for (i = 0; i < numStrCache; i++) {
- str = OSString::withCStringNoCopy(strCache[i]);
- count += array1->setObject(str);
- count2 += (str == array1->lastObject());
- str->release();
- }
- TEST_ASSERT('A', "4b", numStrCache == (int) array1->getCount());
- TEST_ASSERT('A', "4c", count == numStrCache);
- TEST_ASSERT('A', "4d", count2 == numStrCache);
- }
- array2 = OSArray::withCapacity(1);
- TEST_ASSERT('A', "4e", array2);
- if (array2) {
- count = count2 = 0;
- str = (OSObject *) OSSymbol::withCStringNoCopy(strCache[0]);
- for (i = 0; i < numStrCache; i++) {
- sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
- count += array2->setObject(sym, 0);
- count2 += (str == array2->lastObject());
- sym->release();
- }
- str->release();
- TEST_ASSERT('A', "4f", numStrCache == (int) array2->getCount());
- TEST_ASSERT('A', "4g", count == numStrCache);
- TEST_ASSERT('A', "4h", count2 == numStrCache);
- }
- if (array1 && array2) {
-
- count = count2 = 0;
- for (i = array1->getCount() - 1; (sym = array2->__takeObject(0)); i--) {
- str = array1->replaceObject(sym, i);
- count += (str != 0);
- count2 += (sym != str);
- if (str)
- str->release();
- if (sym)
- sym->release();
- }
- TEST_ASSERT('A', "4k", numStrCache == (int) array1->getCount());
- TEST_ASSERT('A', "4l", count == numStrCache);
- TEST_ASSERT('A', "4m", count2 == numStrCache);
- array1->release();
- array2->release();
- }
- else {
- if (array1) array1->release();
- if (array2) array2->release();
- }
- res = res && checkSpace("(A)4", spaceCheck, 0);
-
- // Test array duplicate removal
- spaceCheck = checkPointSpace();
- array1 = OSArray::withCapacity(numStrCache);
- TEST_ASSERT('A', "5a", array1);
- if (array1) {
- for (i = 0; i < numStrCache; i++) {
- sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
- count += array1->setObject(sym);
- sym->release();
- }
- TEST_ASSERT('A', "5b", numStrCache == (int) array1->getCount());
-
- // remove duplicates
- for (i = 0; (sym = array1->getObject(i)); )
- if (sym->getRetainCount() == 1)
- i++;
- else {
- //sym = array1->__takeObject(i);
- //sym->release();
- array1->removeObject(i);
- }
- TEST_ASSERT('A', "5c", numStrCache != (int) array1->getCount());
-
- // check to see that all symbols are really there
- for (count = 0, i = 0; i < numStrCache; i++) {
- sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
- for (count2 = false, j = 0; (str = array1->getObject(j)); j++)
- if (str == sym) {
- count2 = true;
- break;
- }
- count += count2;
- sym->release();
- }
- TEST_ASSERT('A', "5c", count == numStrCache);
- array1->release();
- }
- res = res && checkSpace("(S)5", spaceCheck, 0);
-
- if (res)
- verPrintf(("testArray: All OSArray Tests passed\n"));
- else
- logPrintf(("testArray: Some OSArray Tests failed\n"));
+ bool res = true;
+ void *spaceCheck, *spaceCheck2, *spaceCheck3;
+ int i, j, count, count2;
+ OSObject *cache[numStrCache], *str, *sym;
+ OSArray *array1, *array2;
+
+ // Do first test without memory leak tests to initialise the metaclass
+ array1 = OSArray::withCapacity(1);
+ TEST_ASSERT('A', "0a", array1);
+ if (array1) {
+ array1->release();
+ }
+
+ // Grow the symbol pool to maximum
+ for (i = 0; i < numStrCache; i++) {
+ cache[i] = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
+ }
+ for (i = 0; i < numStrCache; i++) {
+ cache[i]->release();
+ }
+
+ // Create and destroy an array
+ spaceCheck = checkPointSpace();
+ array1 = OSArray::withCapacity(1);
+ TEST_ASSERT('A', "1a", array1);
+ if (array1) {
+ TEST_ASSERT('A', "1b", !array1->getCount());
+ TEST_ASSERT('A', "1c", 1 == array1->getCapacity());
+ TEST_ASSERT('A', "1d", 1 == array1->getCapacityIncrement());
+ TEST_ASSERT('A', "1e", 4 == array1->setCapacityIncrement(4));
+ TEST_ASSERT('A', "1f", 4 == array1->getCapacityIncrement());
+ TEST_ASSERT('A', "1g", 8 == array1->ensureCapacity(5));
+
+ spaceCheck2 = checkPointSpace();
+ cache[0] = IOString::withCStringNoCopy(strCache[0]);
+
+ spaceCheck3 = checkPointSpace();
+ TEST_ASSERT('A', "1h", array1->setObject(cache[0]));
+ TEST_ASSERT('A', "1i", cache[0] == array1->getObject(0));
+ cache[0]->release();
+ res = res && checkSpace("(A)1j", spaceCheck3, 0);
+
+ TEST_ASSERT('A', "1k", 1 == array1->getCount());
+ array1->flushCollection();
+ TEST_ASSERT('A', "1l", !array1->getCount());
+ res = res && checkSpace("(A)1m", spaceCheck2, 0);
+
+ array1->release();
+ }
+ res = res && checkSpace("(A)1", spaceCheck, 0);
+
+ // Check the creation of a sizable OSArray from an array of IOObjects
+ // Also check indexing into the array.
+ spaceCheck = checkPointSpace();
+ for (i = 0; i < numStrCache; i++) {
+ cache[i] = OSString::withCStringNoCopy(strCache[i]);
+ }
+ array1 = OSArray::withObjects(cache, numStrCache, numStrCache);
+ TEST_ASSERT('A', "2a", array1);
+ for (i = 0; i < numStrCache; i++) {
+ cache[i]->release();
+ }
+ if (array1) {
+ TEST_ASSERT('A', "2b", numStrCache == (int) array1->getCount());
+ TEST_ASSERT('A', "2c", numStrCache == (int) array1->getCapacity());
+ TEST_ASSERT('A', "2d",
+ numStrCache == (int) array1->getCapacityIncrement());
+
+ for (i = 0; (str = array1->getObject(i)); i++) {
+ if (str != cache[i]) {
+ verPrintf(("testArray(A) test 2e%d failed\n", i));
+ res = false;
+ }
+ }
+ TEST_ASSERT('A', "2f", numStrCache == i);
+ array1->release();
+ }
+ res = res && checkSpace("(A)2", spaceCheck, 0);
+
+ // Test array creation from another array by both the setObject method
+ // and the withArray factory. And test __takeObject code first
+ // with tail removal then with head removal
+ spaceCheck = checkPointSpace();
+ for (i = 0; i < numStrCache; i++) {
+ cache[i] = OSString::withCStringNoCopy(strCache[i]);
+ }
+ array1 = OSArray::withObjects(cache, numStrCache, numStrCache);
+ TEST_ASSERT('A', "3a", array1);
+ for (i = 0; i < numStrCache; i++) {
+ cache[i]->release();
+ }
+ array2 = 0;
+ if (array1) {
+ array2 = OSArray::withCapacity(1);
+ TEST_ASSERT('A', "3b", array2);
+ TEST_ASSERT('A', "3c", !array2->getCount());
+ TEST_ASSERT('A', "3d", array2->setObject(array1));
+ TEST_ASSERT('A', "3e", array1->getCount() == array2->getCount());
+ }
+ if (array2) {
+ count = 0;
+ TEST_ASSERT('A', "3f", numStrCache == (int) array2->getCount());
+ for (i = array2->getCount(); (str = array2->__takeObject(--i));) {
+ if (str != cache[i]) {
+ verPrintf(("testArray(A) test 3g%d failed\n", i));
+ res = false;
+ }
+ count += ((int) array2->getCount() == i);
+ str->release();
+ }
+ TEST_ASSERT('A', "3h", count == numStrCache);
+ TEST_ASSERT('A', "3i", -1 == i);
+ TEST_ASSERT('A', "3j", !array2->getCount());
+
+ spaceCheck2 = checkPointSpace();
+ array2->flushCollection();
+ res = res && checkSpace("(A)3k", spaceCheck2, 0);
+
+ array2->release();
+ array2 = 0;
+ }
+ if (array1) {
+ array2 = OSArray::withArray(array1, numStrCache - 1);
+ TEST_ASSERT('A', "3l", !array2);
+ array2 = OSArray::withArray(array1, array1->getCount());
+ TEST_ASSERT('A', "3m", array2);
+ array1->release();
+ }
+ if (array2) {
+ count = 0;
+ TEST_ASSERT('A', "3o", numStrCache == (int) array2->getCount());
+ for (i = 0; (str = array2->__takeObject(0)); i++) {
+ count += (str == cache[i]);
+ str->release();
+ }
+ TEST_ASSERT('A', "3p", count == numStrCache);
+ TEST_ASSERT('A', "3q", !array2->getCount());
+ array2->release();
+ array2 = 0;
+ }
+ res = res && checkSpace("(A)3", spaceCheck, 0);
+
+ // Test object replacement from one array to another
+ spaceCheck = checkPointSpace();
+ array1 = OSArray::withCapacity(numStrCache);
+ TEST_ASSERT('A', "4a", array1);
+ if (array1) {
+ count = count2 = 0;
+ for (i = 0; i < numStrCache; i++) {
+ str = OSString::withCStringNoCopy(strCache[i]);
+ count += array1->setObject(str);
+ count2 += (str == array1->lastObject());
+ str->release();
+ }
+ TEST_ASSERT('A', "4b", numStrCache == (int) array1->getCount());
+ TEST_ASSERT('A', "4c", count == numStrCache);
+ TEST_ASSERT('A', "4d", count2 == numStrCache);
+ }
+ array2 = OSArray::withCapacity(1);
+ TEST_ASSERT('A', "4e", array2);
+ if (array2) {
+ count = count2 = 0;
+ str = (OSObject *) OSSymbol::withCStringNoCopy(strCache[0]);
+ for (i = 0; i < numStrCache; i++) {
+ sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
+ count += array2->setObject(sym, 0);
+ count2 += (str == array2->lastObject());
+ sym->release();
+ }
+ str->release();
+ TEST_ASSERT('A', "4f", numStrCache == (int) array2->getCount());
+ TEST_ASSERT('A', "4g", count == numStrCache);
+ TEST_ASSERT('A', "4h", count2 == numStrCache);
+ }
+ if (array1 && array2) {
+ count = count2 = 0;
+ for (i = array1->getCount() - 1; (sym = array2->__takeObject(0)); i--) {
+ str = array1->replaceObject(sym, i);
+ count += (str != 0);
+ count2 += (sym != str);
+ if (str) {
+ str->release();
+ }
+ if (sym) {
+ sym->release();
+ }
+ }
+ TEST_ASSERT('A', "4k", numStrCache == (int) array1->getCount());
+ TEST_ASSERT('A', "4l", count == numStrCache);
+ TEST_ASSERT('A', "4m", count2 == numStrCache);
+ array1->release();
+ array2->release();
+ } else {
+ if (array1) {
+ array1->release();
+ }
+ if (array2) {
+ array2->release();
+ }
+ }
+ res = res && checkSpace("(A)4", spaceCheck, 0);
+
+ // Test array duplicate removal
+ spaceCheck = checkPointSpace();
+ array1 = OSArray::withCapacity(numStrCache);
+ TEST_ASSERT('A', "5a", array1);
+ if (array1) {
+ for (i = 0; i < numStrCache; i++) {
+ sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
+ count += array1->setObject(sym);
+ sym->release();
+ }
+ TEST_ASSERT('A', "5b", numStrCache == (int) array1->getCount());
+
+ // remove duplicates
+ for (i = 0; (sym = array1->getObject(i));) {
+ if (sym->getRetainCount() == 1) {
+ i++;
+ } else {
+ //sym = array1->__takeObject(i);
+ //sym->release();
+ array1->removeObject(i);
+ }
+ }
+ TEST_ASSERT('A', "5c", numStrCache != (int) array1->getCount());
+
+ // check to see that all symbols are really there
+ for (count = 0, i = 0; i < numStrCache; i++) {
+ sym = (OSObject *) OSSymbol::withCStringNoCopy(strCache[i]);
+ for (count2 = false, j = 0; (str = array1->getObject(j)); j++) {
+ if (str == sym) {
+ count2 = true;
+ break;
+ }
+ }
+ count += count2;
+ sym->release();
+ }
+ TEST_ASSERT('A', "5c", count == numStrCache);
+ array1->release();
+ }
+ res = res && checkSpace("(S)5", spaceCheck, 0);
+
+ if (res) {
+ verPrintf(("testArray: All OSArray Tests passed\n"));
+ } else {
+ logPrintf(("testArray: Some OSArray Tests failed\n"));
+ }