#define NUMSTRINGS 6
#define NUMTESTS 7

int sasc = 0, sdesc = 0;
int ssasc = 0, ssdesc = 0;
int tsasc = 0, tsdesc = 0;
int tssasc = 0, tssdesc = 0;

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


char* theStrings[] = {"ace", "bat", "cat", "dog", "eel", "fog"};
int numStrings = sizeof(theStrings)/sizeof(char*);
//fprintf(stderr,"numStrings=%d", numStrings);

char* asc[NUMTESTS][NUMSTRINGS] = { 
                 {"ace", "bat", "cat", "dog", "eel", "fog"}, 
                 {"ace", "bat", "cat", "dog", "eel", "fog"}, 
                 {"ace", "bat", "cat", "dog", "eel", "fog"}, 
                 {"ace", "bat", "cat", "dog", "eel", "fog"}, 
                 {"ace", "bat", "cat", "dog", "eel", "fog"}, 
                 {"ace", "bat", "cat", "dog", "eel", "fog"},
                 {"ace", "bat", "cat", "dog", "eel", "fog"}
               };

char* asc2[NUMTESTS][NUMSTRINGS] = { 
                 {"ace+", "bat++", "cat+++", "dog++++", "eel+++++", "fog++++++"}, 
                 {"ace+", "bat++", "cat+++", "dog++++", "eel+++++", "fog++++++"}, 
                 {"ace+", "bat++", "cat", "dog", "eel", "fog"}, 
                 {"ace+", "bat++", "cat", "dog", "eel", "fog"},
                 {"ace", "bat", "cat", "dog", "eel", "fog"},
                 {"ace", "bat", "cat+", "dog++", "eel+++", "fog"},
                 {"ace", "bat", "cat", "dog", "eel", "fog"}
                };

char* desc[NUMTESTS][NUMSTRINGS] = {
                 {"fog", "eel", "dog", "cat", "bat", "ace"},
                 {"fog", "eel", "dog", "cat", "bat", "ace"},
                 {"bat", "ace", "cat", "dog", "eel", "fog"},
                 {"bat", "ace", "cat", "dog", "eel", "fog"},
                 {"ace", "bat", "cat", "dog", "eel", "fog"},  
                 {"ace", "bat", "eel", "dog", "cat", "fog"}  ,
                 {"ace", "bat", "cat", "dog", "eel", "fog"}
               };

char* desc2[NUMTESTS][NUMSTRINGS] = {
                 {"fog-", "eel--", "dog---", "cat----", "bat-----", "ace------"},
                 {"fog-", "eel--", "dog---", "cat----", "bat-----", "ace------"},
                 {"bat-", "ace--", "cat", "dog", "eel", "fog"},
                 {"bat-", "ace--", "cat", "dog", "eel", "fog"},
                 {"ace", "bat", "cat", "dog", "eel", "fog"},
                 {"ace", "bat", "eel-", "dog--", "cat---", "fog"},
                 {"ace", "bat", "cat", "dog", "eel", "fog"}  
                };

int tests[NUMTESTS][2] = { {0,numStrings}, {0,10000}, {0,2}, {-2,2} , {3,3}, {2,5}, {4,3} };


char* output[numStrings];
for(int i=0; i<numStrings; i+=1){
   output[i] = (char*) malloc(1025);
}

bool passed=true;

printf("testing:");

for(int test=0; test<NUMTESTS; test+=1){
	for(int i=0; i<numStrings; i+=1){strcpy(output[i],theStrings[i]);}
	sort(output, numStrings, tests[test][0], tests[test][1], Ascending);
	passed=true;
	for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], asc[test][i])==0); /*printf("%s,", output[i]);*/} /*printf("\n")*/;
	//printf("basic sort : Ascending : ");
	if(passed) {printf("."); sasc++;}
	else printf("x");
	tsasc++;

	for(int i=0; i<numStrings; i+=1){strcpy(output[i],theStrings[i]);}
	sortsort(output, numStrings, tests[test][0], tests[test][1], Ascending);
	passed=true;
	for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], asc2[test][i])==0); /*printf("%s,", output[i]);*/} /*printf("\n")*/;
	//printf("basic sort : Ascending : ");
	if(passed) {printf("."); ssasc++;}
	else printf("x");
	tssasc++;

	for(int i=0; i<numStrings; i+=1){strcpy(output[i],theStrings[i]);}
	sort(output, numStrings, tests[test][0], tests[test][1], Descending);
	passed=true;
	for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], desc[test][i])==0); /*printf("%s,%s|", output[i],desc[test][i]);*/}/*printf("\n")*/;
	//printf("basic sort : Descending : ");
	if(passed) {printf("."); sdesc++;}
	else printf("x");
	tsdesc++;

	for(int i=0; i<numStrings; i+=1){strcpy(output[i],theStrings[i]);}
	sortsort(output, numStrings, tests[test][0], tests[test][1], Descending);
	passed=true;
	for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], desc2[test][i])==0); /*printf("%s,%s|", output[i],desc2[test][i]);*/}/*printf("\n")*/;
	//printf("basic sort : Descending : ");
	if(passed) {printf("."); ssdesc++;}
	else printf("x");
	++tssdesc;
}


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

char* theStrings_[] = {"bot", "aat", "aaa", "boz", "act", "boy"};

char* asc_[3][NUMSTRINGS] = { 
										{"aaa", "aat", "act", "bot", "boy", "boz"}
               };

char* asc2_[3][NUMSTRINGS] = { 
										{"aaa+", "aat++", "act+++", "bot++++", "boy+++++", "boz++++++"}
                };

char* desc_[3][NUMSTRINGS] = {
										{"boz", "boy", "bot", "act", "aat", "aaa"}
               };


char* desc2_[3][NUMSTRINGS] = {
										{"boz-", "boy--", "bot---", "act----", "aat-----", "aaa------"}
                };

int tests_[3][2] = { {0,numStrings} };


char* output_[NUMSTRINGS];
for(int i=0; i<NUMSTRINGS; i+=1){
   output_[i] = (char*) malloc(1025);
}

printf("||");

for(int test=0; test<1; test+=1){
	for(int i=0; i<numStrings; i+=1){strcpy(output_[i],theStrings_[i]);}
	sort(output_, numStrings, tests_[test][0], tests_[test][1], Ascending);
	passed=true;
	for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output_[i], asc_[test][i])==0); /*printf("%s,", output[i]);*/} /*printf("\n")*/;
	//printf("basic sort : Ascending : ");
	if(passed) {printf("."); sasc++;}
	else printf("x");
	tsasc++;

	for(int i=0; i<numStrings; i+=1){strcpy(output_[i],theStrings_[i]);}
	sortsort(output_, numStrings, tests_[test][0], tests_[test][1], Ascending);
	passed=true;
	for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output_[i], asc2_[test][i])==0); /*printf("%s,", output[i]);*/} /*printf("\n")*/;
	//printf("basic sort : Ascending : ");
	if(passed) {printf("."); ssasc++;}
	else printf("x");
	tssasc++;

	for(int i=0; i<numStrings; i+=1){strcpy(output_[i],theStrings_[i]);}
	sort(output_, numStrings, tests_[test][0], tests_[test][1], Descending);
	passed=true;
	for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output_[i], desc_[test][i])==0); /*printf("%s,%s|", output[i],desc[test][i]);*/}/*printf("\n")*/;
	//printf("basic sort : Descending : ");
	if(passed) {printf("."); sdesc++;}
	else printf("x");
	tsdesc++;

	for(int i=0; i<numStrings; i+=1){strcpy(output_[i],theStrings_[i]);}
	sortsort(output_, numStrings, tests_[test][0], tests_[test][1], Descending);
	passed=true;
	for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output_[i], desc2_[test][i])==0); /*printf("%s,%s|", output[i],desc2[test][i]);*/}/*printf("\n")*/;
	//printf("basic sort : Descending : ");
		if(passed) {printf("."); ssdesc++;}
	else printf("x");
	++tssdesc;
}

int extra = 0, textra = 0;

char* lastOne[] = { "ax", "ab", "ba", "cs", "aa", "bb"};
for(int i=0; i<6; i+=1) strcpy(output[i],lastOne[i]);
passed = true;
sort(output, numStrings, 1,5,Ascending);
char* out1[] = {"ax", "aa", "ab", "ba", "cs", "bb"};
for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], out1[i])==0);}
if(passed){ extra++; printf(".");}
else printf("x");
textra++;

sortsort(output, numStrings, 0,2,Ascending);
char* out2[] = {"aa+", "ax++", "ab", "ba", "cs", "bb"};
passed = true;
for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], out2[i])==0);}
if(passed){ extra++; printf(".");}
else printf("x");
textra++;

sort(output, numStrings, 1,5,Descending);
char* out3[] = {"aa+", "cs", "ba", "ab", "ax++", "bb"};
passed = true;
for(int i=0; i<numStrings; i+=1){ passed = (strcmp(output[i], out3[i])==0);}
if(passed){ extra++; printf(".");}
else printf("x");
textra++;

sortsort(output, numStrings, 2,6,Ascending);
char* out4[] = {"aa+", "cs", "ab+", "ax++++", "ba+++", "bb++++"};
passed = true;
for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], out4[i])==0);}
if(passed){ extra++; printf(".");}
else printf("x");
textra++;

sortsort(output, numStrings, 1,4,Ascending);
char* out5[] = {"aa+", "ab++", "ax++++++", "cs+++", "ba+++", "bb++++"};
passed = true;
for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], out5[i])==0);}
if(passed){ extra++; printf(".");}
else printf("x");
textra++;

sort(output, numStrings, 0,10,Descending);
char* out6[] = {"cs+++", "bb++++", "ba+++", "ax++++++", "ab++", "aa+"};
passed = true;
for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], out6[i])==0);}
if(passed){ extra++; printf(".");}
else printf("x");
textra++;

sortsort(output, numStrings, 0,10,Ascending);
char* out7[] = {"aa++", "ab++++", "ax+++++++++", "ba+++++++", "bb+++++++++", "cs+++++++++"};
passed = true;
for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], out7[i])==0);}
if(passed){ extra++; printf(".");}
else printf("x");
textra++;

sortsort(output, numStrings, 2,5,Descending);
char* out8[] = {"aa++", "ab++++", "bb+++++++++-", "ba+++++++--", "ax+++++++++---", "cs+++++++++"};
passed = true;
for(int i=0; i<numStrings; i+=1){ passed = passed && (strcmp(output[i], out8[i])==0);}
if(passed){ extra++; printf(".");}
else printf("x");
textra++;










// testing results

printf("\n");
printf("  ascending  tests %d / %d\n", sasc,   tsasc);
printf("  ascending+ tests %d / %d\n", ssasc,  tssasc);
printf(" descending  tests %d / %d\n", sdesc,  tsdesc);
printf("descednding- tests %d / %d\n", ssdesc, tssdesc);
int totalmarks = (sasc+ssasc+sdesc+ssdesc+extra);
int   totaltotal = (tsasc+tssasc+tsdesc+tsdesc+textra);
printf("------------------------------------- total mark   %d / %d\n", 2*totalmarks, 2*totaltotal);  

for(int i=0; i<numStrings; i+=1){
   free(output[i]);
	free(output_[i]);
}
