float grade = 0.0, tgrade = 0.0;
int pass = 0, tpass = 0;
int fail = 0, tfail = 0;


char* theStrings[] = {"", "a", "ab", "cat", "kitty", "01234567890"};
char* revStrings[] = {"", "a", "ba", "tac", "yttik", "09876543210"};
char* rev2Strings[] = {"", "a", "ba", "tac", "tikty", "21034567890"};
char* rev3Strings[] = {"", "a", "ab", "cta", "ktity", "02134567890"};
char* rev4Strings[] = {"", "a", "ab", "atc", "iktyt", "10234567809"};

char* sortStrings[] = {"", "a", "ab", "act", "iktty", "00123456789"};
char* sort2Strings[] = {"", "a", "ba", "tca", "yttki", "98765432100"};

char* sort3Strings[] = {"", "a", "ab", "cat", "kitty", "01234567890"};
char* sort4Strings[] = {"", "a", "ab", "cat", "kttiy", "09876543210"};

int numStrings = sizeof(theStrings)/sizeof(char*);

char* s = (char*) malloc(1025);
char* t = (char*) malloc(1025);

for(int i=0; i<numStrings; i+=1){
	
	printf("length %3d : \"%s\" \n", (int) strlen(theStrings[i]), theStrings[i]);
	printf("--reverse pass/fail = ");

	strcpy(s,theStrings[i]);
	reverse(s,0,0);
	if( strcmp(s,theStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	reverse(s,4,4);
	if( strcmp(s,theStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}


	strcpy(s,theStrings[i]);
	reverse(s,0,strlen(theStrings[i]) );
	if( strcmp(s,revStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	reverse(s,0, 1000);
	if( strcmp(s,revStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	reverse(s,-3,strlen(theStrings[i]));
	if( strcmp(s,revStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	reverse(s,0,3);
	if( strcmp(s,rev2Strings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	reverse(s,1,3);
	if( strcmp(s,rev3Strings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	reverse(s,1,5);
	reverse(s,1,5);
	if( strcmp(s,theStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	reverse(s,0,2);
	reverse(s,strlen(s)-2,strlen(s));
	if( strcmp(s,rev4Strings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	strcat(s,revStrings[i]);
	strcpy(t,revStrings[i]);
	strcat(t,revStrings[i]);
	reverse(s,0,strlen(theStrings[i]));
	if( strcmp(s,t) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}



	printf(" %d/%d\n", pass, fail);	tpass += pass; tfail += fail; pass = fail = 0;

	///////////////////////////////////////////////

	printf("--sort    pass/fail = ");

	strcpy(s,theStrings[i]);
	sort(s,0,0, Ascending);
	if( strcmp(s,theStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	sort(s,2,2, Ascending);
	if( strcmp(s,theStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	sort(s,2,2, Descending);
	if( strcmp(s,theStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	sort(s,0,strlen(theStrings[i]), Ascending);
	if( strcmp(s,sortStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}
	strcpy(s,theStrings[i]);
	sort(s,0,strlen(theStrings[i]), Descending);
	if( strcmp(s,sort2Strings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	sort(s,-25,strlen(theStrings[i]), Ascending);
	if( strcmp(s,sortStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}
	strcpy(s,theStrings[i]);
	sort(s,-30,strlen(theStrings[i]), Descending);
	if( strcmp(s,sort2Strings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	sort(s,0,strlen(theStrings[i])+100, Ascending);
	if( strcmp(s,sortStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}
	strcpy(s,theStrings[i]);
	sort(s,0,strlen(theStrings[i])+2, Descending);
	if( strcmp(s,sort2Strings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}

	strcpy(s,theStrings[i]);
	sort(s,1,strlen(theStrings[i])-1, Ascending);
	if( strcmp(s,sort3Strings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}
	strcpy(s,theStrings[i]);
	sort(s,1,strlen(theStrings[i])-1, Descending);
	if( strcmp(s,sort4Strings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}





	strcpy(s,theStrings[i]);
	sort(s,0,0, Ascending);
	if( strcmp(s,theStrings[i]) == 0 ) { ++pass; printf("."); }
	else {++fail; printf("x");}



	printf(" %d/%d\n", pass, fail);	tpass += pass; tfail += fail;pass = fail = 0;
	grade = (10.0*tpass)/(tpass+tfail);
	tgrade += grade;
	printf("                            testing grade = %.1f/10\n", grade);
	tpass = tfail = 0;
}

pass = fail = 0;
tpass = tfail = 0;
printf("additional tests:");

strcpy(s,     "0388140389842790188925473988504973585315478523466766666607512437016427513459172049751329063120912290");
sort(s,0,1000, Ascending);
if( strcmp(s, "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999") == 0 ) { ++pass; printf("."); }
else {++fail; printf("x");}

strcpy(s,     "0388140389842790188925473988504973585315478523466766666607512437016427513459172049751329063120912290");
sort(s,0,1000, Ascending);
reverse(s,10,30);
if( strcmp(s, "0000000000222222222211111111113333333333444444444455555555556666666666777777777788888888889999999999") == 0 ) { ++pass; printf("."); }
else {++fail; printf("x");}

strcpy(s,     "0388140389842790188925473988504973585315478523466766666607512437016427513459172049751329063120912290");
sort(s,0,1000, Ascending);
reverse(s,10,30);
sort(s,9,11,Descending);
if( strcmp(s, "0000000002022222222211111111113333333333444444444455555555556666666666777777777788888888889999999999") == 0 ) { ++pass; printf("."); }
else {++fail; printf("x");}

strcpy(s,     "0388140389842790188925473988504973585315478523466766666607512437016427513459172049751329063120912290");
sort(s,0,1000, Ascending);
reverse(s,10,30);
sort(s,9,11,Descending);
reverse(s,95,100);
if( strcmp(s, "0000000002022222222211111111113333333333444444444455555555556666666666777777777788888888889999999999") == 0 ) { ++pass; printf("."); }
else {++fail; printf("x");}

strcpy(s,     "abc0000000000abc0000000000abc0000000000abc0000000000abc1111111111abc111111111abc1111111111abc1111111111abc2222222222abc2222222222");
sort(s,0,1000, Ascending);
//reverse(s,10,30);
//sort(s,9,11,Descending);
if( strcmp(s, "000000000000000000000000000000000000000011111111111111111111111111111111111111122222222222222222222aaaaaaaaaabbbbbbbbbbcccccccccc") == 0 ) { ++pass; printf("."); }
else {++fail; printf("x");}



printf(" %d/%d\n", pass, fail);	
grade = (10.0*pass)/(pass+fail);
tgrade += grade;

printf("                            testing grade = %.1f/10\n", grade);

printf("                                          total grade = %.1f / 70\n", tgrade);
