Annotation of objc/Test/StringTest.m, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.0 (the 'License').  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License."
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: /*
        !            25:    StringTest.m by Ali Ozer
        !            26:    Run with -v for verbose mode (where all results, successful or not, are shown).
        !            27: */
        !            28: 
        !            29: #ifdef TESTING
        !            30: #define NXString NxString
        !            31: #define NXMutableString NxMutableString
        !            32: #define NXReadWriteString NxReadWriteString
        !            33: #define NXReadOnlyString NxReadOnlyString
        !            34: #define NXReadOnlySubstring NxReadOnlySubstring
        !            35: #define NXSimpleReadOnlyString NxSimpleReadOnlyString
        !            36: #define NXUniquedString NxUniquedString
        !            37: #define NXGapString NxGapString
        !            38: #define NXBigString NxBigString
        !            39: #endif
        !            40: 
        !            41: #import "NXString.h"
        !            42: 
        !            43: #define TESTTESTEDSTUFF
        !            44: // #define TESTGAPSTRING
        !            45: // #define TESTBIGSTRING
        !            46: 
        !            47: #ifdef TESTGAPSTRING
        !            48: #import "NXGapString.h"
        !            49: #endif
        !            50: #ifdef TESTBIGSTRING
        !            51: #import "NXBigString.h"
        !            52: #endif
        !            53: 
        !            54: #define TESTCONSTANTSTRING
        !            55: 
        !            56: #import <stdio.h>
        !            57: #import <streams/streams.h>
        !            58: #import <appkit/nextstd.h>
        !            59: #import <libc.h>
        !            60: 
        !            61: #define CHARALLOC(zone, var, num)              var = ((num) ?  NXZoneMalloc((zone), sizeof(unichar) * (num)) : NULL)
        !            62: 
        !            63: static int numErrors;
        !            64: static BOOL verbose;
        !            65: 
        !            66: @interface NXString (DebugStuff)
        !            67: 
        !            68: - (void)verifyInt:(int)value :(int)desired;
        !            69: - (void)verifyCStrings:(const char *)value :(const char *)desired;
        !            70: - (void)verifyChars:(const char *)theRealThing;
        !            71: - (void)verifyId:theRealThing;
        !            72: - (void)verifyString:theRealThing;
        !            73: 
        !            74: @end
        !            75: 
        !            76: @implementation NXString (DebugStuff)
        !            77: 
        !            78: static Err()
        !            79: {
        !            80:     // Place to break on...
        !            81:     numErrors++;
        !            82: }
        !            83: 
        !            84: - (void)verifyChars:(const char *)theRealThing
        !            85: {
        !            86:     unichar buffer[1000];
        !            87:     BOOL equal;
        !            88: 
        !            89:     [self getCharacters:buffer];
        !            90: 
        !            91:     if (equal = ([self length] == strlen(theRealThing))) {
        !            92:        int cnt, length = [self length];
        !            93:        for (cnt = 0; cnt < length; cnt++) {
        !            94:            if (buffer[cnt] != (unichar)theRealThing[cnt]) {
        !            95:                equal = NO;
        !            96:                break;
        !            97:            }
        !            98:        }
        !            99:     }
        !           100: 
        !           101:     if (verbose || !equal) {
        !           102:        fprintf (stderr, "%s:", equal ? "OK" : "*** NOT OK");
        !           103:        fprintf (stderr, " %p ", self);
        !           104:        [self printForDebugger: NXOpenFile (fileno (stderr), NX_WRITEONLY)];
        !           105:        fprintf (stderr, "\n");
        !           106:     
        !           107:        if (!equal) {
        !           108:            fprintf (stderr, "*** Should be: %s\n", theRealThing);
        !           109:            Err();
        !           110:        }
        !           111:     }
        !           112: }
        !           113: 
        !           114: - (void)verifyInt:(int)value :(int)desired
        !           115: {
        !           116:     BOOL equal = (value == desired);
        !           117: 
        !           118:     if (verbose || !equal) {
        !           119:        fprintf (stderr, "%s:", equal ? "OK" : "*** NOT OK");
        !           120:        fprintf (stderr, " %p ", self);
        !           121:        [self printForDebugger: NXOpenFile (fileno (stderr), NX_WRITEONLY)];
        !           122:        fprintf (stderr, "\n");
        !           123:     
        !           124:        if (!equal) {
        !           125:            fprintf (stderr, "*** %d should be: %d\n", value, desired);
        !           126:            Err();
        !           127:        }
        !           128:     }
        !           129: }
        !           130: 
        !           131: - (void)verifyCStrings:(const char *)value :(const char *)desired
        !           132: {
        !           133:     BOOL equal = !strcmp(value, desired);
        !           134: 
        !           135:     if (verbose || !equal) {
        !           136:        fprintf (stderr, "%s:", equal ? "OK" : "*** NOT OK");
        !           137:        fprintf (stderr, " %p ", self);
        !           138:        [self printForDebugger: NXOpenFile (fileno (stderr), NX_WRITEONLY)];
        !           139:        fprintf (stderr, "\n");
        !           140:     
        !           141:        if (!equal) {
        !           142:            fprintf (stderr, "*** %s should be: %s\n", value, desired);
        !           143:            Err();
        !           144:        }
        !           145:     }
        !           146: }
        !           147: 
        !           148: - (void)verifyId:theRealThing
        !           149: {
        !           150:     BOOL equal = (theRealThing == self);
        !           151: 
        !           152:     if (verbose || !equal) {
        !           153:        fprintf (stderr, "%s:", equal ? "OK" : "*** NOT OK");
        !           154:        fprintf (stderr, " %p ", self);
        !           155:        [self printForDebugger: NXOpenFile (fileno (stderr), NX_WRITEONLY)];
        !           156:        fprintf (stderr, "\n");
        !           157:     
        !           158:        if (!equal) {
        !           159:            fprintf (stderr, "*** Should be: %p\n", theRealThing);
        !           160:            Err();
        !           161:        }
        !           162:     }
        !           163: }
        !           164: 
        !           165: - (void)verifyString:theRealThing
        !           166: {
        !           167:     BOOL equal = ([self isEqual:theRealThing]);
        !           168: 
        !           169:     if (verbose || !equal) {
        !           170:        fprintf (stderr, "%s:", equal ? "OK" : "*** NOT OK");
        !           171:        fprintf (stderr, " %p ", self);
        !           172:        [self printForDebugger: NXOpenFile (fileno (stderr), NX_WRITEONLY)];
        !           173:        fprintf (stderr, "\n");
        !           174:     
        !           175:        if (!equal) {
        !           176:            fprintf (stderr, "*** Should be: ");
        !           177:            [theRealThing printForDebugger: NXOpenFile (fileno (stderr), NX_WRITEONLY)];
        !           178:            fprintf (stderr, "\n");
        !           179:            Err();
        !           180:        }
        !           181:     }
        !           182: }
        !           183: 
        !           184: @end
        !           185: 
        !           186: #define TITLE(title)           \
        !           187:     printf ("%s%s %s%s\n",     \
        !           188:        verbose ? "\n" : "",    \
        !           189:        [testClass name],       \
        !           190:        (title),                \
        !           191:        verbose ? ":" : "...")
        !           192: 
        !           193: #define TITLE1(title)          \
        !           194:     printf ("%s%s%s\n",                \
        !           195:        verbose ? "\n" : "",    \
        !           196:        (title),                \
        !           197:        verbose ? ":" : "...")
        !           198: 
        !           199: /* This function returns a string containing 200 occurences of "ab..yz"
        !           200: */
        !           201: static NXString *hugeString (id testClass)
        !           202: {
        !           203: #define HUGESTRINGLEN 5200
        !           204:     static char buf[HUGESTRINGLEN] = {'\0'};
        !           205:     if (buf[0] == '\0') {
        !           206:        int cnt;
        !           207:        for (cnt = 0; cnt < HUGESTRINGLEN; cnt++) buf[cnt] = ('a' + (cnt % 26));
        !           208:     }
        !           209:     return [[testClass alloc] initFromCString:buf];           
        !           210: }
        !           211: 
        !           212: void testBasic /* create/read/copy/free */ (id testClass)
        !           213: {
        !           214:     id str1, str2, str3;
        !           215:     unichar chars1[] = {'A', 'B', 'C', 'D', 'E'};
        !           216:     unichar chars2[] = {'F', 'G', 'H', 'I', 'J'};
        !           217:     unichar chars3[] = {'K', 'L', 'M', 'N', 'O'};
        !           218:     unichar *charPtr;
        !           219:     NXRange range = {1, 2};
        !           220:     NXRange tmpRange = {0, 0};
        !           221: 
        !           222:     TITLE ("basic create/read/copy/free test");
        !           223:     
        !           224:     str1 = [[testClass alloc] initFromCharacters:chars1 length:5];
        !           225:     str2 = [[testClass alloc] initFromString:str1];
        !           226:     str3 = [[testClass alloc] initFromString:str2 range:range];
        !           227:     [str3 verifyChars:"BC"];   
        !           228:     [str3 free];
        !           229:     str3 = [str2 copy];
        !           230:     [str3 verifyChars:"ABCDE"];   
        !           231:     [str2 free];
        !           232:     [str3 verifyChars:"ABCDE"];
        !           233:     [str3 free];
        !           234: 
        !           235:     str3 = [[testClass alloc] initFromCharacters:chars2 length:5];
        !           236:     CHARALLOC(NXDefaultMallocZone(), charPtr, NX_LENGTH(range));
        !           237:     [str3 getCharacters:charPtr range:range];
        !           238:     str2 = [[testClass alloc] initFromCharacters:charPtr length:NX_LENGTH(range)];
        !           239:     [str3 verifyChars:"FGHIJ"];
        !           240:     [str2 verifyChars:"GH"];
        !           241:     [str2 free];
        !           242:     NX_FREE (charPtr);
        !           243: 
        !           244:     NX_LOCATION(tmpRange) = 1;
        !           245:     NX_LENGTH(tmpRange) = [str3 length] - 1;
        !           246:     CHARALLOC(NXDefaultMallocZone(), charPtr, NX_LENGTH(tmpRange));
        !           247:     [str3 getCharacters:charPtr range:tmpRange];
        !           248:     str2 = [[testClass alloc] initFromCharacters:charPtr length:NX_LENGTH(tmpRange)];
        !           249:     [str2 verifyChars:"GHIJ"];
        !           250:     [str2 free];
        !           251:     [str3 free];
        !           252:     [str1 free]; 
        !           253:     NX_FREE (charPtr);
        !           254: 
        !           255:     str3 = [[testClass alloc] initFromCharacters:chars3 length:5];
        !           256:     str2 = [str3 copy];
        !           257:     NX_LOCATION(tmpRange) = 0;
        !           258:     NX_LENGTH(tmpRange) = [str2 length];
        !           259:     CHARALLOC(NXDefaultMallocZone(), charPtr, NX_LENGTH(tmpRange));
        !           260:     [str2 getCharacters:charPtr range:tmpRange];
        !           261:     str1 = [[testClass alloc] initFromCharactersNoCopy:charPtr length:NX_LENGTH(tmpRange)];
        !           262:     [str3 free];
        !           263:     [str2 verifyChars:"KLMNO"];
        !           264:     [str2 free];
        !           265:     [str1 verifyChars:"KLMNO"];
        !           266:     [str1 free];
        !           267: 
        !           268:     str1 = [[testClass alloc] init];
        !           269:     str2 = [[testClass alloc] init];
        !           270:     [str1 free];
        !           271:     str1 = [str2 copy];
        !           272:     str3 = [[testClass alloc] initFromCharacters:NULL length:0];
        !           273:     [str2 free];
        !           274:     [str3 verifyChars:""];
        !           275:     [str3 free];
        !           276:     [str1 verifyChars:""];
        !           277:     [str1 free];
        !           278: 
        !           279: }    
        !           280: 
        !           281: void testCopy /* copy */ (id testClass)
        !           282: {
        !           283:     id str1, str2, str3, str4;
        !           284:     unichar chars1[] = {'A', 'B', 'C', 'D', 'E'};
        !           285:     NXRange range = {1,3};
        !           286: 
        !           287:     TITLE ("mutable/immutable copy test");
        !           288:     
        !           289:     str1 = [[testClass alloc] initFromCharacters:chars1 length:5];
        !           290:     str2 = [str1 mutableCopy];
        !           291:     [str2 appendString:str1];
        !           292:     [str2 verifyChars:"ABCDEABCDE"];
        !           293:     str3 = [str1 copySubstring:range];
        !           294:     str4 = [str2 copySubstring:range];
        !           295:     [str4 appendString:str3];
        !           296:     [str4 verifyChars:"BCDBCD"];
        !           297:     [str1 free];
        !           298:     [str2 free];
        !           299:     str1 = [str3 mutableCopy];
        !           300:     [str1 insertString:str4 at:1];
        !           301:     [str1 verifyChars:"BBCDBCDCD"];
        !           302:     [str3 verifyChars:"BCD"];
        !           303:     [str4 verifyChars:"BCDBCD"];
        !           304:     [str3 free];
        !           305:     [str4 free];
        !           306:     [str1 verifyChars:"BBCDBCDCD"];
        !           307:     [str1 free];
        !           308: 
        !           309: }
        !           310: 
        !           311: void testRefCountedAndUniqued ()
        !           312: {
        !           313:     id str1, str2, str3, str4;
        !           314:     unichar chars1[] = {'A', 'B', 'C', 'D', 'E'};
        !           315:     NXRange range = {1,3};
        !           316:     typedef struct {@defs(NXReadOnlyString);} ROString;
        !           317:     
        !           318:     TITLE1 ("NXReadOnlyString, NXReadWriteString, NXUniquedString tests");
        !           319:     
        !           320:     str1 = [[NXReadOnlyString alloc] initFromCharacters:chars1 length:5];
        !           321:     str2 = [str1 mutableCopy];
        !           322:     str3 = [str2 immutableCopy];
        !           323:     [str1 verifyInt:(int)str3 :(int)str1];
        !           324:     [str2 free];
        !           325:     str2 = [[NXReadWriteString alloc] initFromCharacters:chars1 length:3];
        !           326:     [str1 verifyInt:(int)str3 :(int)str1];
        !           327:     [str1 free];
        !           328:     [str3 verifyChars:"ABCDE"];
        !           329:     [str2 appendString:str3];
        !           330:     [str3 free];
        !           331:     [str2 verifyChars:"ABCABCDE"];
        !           332:     
        !           333:     str1 = [[NXReadOnlyString alloc] initFromCharactersNoCopy:chars1 length:5 freeWhenDone:NO];
        !           334:     str2 = [str1 mutableCopy];
        !           335:     str3 = [str2 immutableCopy];
        !           336:     [str2 free];
        !           337:     str2 = [str3 copySubstring:range];
        !           338:     [str1 verifyInt:(int)(((ROString *)str1)->characters)+1 :(int)(((ROString *)str2)->characters)];
        !           339: 
        !           340:     [str1 free];
        !           341:     [str3 verifyChars:"ABCDE"];
        !           342:     [str3 free];
        !           343:     str3 = [str2 mutableCopy];
        !           344:     [str3 insertString:str2 at:1];
        !           345:     [str3 verifyChars:"BBCDCD"];
        !           346:     [str3 deleteCharactersInRange:range];
        !           347:     [str3 verifyChars:"BCD"];
        !           348:     [str2 verifyChars:"BCD"];
        !           349:        
        !           350:     str1 = [NXUniquedString newFromString:str3];
        !           351:     str4 = [NXUniquedString newFromString:str2];
        !           352:     [str1 verifyInt:(int)str4 :(int)str1];
        !           353:     [str1 verifyInt:(int)[NXUniquedString newFromString:[str4 mutableCopy]] :(int)str1];
        !           354:       
        !           355: }
        !           356: 
        !           357: 
        !           358: void testEdit /* edit */ (id testClass)
        !           359: {
        !           360:     id str1, str2, str3;
        !           361:     typedef struct _NXReadWriteStringKludge {
        !           362:        @defs(NXReadWriteString);
        !           363:     } NXReadWriteStringKludge;
        !           364:     typedef struct _NXReadOnlyStringKludge {
        !           365:        @defs(NXReadOnlyString);
        !           366:     } NXReadOnlyStringKludge;
        !           367:     unichar chars1[] = {'A', 'B', 'C', 'D', 'E'};
        !           368:     unichar chars2[] = {'F', 'G', 'H', 'I', 'J'};
        !           369:     unichar chars3[] = {'K', 'L', 'M', 'N', 'O'};
        !           370:     int addr = 0;
        !           371:     NXRange range = {1, 2};
        !           372: 
        !           373:     TITLE ("appendString/delete/insertString test");
        !           374:     
        !           375:     str1 = [[testClass alloc] initFromCharacters:chars1 length:5];
        !           376:     str2 = [[testClass alloc] initFromString:str1 range:range];
        !           377:     [str1 appendString:str2];
        !           378:     [str1 verifyChars:"ABCDEBC"];
        !           379:     [str2 verifyChars:"BC"];   
        !           380:     [str1 insertString:str2 at:0];
        !           381:     [str1 insertString:str2 at:3];
        !           382:     [str1 deleteCharactersInRange:range];
        !           383:     [str1 verifyChars:"BBCBCDEBC"];
        !           384:     [str1 free];
        !           385: 
        !           386:     str1 = [[NXReadOnlyString alloc] initFromCharacters:chars3 length:5];
        !           387:     [str2 appendString:str1];
        !           388:     [str1 free];
        !           389:     [str2 verifyChars:"BCKLMNO"];
        !           390:     if (testClass == [NXReadWriteString class]) {
        !           391:        addr = (int)((NXReadOnlyStringKludge *)(((NXReadWriteStringKludge *)str2)->actualString))->characters;
        !           392:     }
        !           393:     str1 = [str2 copy];
        !           394:     str3 = [str1 copy];
        !           395:     [str2 free];
        !           396:     [str1 free];
        !           397:     str2 = [str3 copy];
        !           398:     [str3 verifyChars:"BCKLMNO"];
        !           399:     [str2 verifyChars:"BCKLMNO"];
        !           400:     if (testClass == [NXReadWriteString class]) {
        !           401:        [str2 verifyInt:(int)((NXReadOnlyStringKludge *)(((NXReadWriteStringKludge *)str2)->actualString))->characters :addr];
        !           402:     }
        !           403:     str1 = [[NXReadOnlyString alloc] initFromCharacters:chars2 length:1];
        !           404:     [str2 insertString:str1 at:2];
        !           405:     [str1 free];
        !           406:     [str3 verifyChars:"BCKLMNO"];
        !           407:     [str2 verifyChars:"BCFKLMNO"];
        !           408:     [str2 free];
        !           409:     [str3 free];
        !           410:     
        !           411:     str1 = [[testClass alloc] init];
        !           412:     str2 = [[testClass alloc] init];
        !           413:     [str1 appendString:@"Foo Bar"];
        !           414:     [str1 verifyChars:"Foo Bar"];
        !           415:     [str2 verifyChars:""];
        !           416:     [str1 free];
        !           417:     str1 = [[testClass alloc] init];
        !           418:     [str2 verifyChars:""];
        !           419:     [str1 appendString:str2];
        !           420:     [str2 free];
        !           421:     [str1 verifyChars:""];    
        !           422:     
        !           423: }
        !           424: 
        !           425: void testLargeEdit /* large edit */ (id testClass)
        !           426: {
        !           427:     int cnt;
        !           428:     id str1, str2, str3;
        !           429:     unichar chars1[] = {'A', 'B', 'C', 'D', 'E'};
        !           430:     NXRange range = {999, 25};
        !           431:     NXRange findRange;
        !           432: 
        !           433:     TITLE ("large appendString/delete/insertString test");
        !           434:     
        !           435:     str1 = [[testClass alloc] initFromCharacters:chars1 length:5];
        !           436:     str2 = [str1 copy];
        !           437:     for (cnt = 1; cnt < 64; cnt++) {
        !           438:        [str1 appendString:str2];
        !           439:     } // Resulting length is 320
        !           440:     [str2 free];
        !           441:     str2 = [str1 copy];
        !           442:     [str1 appendString:str2]; // 640
        !           443:     [str1 appendString:str2]; // 960
        !           444:     [str1 appendString:str2]; // 1280
        !           445:     [str2 free];
        !           446:     [str1 verifyInt:[str1 length] :1280];
        !           447: 
        !           448:     str2 = [[testClass alloc] initFromString:str1 range:range];
        !           449:     [str2 verifyChars:"EABCDEABCDEABCDEABCDEABCD"];
        !           450:     [str2 insertString:str1 at:2];
        !           451:     [str2 insertString:str1 at:[str2 length]];
        !           452:     [str1 free];
        !           453:     str3 = [str2 copySubstring:(NXRange){0, 10} fromZone:[str2 zone]];
        !           454:     [str3 verifyChars:"EAABCDEABC"];
        !           455:     str1 = [str2 copy];
        !           456:     [str2 replaceCharactersInRange:range withString:str1];
        !           457:     [str2 appendString:str3];
        !           458:     [str2 appendString:@"Howdy"];
        !           459:     [str3 free];
        !           460:     [str2 verifyInt:[str2 length] :5160];
        !           461:     findRange = [str2 findString:@"EAABCDEABCH"];
        !           462:     [str2 verifyInt:NX_LOCATION(findRange) :5145];
        !           463:     [str1 free];
        !           464:     NX_LOCATION(range) = 2;
        !           465:     NX_LENGTH(range) = [str2 length] - 4;
        !           466:     [str2 deleteCharactersInRange:range];
        !           467:     [str2 verifyChars:"EAdy"];
        !           468:     [str2 free];
        !           469: }
        !           470: 
        !           471: void testCompare /* compare */ (id testClass)
        !           472: {
        !           473:     id str1, str2, str3, str4, str5;
        !           474:     unichar chars1[] = {'A', 'B', 'C', 'D', 'E'};
        !           475:     unichar chars2[] = {'F', 'G', 'h', 'f', 'g'};
        !           476:     unichar chars3[] = {'F', 'g', 'H', 'f', 'G'};
        !           477: 
        !           478:     TITLE ("compare test");
        !           479: 
        !           480:     str1 = [[testClass alloc] initFromCharacters:chars1 length:5];    
        !           481:     str2 = [[testClass alloc] initFromCharacters:chars1 length:4];    
        !           482:     str3 = [[testClass alloc] initFromCharacters:chars2 length:4];
        !           483:     [str1 verifyInt:[str1 compare:str1] :0];
        !           484:     [str1 verifyInt:[str1 compare:str2] :1];
        !           485:     [str1 verifyInt:[str1 compare:str3] :-1];
        !           486:     [str2 verifyInt:[str2 compare:str1] :-1];
        !           487:     [str2 verifyInt:[str2 compare:str3] :-1];
        !           488:     [str3 verifyInt:[str3 compare:str1] :1];
        !           489:     [str3 verifyInt:[str3 compare:str2] :1];
        !           490:     str4 = [[NXReadWriteString alloc] initFromString:str1];
        !           491:     str5 = [str4 copy];
        !           492:     [str1 verifyInt:[str1 compare:str4] :0];
        !           493:     [str5 verifyInt:[str5 compare:str1] :0];
        !           494:     [str4 appendString:str4];
        !           495:     [str1 verifyInt:[str1 compare:str4] :-1];
        !           496:     [str5 verifyInt:[str5 compare:str1] :0];
        !           497:     [str4 free];
        !           498:     [str5 free];
        !           499:     [str1 free];
        !           500:     [str2 free];
        !           501:     str4 = [[testClass alloc] initFromCharacters:chars3 length:4];
        !           502:     [str4 verifyInt:[str4 compare:str3] :1];
        !           503:     [str3 verifyInt:[str3 compare:str4] :-1];
        !           504:     [str4 verifyInt:[str4 compare:str3 mask:NX_CASE_INSENSITIVE table:NULL] :0];
        !           505:     [str3 verifyInt:[str3 compare:str4 mask:NX_CASE_INSENSITIVE table:NULL] :0];
        !           506:     str2 = [[NXReadOnlyString alloc] initFromString:str3];
        !           507:     [str4 verifyInt:[str4 compare:str2] :1];
        !           508:     [str2 verifyInt:[str2 compare:str4] :-1];
        !           509:     [str2 free];
        !           510:     [str3 free];
        !           511:     [str4 free];
        !           512: }
        !           513: 
        !           514: #define wholeRange(s) ((NXRange){0, [(s) length]})
        !           515: 
        !           516: void testFind /* find */ (id testClass)
        !           517: {
        !           518:     id str1, str2, str3, str4;
        !           519:     unichar chars1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'g', 'h', 'a', 'b', 'B', 'C'};
        !           520:     unichar chars2[] = {'F', 'G', 'h', 'f', 'g'};
        !           521:     unichar chars3[] = {'F', 'g', 'H', 'f', 'G'};
        !           522:     NXRange findRange;
        !           523: 
        !           524:     TITLE ("find test");
        !           525: 
        !           526:     str1 = [[testClass alloc] initFromCharacters:chars1 length:12];   // ABCDEFghabBC
        !           527:     str2 = [[testClass alloc] initFromCharacters:chars1 length:2];    // AB
        !           528:     str3 = [[testClass alloc] initFromCharacters:chars2 length:2];    // FG
        !           529:     str4 = [[testClass alloc] initFromCharacters:chars3 length:2];    // Fg
        !           530: 
        !           531:     findRange = [str1 findString:str2];
        !           532:     [str1 verifyInt:NX_LOCATION(findRange) :0];
        !           533:     [str1 verifyInt:NX_LENGTH(findRange) :2];
        !           534:     findRange = [str1 findString:str3];
        !           535:     [str1 verifyInt:NX_LOCATION(findRange) :NX_STRING_NOT_FOUND];
        !           536:     [str1 verifyInt:NX_LENGTH(findRange) :0];
        !           537:     findRange = [str1 findString:str4];
        !           538:     [str1 verifyInt:NX_LOCATION(findRange) :5];
        !           539:     [str1 verifyInt:NX_LENGTH(findRange) :2];
        !           540:     findRange = [str1 findString:str3 range:wholeRange(str1) mask:NX_CASE_INSENSITIVE table:NULL];
        !           541:     [str1 verifyInt:NX_LOCATION(findRange) :5];
        !           542:     [str1 verifyInt:NX_LENGTH(findRange) :2];
        !           543:     findRange = [str1 findString:str2 range:wholeRange(str1) mask:NX_CASE_INSENSITIVE|NX_BACKWARDS_SEARCH table:NULL];
        !           544:     [str1 verifyInt:NX_LOCATION(findRange) :8];
        !           545:     [str1 verifyInt:NX_LENGTH(findRange) :2];
        !           546:     findRange = [str1 findString:str2 range:wholeRange(str1) mask:NX_BACKWARDS_SEARCH table:NULL];
        !           547:     [str1 verifyInt:NX_LOCATION(findRange) :0];
        !           548:     [str1 verifyInt:NX_LENGTH(findRange) :2];
        !           549:     findRange = [str3 findString:str4 range:wholeRange(str3) mask:NX_BACKWARDS_SEARCH table:NULL];
        !           550:     [str3 verifyInt:NX_LOCATION(findRange) :NX_STRING_NOT_FOUND];
        !           551:     [str3 verifyInt:NX_LENGTH(findRange) :0];
        !           552:     findRange = [str3 findString:str4 range:wholeRange(str3) mask:NX_CASE_INSENSITIVE|NX_BACKWARDS_SEARCH table:NULL];
        !           553:     [str3 verifyInt:NX_LOCATION(findRange) :0];
        !           554:     [str3 verifyInt:NX_LENGTH(findRange) :2];
        !           555:     findRange = [str3 findString:str4 range:wholeRange(str3) mask:NX_CASE_INSENSITIVE table:NULL];
        !           556:     [str3 verifyInt:NX_LOCATION(findRange) :0];
        !           557:     [str3 verifyInt:NX_LENGTH(findRange) :2];
        !           558:     findRange = [str2 findString:str1];
        !           559:     [str2 verifyInt:NX_LOCATION(findRange) :NX_STRING_NOT_FOUND];
        !           560:     [str2 verifyInt:NX_LENGTH(findRange) :0];
        !           561:     
        !           562:     NX_LOCATION(findRange) = 1;
        !           563:     NX_LENGTH(findRange) = [str1 length] - 1;
        !           564:     findRange = [str1 findString:str2 range:findRange mask:NX_CASE_INSENSITIVE table:NULL];
        !           565:     [str3 verifyInt:NX_LOCATION(findRange) :8];
        !           566:     [str3 verifyInt:NX_LENGTH(findRange) :2];
        !           567:     
        !           568: }
        !           569: 
        !           570: void testStream (id testClass)
        !           571: {
        !           572:     const char *bytes = "Hello There. Hi There.";
        !           573:     unichar chars1[] = {'A', 'B', 'C', 0, 1, 2, '0', '1', '2'};
        !           574:     NXStream *stream;
        !           575:     id str1, str2, str3, str4;
        !           576:     NXCharacterSet *numberSet;
        !           577: 
        !           578:     TITLE ("stream test");
        !           579: 
        !           580:     numberSet = [[NXCharacterSet alloc] init];
        !           581:     [numberSet addRange:'0' :'9'];
        !           582: 
        !           583:     stream = NXOpenMemory(bytes, strlen(bytes), NX_READONLY);
        !           584:     str1 = [[testClass alloc] initFromCStringStream:stream untilOneOf:nil maxLength:1];
        !           585:     str2 = [[testClass alloc] initFromCStringStream:stream untilOneOf:nil maxLength:17];
        !           586:     str3 = [[testClass alloc] initFromCStringStream:stream untilOneOf:nil maxLength:120];
        !           587:     
        !           588:     [str1 verifyChars:"H"];
        !           589:     [str2 verifyChars:"ello There. Hi Th"];
        !           590:     [str3 verifyChars:"ere."];
        !           591:     [str1 free];
        !           592:     [str3 free];
        !           593: 
        !           594:     NXClose (stream);
        !           595: 
        !           596:     stream = NXOpenMemory(NULL, 0, NX_READWRITE);
        !           597:     [str2 writeCStringToStream:stream];
        !           598:     str1 = [[testClass alloc] initFromCharacters:chars1 length:9];
        !           599:     [str1 writeCStringToStream:stream];
        !           600: 
        !           601:     NXSeek(stream, 1, NX_FROMSTART);
        !           602:     str3 = [[testClass alloc] initFromCStringStream:stream untilOneOf:nil maxLength:NX_MAX_STRING_LENGTH];
        !           603: 
        !           604:     str4 = [[NXReadWriteString alloc] init];
        !           605:     [str4 append:str2];
        !           606:     [str4 deleteCharactersInRange:(NXRange){0,1}];     // Because we seeked to 1 above...
        !           607:     [str4 append:str1];
        !           608:     
        !           609:     [str3 verifyString:str4];
        !           610:     [str3 verifyInt:[str3 length] :[str2 length] - 1 + 9];
        !           611: 
        !           612:     [str3 free];
        !           613: 
        !           614:     NXSeek(stream, 1, NX_FROMSTART);
        !           615:     str3 = [[testClass alloc] initFromCStringStream:stream untilOneOf:numberSet maxLength:NX_MAX_STRING_LENGTH];
        !           616: 
        !           617:     [str4 deleteCharactersInRange:(NXRange){[str4 length]-3, 3}];
        !           618:     [str3 verifyString:str4];
        !           619:     [str3 verifyInt:[str3 length] :[str2 length] - 1 + 6];
        !           620:     [str3 free];
        !           621: 
        !           622:     NXSeek(stream, 1, NX_FROMSTART);
        !           623:     str3 = [[testClass alloc] initFromCStringStream:stream untilOneOf:numberSet maxLength:5];
        !           624: 
        !           625:     [str4 deleteCharactersInRange:(NXRange){5, [str4 length] - 5}];
        !           626:     [str3 verifyString:str4];
        !           627:     [str3 verifyInt:[str3 length] :5];
        !           628:     [str3 free];
        !           629: 
        !           630:     [str1 free];
        !           631:     [str2 free];
        !           632:     [str4 free];
        !           633: 
        !           634:     NXCloseMemory(stream, NX_FREEBUFFER);
        !           635: 
        !           636:     str1 = hugeString(testClass);
        !           637: 
        !           638:     stream = NXOpenMemory(NULL, 0, NX_READWRITE);
        !           639:     [str1 writeCStringToStream:stream];
        !           640:     NXSeek(stream, 0, NX_FROMSTART);
        !           641:     str2 = [[testClass alloc] initFromCStringStream:stream untilOneOf:nil maxLength:NX_MAX_STRING_LENGTH];
        !           642:     [str1 verifyString:str2];
        !           643:     [str2 free];
        !           644:     NXCloseMemory(stream, NX_FREEBUFFER);
        !           645:     
        !           646:     stream = NXOpenMemory(NULL, 0, NX_READWRITE);
        !           647:     [str1 writeToStream:stream];
        !           648:     NXSeek(stream, 0, NX_FROMSTART);
        !           649:     str2 = [[testClass alloc] initFromStream:stream untilOneOf:nil maxLength:NX_MAX_STRING_LENGTH];
        !           650:     [str1 verifyString:str2];
        !           651:     [str2 free];
        !           652:     NXCloseMemory(stream, NX_FREEBUFFER);
        !           653:     
        !           654:     [str1 free];
        !           655: }
        !           656: 
        !           657: void testHash (id testClass)
        !           658: {
        !           659:     id str1;
        !           660:     unichar chars1[] = {'F', 'o', 'o'};
        !           661:     
        !           662:     TITLE ("hash test");
        !           663: 
        !           664:     str1 = [[testClass alloc] initFromCharacters:chars1 length:3];
        !           665:     [str1 verifyInt:[str1 hash] :32095];
        !           666:     [str1 verifyInt:[str1 hash] :[@"Foo" hash]];
        !           667:     [str1 free];
        !           668:     
        !           669:     str1 = [[testClass alloc] initFromString:@"Hello World"];
        !           670:     [str1 verifyInt:[str1 hash] :850486630];
        !           671:     [str1 free]; 
        !           672: }
        !           673: 
        !           674: void testFormat (id testClass)
        !           675: {
        !           676:     id str1, str2, str3;
        !           677:     int cnt;
        !           678:     unichar chars1[] = {'F', 'o', 'o'};
        !           679:     
        !           680:     TITLE ("formatted create test");
        !           681: 
        !           682:     str1 = [[NXReadOnlyString alloc] initFromCString:"===%2.1f %d %s %@==="];
        !           683:     str2 = [[NXReadOnlyString alloc] initFromCharacters:chars1 length:3];
        !           684:     str3 = [[testClass alloc] initFromFormat:str1, 3.14, -42, "Hello World", str2];
        !           685:     
        !           686:     [str3 verifyChars:"===3.1 -42 Hello World Foo==="];
        !           687: 
        !           688:     [str1 free];
        !           689:     [str2 free];
        !           690:     [str3 free];
        !           691: 
        !           692:     str1 = [[NXReadOnlyString alloc] initFromCString:"Hello"];
        !           693:     str3 = [[NXReadWriteString alloc] initFromString:str1];
        !           694:     for (cnt = 0; cnt < 12; cnt++) {
        !           695:        str2 = [[testClass alloc] initFromFormat:@"%@*%@", str1, str1];
        !           696:        [str3 appendString:@"*"];       // Test string; we assume append works.
        !           697:        [str3 appendString:str1];
        !           698:        [str2 verifyString:str3];
        !           699:        [str1 free];
        !           700:        str1 = str2;
        !           701:     }
        !           702:     [str3 free];
        !           703:     str3 = [[NXReadOnlyString alloc] initFromString:str1 range:(NXRange){[str1 length] - 6, 6}]; 
        !           704:     [str3 verifyChars:"*Hello"];
        !           705:     [str1 free];
        !           706:     [str3 free];
        !           707: }
        !           708: 
        !           709: void testCStrings (id testClass)
        !           710: {
        !           711:     id str1, str2;
        !           712:     char *cString;
        !           713:     NXAtom uString1, uString2;
        !           714: #define CSTRBUFLEN 10
        !           715: #define CSTRBIGBUFLEN 1000
        !           716:     char cStringBuffer[CSTRBIGBUFLEN+1];
        !           717:     int cnt;
        !           718:     NXRange range;
        !           719: 
        !           720:     TITLE ("CString test");
        !           721:     
        !           722:     str1 = [[NXReadOnlyString alloc] initFromCString:"Hello World"];
        !           723:     str2 = [str1 mutableCopy];
        !           724:     cString = [str1 cStringCopy];
        !           725:     [str1 verifyChars:cString];
        !           726:     free (cString);
        !           727:     uString1 = [str1 uniqueCStringCopy];
        !           728:     [str1 verifyChars:uString1];
        !           729:     uString2 = [str1 uniqueCStringCopy];
        !           730:     [str1 verifyInt:(int)uString1 :(int)uString2];
        !           731:     uString2 = [str2 uniqueCStringCopy];
        !           732:     [str1 verifyInt:(int)uString1 :(int)uString2];
        !           733:     [str2 appendString:@""];
        !           734:     uString2 = [str2 uniqueCStringCopy];
        !           735:     [str1 verifyInt:(int)uString1 :(int)uString2];
        !           736:     [str2 appendString:@" "];
        !           737:     uString1 = [str2 uniqueCStringCopy];
        !           738:     uString2 = [@"Hello World " uniqueCStringCopy];
        !           739:     [str2 verifyInt:(int)uString1 :(int)uString2];
        !           740:     [str1 free];
        !           741:     [str2 free];
        !           742: 
        !           743:     str1 = [[testClass alloc] initFromCString:"Bonjour Everyone"];
        !           744:     [str1 getCString:cStringBuffer maxLength:3];
        !           745:     [str1 verifyCStrings:cStringBuffer :"Bon"];
        !           746:     [str1 getCString:cStringBuffer maxLength:0];
        !           747:     [str1 verifyCStrings:cStringBuffer :""];
        !           748:     NX_LOCATION(range) = 8; NX_LENGTH(range) = 5;
        !           749:     [str1 getCString:cStringBuffer maxLength:NX_MAX_STRING_LENGTH range:range remainingRange:NULL];
        !           750:     [str1 verifyCStrings:cStringBuffer :"Every"];
        !           751:     [str1 getCString:cStringBuffer maxLength:2 range:range remainingRange:NULL];
        !           752:     [str1 verifyCStrings:cStringBuffer :"Ev"];
        !           753:     [str1 getCString:cStringBuffer maxLength:CSTRBUFLEN range:range remainingRange:NULL];
        !           754:     [str1 verifyCStrings:cStringBuffer :"Every"];
        !           755:     [str1 getCString:cStringBuffer maxLength:CSTRBUFLEN];
        !           756:     [str1 verifyCStrings:cStringBuffer :"Bonjour Ev"];
        !           757:     NX_LOCATION(range) = 0;
        !           758:     NX_LENGTH(range) = 11;
        !           759:     [str1 getCString:cStringBuffer maxLength:0 range:range remainingRange:&range];
        !           760:     [str1 verifyCStrings:cStringBuffer :""];
        !           761:     [str1 verifyInt:NX_LOCATION(range) :0];
        !           762:     [str1 verifyInt:NX_LENGTH(range) :11];
        !           763:     [str1 getCString:cStringBuffer maxLength:5 range:range remainingRange:&range];
        !           764:     [str1 verifyCStrings:cStringBuffer :"Bonjo"];
        !           765:     [str1 verifyInt:NX_LOCATION(range) :5];
        !           766:     [str1 verifyInt:NX_LENGTH(range) :6];
        !           767:     [str1 getCString:cStringBuffer maxLength:10 range:range remainingRange:&range];
        !           768:     [str1 verifyCStrings:cStringBuffer :"ur Eve"];
        !           769:     [str1 verifyInt:NX_LOCATION(range) :11];
        !           770:     [str1 verifyInt:NX_LENGTH(range) :0];
        !           771:     [str1 free];
        !           772: 
        !           773:     str1 = hugeString(testClass);
        !           774:     [str1 getCString:cStringBuffer maxLength:CSTRBIGBUFLEN range:(NXRange){0,[str1 length]} remainingRange:&range];
        !           775:     cnt = 26 * ((int)(CSTRBIGBUFLEN / 26) - 1);
        !           776:     cStringBuffer[cnt + 26] = '\0';
        !           777:     [str1 verifyCStrings:&cStringBuffer[cnt] :"abcdefghijklmnopqrstuvwxyz"];
        !           778:     [str1 verifyInt:NX_LOCATION(range) :CSTRBIGBUFLEN];
        !           779:     [str1 verifyInt:NX_LENGTH(range) :[str1 length] - CSTRBIGBUFLEN];
        !           780:     [str1 free];        
        !           781: }
        !           782: 
        !           783: void testFindAndSets (id testClass)
        !           784: {
        !           785:     id str1;
        !           786:     unichar chars1[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '1', 'h', '3'};
        !           787:     unichar chars2[] = {' ', '\t'};
        !           788:     NXCharacterSet *numberSet, *alphaSet, *spaceSet, *notAlphaSet, *numAndAlphaSet;
        !           789:     
        !           790:     TITLE ("find and NXCharacterSet test");
        !           791: 
        !           792:     numberSet = [[NXCharacterSet alloc] init];
        !           793:     [numberSet addRange:'0' :'9'];
        !           794: 
        !           795:     alphaSet = [[NXCharacterSet alloc] init];
        !           796:     [alphaSet addRange:'a' :'z'];
        !           797:     [alphaSet addRange:'A' :'Z'];
        !           798: 
        !           799:     notAlphaSet = [[NXCharacterSet alloc] init];
        !           800:     [notAlphaSet addRange:'a' :'z'];
        !           801:     [notAlphaSet addRange:'A' :'Z'];
        !           802:     [notAlphaSet invert];
        !           803: 
        !           804:     spaceSet = [[NXCharacterSet alloc] init];
        !           805:     [spaceSet addCharacters:chars2 length:2];
        !           806:     [spaceSet addCharacters:chars1 length:14];
        !           807:     [spaceSet removeCharacters:chars1 length:14];
        !           808:     [spaceSet addCharacters:chars2 length:2];
        !           809: 
        !           810:     numAndAlphaSet = [[NXCharacterSet alloc] init];
        !           811:     [numAndAlphaSet unionWith:alphaSet];
        !           812:     [numAndAlphaSet unionWith:numberSet];
        !           813: 
        !           814:     str1 = [[testClass alloc] initFromCharacters:chars1 length:14];
        !           815:     [str1 verifyInt:[str1 findCharacter:'l'] :2];
        !           816:     [str1 verifyInt:[str1 findCharacter:'l' range:wholeRange(str1) mask:NX_BACKWARDS_SEARCH table:NULL] :9];
        !           817:     [str1 verifyInt:[str1 findCharacter:'h' range:wholeRange(str1) mask:NX_CASE_INSENSITIVE table:NULL] :0];
        !           818:     [str1 verifyInt:[str1 findCharacter:'h' range:wholeRange(str1) mask:NX_BACKWARDS_SEARCH table:NULL] :12];
        !           819: 
        !           820:     [str1 verifyInt:[str1 findOneOf:alphaSet] :0];
        !           821:     [str1 verifyInt:[str1 findOneOf:notAlphaSet] :5];
        !           822:     [str1 verifyInt:[str1 findOneOf:spaceSet] :5];
        !           823:     [str1 verifyInt:[str1 findOneOf:numberSet] :11];
        !           824:     [str1 verifyInt:[str1 findOneOf:numberSet range:wholeRange(str1) mask:NX_BACKWARDS_SEARCH table:NULL] :13];
        !           825: }
        !           826: 
        !           827: #ifdef TESTCONSTANTSTRING
        !           828: void testConstant /* basic constant string functionality */ ()
        !           829: {
        !           830:     id str1, str2, str3;
        !           831:     unichar *charPtr;
        !           832:     NXRange range = {1, 2};
        !           833:     NXRange tmpRange = {0, 0};
        !           834: 
        !           835:     TITLE1 ("NXConstantString test");
        !           836:     
        !           837:     str1 = [[NXReadOnlyString alloc] initFromString:@"ABCDE"];
        !           838:     str2 = [[NXReadOnlyString alloc] initFromString:str1];
        !           839:     str3 = [[NXReadOnlyString alloc] initFromString:str2 range:range];
        !           840:     [str3 verifyChars:"BC"];   
        !           841:     [str3 free];
        !           842:     str3 = [str2 copy];
        !           843:     [str3 verifyChars:"ABCDE"];   
        !           844:     [str2 free];
        !           845:     [str3 verifyChars:"ABCDE"];
        !           846:     [str3 free];
        !           847: 
        !           848:     str3 = [[NXReadOnlyString alloc] initFromString:@"FGHIJ"];
        !           849:     CHARALLOC(NXDefaultMallocZone(), charPtr, NX_LENGTH(range));
        !           850:     [str3 getCharacters:charPtr range:range];
        !           851:     str2 = [[NXReadOnlyString alloc] initFromCharacters:charPtr length:NX_LENGTH(range)];
        !           852:     [str3 verifyChars:"FGHIJ"];
        !           853:     [str2 verifyChars:"GH"];
        !           854:     [str2 free];
        !           855:     NX_FREE (charPtr);
        !           856: 
        !           857:     NX_LOCATION(tmpRange) = 1;
        !           858:     NX_LENGTH(tmpRange) = [str3 length] - 1;
        !           859:     CHARALLOC(NXDefaultMallocZone(), charPtr, NX_LENGTH(tmpRange));
        !           860:     [str3 getCharacters:charPtr range:tmpRange];
        !           861:     str2 = [[NXReadOnlyString alloc] initFromCharacters:charPtr length:NX_LENGTH(tmpRange)];
        !           862:     [str2 verifyChars:"GHIJ"];
        !           863:     [str2 free];
        !           864:     [str3 free];
        !           865:     [str1 free]; 
        !           866:     NX_FREE (charPtr);
        !           867: 
        !           868:     str3 = [[NXReadOnlyString alloc] initFromString:@"KLM" @"NO"];
        !           869:     str2 = [str3 copy];
        !           870:     NX_LOCATION(tmpRange) = 0;
        !           871:     NX_LENGTH(tmpRange) = [str2 length];
        !           872:     CHARALLOC(NXDefaultMallocZone(), charPtr, NX_LENGTH(tmpRange));
        !           873:     [str2 getCharacters:charPtr range:tmpRange];
        !           874:     str1 = [[NXReadOnlyString alloc] initFromCharactersNoCopy:charPtr length:NX_LENGTH(tmpRange)];
        !           875:     [str3 free];
        !           876:     [str2 verifyChars:"KLMNO"];
        !           877:     [str2 free];
        !           878:     [str1 verifyChars:"KLMNO"];
        !           879:     [str1 free];
        !           880:     
        !           881:     str1 = [[NXReadWriteString alloc] init];
        !           882:     str2 = [str1 copy];
        !           883:     [str1 appendString:@"Foo"];
        !           884:     [str1 verifyInt:[str1 isEqual:@""] :NO];
        !           885:     [str2 verifyInt:[str2 isEqual:@""] :YES];    
        !           886:     [str1 free];
        !           887:     [str2 verifyInt:[str2 isEqual:@""] :YES];    
        !           888:     [str2 free];
        !           889: }
        !           890: 
        !           891: 
        !           892: #endif
        !           893: 
        !           894: void main (int argc, char **argv)
        !           895: {
        !           896:     numErrors = 0;
        !           897:     verbose = (argc > 1) && (strcmp(argv[1], "-v") == 0);
        !           898: 
        !           899: #ifdef TESTTESTEDSTUFF
        !           900:     testBasic ([NXReadOnlyString class]);
        !           901:     testBasic ([NXReadWriteString class]);
        !           902:     testBasic ([NXUniquedString class]);
        !           903:     testBasic ([NXSimpleReadOnlyString class]);
        !           904: 
        !           905:     testCopy ([NXReadOnlyString class]);
        !           906:     testCopy ([NXReadWriteString class]);
        !           907:     testCopy ([NXUniquedString class]);
        !           908:     testCopy ([NXSimpleReadOnlyString class]);
        !           909: 
        !           910:     testRefCountedAndUniqued ();
        !           911: 
        !           912:     testEdit ([NXReadWriteString class]);
        !           913:     testLargeEdit ([NXReadWriteString class]);
        !           914: 
        !           915:     testCompare ([NXReadOnlyString class]);
        !           916:     testCompare ([NXReadWriteString class]);
        !           917:     testCompare ([NXUniquedString class]);
        !           918:     testCompare ([NXSimpleReadOnlyString class]);
        !           919: 
        !           920:     testFind ([NXReadOnlyString class]);
        !           921:     testFind ([NXReadWriteString class]);
        !           922:     testFind ([NXUniquedString class]);
        !           923:     testFind ([NXSimpleReadOnlyString class]);
        !           924: 
        !           925:     testStream ([NXReadOnlyString class]);
        !           926:     testStream ([NXReadWriteString class]);
        !           927:     testStream ([NXUniquedString class]);
        !           928:     testStream ([NXSimpleReadOnlyString class]);
        !           929: 
        !           930:     testFormat ([NXReadOnlyString class]);
        !           931:     testFormat ([NXReadWriteString class]);
        !           932:     testFormat ([NXUniquedString class]);
        !           933:     testFormat ([NXSimpleReadOnlyString class]);
        !           934: 
        !           935:     testFindAndSets ([NXReadOnlyString class]);
        !           936:     testFindAndSets ([NXReadWriteString class]);
        !           937:     testFindAndSets ([NXUniquedString class]);
        !           938:     testFindAndSets ([NXSimpleReadOnlyString class]);
        !           939: 
        !           940:     testCStrings ([NXReadOnlyString class]);
        !           941:     testCStrings ([NXReadWriteString class]);
        !           942:     testCStrings ([NXUniquedString class]);
        !           943:     testCStrings ([NXSimpleReadOnlyString class]);
        !           944: 
        !           945:     testHash ([NXReadOnlyString class]);
        !           946:     testHash ([NXReadWriteString class]);
        !           947:     testHash ([NXUniquedString class]);
        !           948:     testHash ([NXSimpleReadOnlyString class]);
        !           949: #endif
        !           950: 
        !           951: #ifdef TESTGAPSTRING
        !           952:     testBasic ([NXGapString class]);
        !           953:     testCopy ([NXGapString class]);
        !           954:     testEdit ([NXGapString class]);
        !           955:     testCompare ([NXGapString class]);
        !           956:     testFind ([NXGapString class]);
        !           957:     testLargeEdit ([NXGapString class]);
        !           958:     testStream ([NXGapString class]);
        !           959:     testFormat ([NXGapString class]);
        !           960:     testFindAndSets ([NXGapString class]);
        !           961:     testCStrings ([NXGapString class]);
        !           962:     testHash ([NXGapString class]);
        !           963: #endif
        !           964: 
        !           965: #ifdef TESTBIGSTRING
        !           966:     testBasic ([NXBigString class]);
        !           967:     testCopy ([NXBigString class]);
        !           968:     testEdit ([NXBigString class]);
        !           969:     testCompare ([NXBigString class]);
        !           970:     testFind ([NXBigString class]);
        !           971:     testLargeEdit ([NXBigString class]);
        !           972:     testStream ([NXBigString class]);
        !           973:     testFormat ([NXBigString class]);
        !           974:     testFindAndSets ([NXBigString class]);
        !           975:     testCStrings ([NXBigString class]);
        !           976:     testHash ([NXBigString class]);
        !           977: #endif
        !           978: 
        !           979: #ifdef TESTCONSTANTSTRING
        !           980:     testConstant();
        !           981: #endif
        !           982: 
        !           983:     fprintf (stderr, "\n%s%d error%s.\n", numErrors ? "*** " : "", numErrors, numErrors == 1 ? "" : "s");
        !           984: }

unix.superglobalmegacorp.com

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