//
// StringTest.m -- test out the String class
//		Written by Don Yacktman (c) 1994 by Don Yacktman.
//				Version 1.0.  All rights reserved.
//
//		This notice may not be removed from this source code.
//
//	This program is included in the MiscKit by permission from the author
//	and its use is governed by the MiscKit license, found in the file
//	"LICENSE.rtf" in the MiscKit distribution.  Please refer to that file
//	for a list of all applicable permissions and restrictions.
//	

// *******************************************************************
//	This program is incomplete.  That's why it isn't compiled or run
//	yet.  When finished, it will replace "StringTest.m" completely.
// *******************************************************************

// To find the test for a method, search for a method name in the format
// "-numOfChar:caseSensitive:" and you'll go right to it.
// There is a separate, source file for testing each category, each of
// which is brought into this source via an include.

// Functions left to write:
//	testMiscStringComparing()
//	testMiscStringFields()
//	testMiscStringInsertion()
//	testMiscStringModification()
//	testMiscStringPatterns()
//	testMiscStringReplacing()
//	testMiscStringSearching()
//	testMiscStringUNIX()			(incomplete)

#import <appkit/appkit.h>
#import <misckit/misckit.h>
#import <stdio.h>

#define MSTRINGS 12
void testMiscString()
{
	id string[MSTRINGS]; int i;
	char *charString[10];
	printf("***** Testing MiscString class\n");
	
// Test MiscString.m methods:

	// Various ways to create new strings:
	// -new, -newWithString:, -alloc and -init, -initString:, -initFromFormat:
	string[0] = [MiscString new];
	string[1] = [string[0] new];
	string[2] = [MiscString newWithString:NULL];
	string[3] = [MiscString newWithString:""];
	string[4] = [MiscString newWithString:"This is String #4."];
	string[5] = [[MiscString alloc] init];
	string[6] = [[MiscString alloc] initString:NULL];
	string[7] = [[MiscString alloc] initString:""];
	string[8] = [[MiscString alloc] initString:"This is String #8."];
	string[9] = [[MiscString alloc]
			initFromFormat:"A formatted string:  %d %f %s.", 10, 200.3, "Yup"];

	// -allocateBuffer and -allocateBuffer:fromZone: will be exercised
	// throughout this test suite, so we won't worry about them specifically.
	// The same goes for -stringValue and -stringValueAndFree.  They both
	// get used a lot, so we'll assume that they work OK.

	// -copyFromZone:, -freeString
	string[10] = [string[8] copy]; // actually hits -copyFromZone:
	string[11] = [string[9] copy]; [string[11] freeString];
	// -free will be used throughout, so we won't test that here explicitly

	// -getCopyInto:
	charString[0] = (char *)malloc(32);
	[string[4] getCopyInto:charString[0]];
	charString[1] = [string[8] getCopyInto:NULL];
	for (i=0; i<12; i++)
		printf("String #%d:  \"%s\", length = %d\n", i,
				[string[i] stringValue], [string[i] length]);
	for (i=0; i<2; i++)
		printf("CharString #%d:  \"%s\".\n", i, charString[i]);

	// -emptyString
	printf("emptyString:  #2: %d,  #3: %d,  #4: %d,  #11: %d\n",
			[string[2]  emptyString], [string[3]  emptyString],
			[string[4]  emptyString], [string[11]  emptyString]);

	// -charAt:
	printf("String #4, character at -10: '%c' (0x%x)\n",
			[string[4]  charAt:-10], (unsigned)[string[4]  charAt:-10]);
	printf("String #4, character at -1: '%c' (0x%x)\n",
			[string[4]  charAt:-1], (unsigned)[string[4]  charAt:-1]);
	printf("String #4, character at 0: '%c' (0x%x)\n",
			[string[4]  charAt:0], (unsigned)[string[4]  charAt:0]);
	printf("String #4, character at 1: '%c' (0x%x)\n",
			[string[4]  charAt:1], (unsigned)[string[4]  charAt:1]);
	printf("String #4, character at 5: '%c' (0x%x)\n",
			[string[4]  charAt:5], (unsigned)[string[4]  charAt:5]);
	printf("String #4, character at 50: '%c' (0x%x)\n",
			[string[4]  charAt:50], (unsigned)[string[4]  charAt:50]);
	printf("String #5, character at -1: '%c' (0x%x)\n",
			[string[5]  charAt:-1], (unsigned)[string[5]  charAt:-1]);
	printf("String #5, character at 0: '%c' (0x%x)\n",
			[string[5]  charAt:0], (unsigned)[string[5]  charAt:0]);
	printf("String #5, character at 1: '%c' (0x%x)\n",
			[string[5]  charAt:1], (unsigned)[string[5]  charAt:1]);
	printf("String #7, character at -1: '%c' (0x%x)\n",
			[string[7]  charAt:-1], (unsigned)[string[7]  charAt:-1]);
	printf("String #7, character at 0: '%c' (0x%x)\n",
			[string[7]  charAt:0], (unsigned)[string[7]  charAt:0]);
	printf("String #7, character at 1: '%c' (0x%x)\n",
			[string[7]  charAt:1], (unsigned)[string[7]  charAt:1]);

	// -numOfChar:, -numOfChar:caseSensitive:
	printf("String #4, num of character 's': %d\n",
			[string[4]  numOfChar:'s']);
	printf("String #4, num of character 's' case sense on: %d\n",
			[string[4]  numOfChar:'s' caseSensitive:YES]);
	printf("String #4, num of character 's' case sense off: %d\n",
			[string[4]  numOfChar:'s' caseSensitive:NO]);
	printf("String #4, num of character 'q': %d\n",
			[string[4]  numOfChar:'q']);
	printf("String #4, num of character 'q' case sense on: %d\n",
			[string[4]  numOfChar:'q' caseSensitive:YES]);
	printf("String #4, num of character 'q' case sense off: %d\n",
			[string[4]  numOfChar:'q' caseSensitive:NO]);
	printf("String #4, num of character '<0>': %d\n",
			[string[4]  numOfChar:0]);
	printf("String #4, num of character '<0>'  case sense on: %d\n",
			[string[4]  numOfChar:0 caseSensitive:YES]);
	printf("String #4, num of character '<0>'  case sense off: %d\n",
			[string[4]  numOfChar:0 caseSensitive:NO]);
	printf("String #5, num of character 'q': %d\n",
			[string[5]  numOfChar:'q']);
	printf("String #5, num of character 'q' case sense on: %d\n",
			[string[5]  numOfChar:'q' caseSensitive:YES]);
	printf("String #5, num of character 'q' case sense off: %d\n",
			[string[5]  numOfChar:'q' caseSensitive:NO]);
	printf("String #5, num of character '<0>': %d\n",
			[string[5]  numOfChar:0]);
	printf("String #5, num of character '<0>'  case sense on: %d\n",
			[string[5]  numOfChar:0 caseSensitive:YES]);
	printf("String #5, num of character '<0>'  case sense off: %d\n",
			[string[5]  numOfChar:0 caseSensitive:NO]);
	printf("String #7, num of character 'q': %d\n",
			[string[7]  numOfChar:'q']);
	printf("String #7, num of character 'q' case sense on: %d\n",
			[string[7]  numOfChar:'q' caseSensitive:YES]);
	printf("String #7, num of character 'q' case sense off: %d\n",
			[string[7]  numOfChar:'q' caseSensitive:NO]);
	printf("String #7, num of character '<0>': %d\n",
			[string[7]  numOfChar:0]);
	printf("String #7, num of character '<0>'  case sense on: %d\n",
			[string[7]  numOfChar:0 caseSensitive:YES]);
	printf("String #7, num of character '<0>'  case sense off: %d\n",
			[string[7]  numOfChar:0 caseSensitive:NO]);

	// -numOfChars:, -numOfChars:caseSensitive:
	printf("String #8, num of characters \"rSt\": %d\n",
			[string[8]  numOfChars:"rSt"]);
	printf("String #8, num of characters \"rSt\"  case sense off: %d\n",
			[string[8]  numOfChars:"rSt" caseSensitive:NO]);
	printf("String #8, num of characters \"rSt\"  case sense on: %d\n",
			[string[8]  numOfChars:"rSt" caseSensitive:YES]);
	printf("String #8, num of characters \"I\": %d\n",
			[string[8]  numOfChars:"I"]);
	printf("String #8, num of characters \"I\"  case sense off: %d\n",
			[string[8]  numOfChars:"I" caseSensitive:NO]);
	printf("String #8, num of characters \"I\"  case sense on: %d\n",
			[string[8]  numOfChars:"I" caseSensitive:YES]);
	printf("String #8, num of characters \"x\": %d\n",
			[string[8]  numOfChars:"x"]);
	printf("String #8, num of characters \"x\"  case sense off: %d\n",
			[string[8]  numOfChars:"x" caseSensitive:NO]);
	printf("String #8, num of characters \"x\"  case sense on: %d\n",
			[string[8]  numOfChars:"x" caseSensitive:YES]);
	printf("String #8, num of characters \"\": %d\n",
			[string[8]  numOfChars:""]);
	printf("String #8, num of characters \"\"  case sense off: %d\n",
			[string[8]  numOfChars:"" caseSensitive:NO]);
	printf("String #8, num of characters \"\"  case sense on: %d\n",
			[string[8]  numOfChars:"" caseSensitive:YES]);
	printf("String #8, num of characters \"(NULL)\": %d\n",
			[string[8]  numOfChars:NULL]);
	printf("String #8, num of characters \"(NULL)\"  case sense off: %d\n",
			[string[8]  numOfChars:NULL caseSensitive:NO]);
	printf("String #8, num of characters \"(NULL)\"  case sense on: %d\n",
			[string[8]  numOfChars:NULL caseSensitive:YES]);
	printf("String #5, num of characters \"xy\": %d\n",
			[string[5]  numOfChars:"xy"]);
	printf("String #5, num of characters \"xy\"  case sense off: %d\n",
			[string[5]  numOfChars:"xy" caseSensitive:NO]);
	printf("String #5, num of characters \"xy\"  case sense on: %d\n",
			[string[5]  numOfChars:"xy" caseSensitive:YES]);
	printf("String #5, num of characters \"x\": %d\n",
			[string[5]  numOfChars:"x"]);
	printf("String #5, num of characters \"x\"  case sense off: %d\n",
			[string[5]  numOfChars:"x" caseSensitive:NO]);
	printf("String #5, num of characters \"x\"  case sense on: %d\n",
			[string[5]  numOfChars:"x" caseSensitive:YES]);
	printf("String #5, num of characters \"\": %d\n",
			[string[5]  numOfChars:""]);
	printf("String #5, num of characters \"\"  case sense off: %d\n",
			[string[5]  numOfChars:"" caseSensitive:NO]);
	printf("String #5, num of characters \"\"  case sense on: %d\n",
			[string[5]  numOfChars:"" caseSensitive:YES]);
	printf("String #5, num of characters \"(NULL)\": %d\n",
			[string[5]  numOfChars:NULL]);
	printf("String #5, num of characters \"(NULL)\"  case sense off: %d\n",
			[string[5]  numOfChars:NULL caseSensitive:NO]);
	printf("String #5, num of characters \"(NULL)\"  case sense on: %d\n",
			[string[5]  numOfChars:NULL caseSensitive:YES]);
	printf("String #7, num of characters \"xy\": %d\n",
			[string[7]  numOfChars:"xy"]);
	printf("String #7, num of characters \"xy\"  case sense off: %d\n",
			[string[7]  numOfChars:"xy" caseSensitive:NO]);
	printf("String #7, num of characters \"xy\"  case sense on: %d\n",
			[string[7]  numOfChars:"xy" caseSensitive:YES]);
	printf("String #7, num of characters \"x\": %d\n",
			[string[7]  numOfChars:"x"]);
	printf("String #7, num of characters \"x\"  case sense off: %d\n",
			[string[7]  numOfChars:"x" caseSensitive:NO]);
	printf("String #7, num of characters \"x\"  case sense on: %d\n",
			[string[7]  numOfChars:"x" caseSensitive:YES]);
	printf("String #7, num of characters \"\": %d\n",
			[string[7]  numOfChars:""]);
	printf("String #7, num of characters \"\"  case sense off: %d\n",
			[string[7]  numOfChars:"" caseSensitive:NO]);
	printf("String #7, num of characters \"\"  case sense on: %d\n",
			[string[7]  numOfChars:"" caseSensitive:YES]);
	printf("String #7, num of characters \"(NULL)\": %d\n",
			[string[7]  numOfChars:NULL]);
	printf("String #7, num of characters \"(NULL)\"  case sense off: %d\n",
			[string[7]  numOfChars:NULL caseSensitive:NO]);
 	printf("String #7, num of characters \"(NULL)\"  case sense on: %d\n",
			[string[7]  numOfChars:NULL caseSensitive:YES]);

	// no test available for -stringOrderTable or -setStringOrderTable:

	// -intValue, -floatValue, -doubleValue
	[string[5] setStringValue:"100x300"];
	[string[6] setStringValue:"100.5x300.102"];
	[string[7] setStringValue:"100.x300.102"];
	[string[8] setStringValue:".1x300.102"];
	[string[9] setStringValue:"0.1x300.102"];
	[string[10] setStringValue:".x300.102"];
	for (i=2; i<11; i++) {
		printf("stringValue: \"%s\"\n", [string[i] stringValue]);
		printf("doubleValue: \"%f\"\n", [string[i] doubleValue]);
		printf(" floatValue: \"%f\"\n", [string[i] floatValue]);
		printf("   intValue: \"%i\"\n", [string[i] intValue]);
	}
	
	// -free
	for (i=0; i<MSTRINGS; i++) [string[i] free];
}

// Grab the category testing subroutines.
#include "StringTestComparing.m"
#include "StringTestCompat.m"
#include "StringTestDebugging.m"
#include "StringTestFields.m"
#include "StringTestInsertion.m"
#include "StringTestModification.m"
#include "StringTestNEXTSTEP.m"
#include "StringTestPatterns.m"
#include "StringTestReplacing.m"
#include "StringTestSearching.m"
#include "StringTestSybase.m"
#include "StringTestUNIX.m"

void main()
{	// we step through each source file's methods here, by file.
	// so there is one function per source file, to help keep us organized.
	testMiscString();
	testMiscStringComparing();
	testMiscStringCompat();
	testMiscStringDebugging();
	testMiscStringFields();
	testMiscStringInsertion();
	testMiscStringModification();
	testMiscStringNEXTSTEP();
	testMiscStringPatterns();
	testMiscStringReplacing();
	testMiscStringSearching();
	testMiscStringSybase();
	testMiscStringUNIX();
	exit(0);
}

