main(){
	/*getHammingDistance() test cases:*/

	getHammingDistance("AACCTT","GGCCTT"); //return 2
	getHammingDistance("TCGGA","AAAAG"); //returns 5
	getHammingDistance("A","AG"); //error message prompt returns 0

	/*countSubstrPattern() test cases:*/
	countSubstrPattern("AATATATAGG","GG");// returns 1
	countSubstrPattern("AATATATAGG","ATA");// returns 3
	countSubstrPattern("AATATATAGG","ACTGACTGACTG");// returns 0

	/*isValidString() test cases:*/
	isValidString("AAGGCTATGC","ACGT");//returns 1 / true
	isValidString("AAGGCTATGa","ACGT");// returns 0 / false
	isValidString("ACGT","ACGT");// returns 1 / true
	isValidString("ACGT101_","ACGT");// returns 0 / false
	isValidString("091212345","0123456789");// returns 1 / true

	/*getSkew() test cases:*/
	getSkew("GGCCAC", 1);// returns 1
	getSkew("GGCCAC", 2);// returns 2
	getSkew("GGCCAC", 3);// returns 1
	getSkew("GGCCAC", 4);// returns 0
	getSkew("GGCCAC", 5);// returns 0

	/*getMaxSkewN() test cases:*/
	getMaxSkewN("GGCCAC", 1);// returns 1
	getMaxSkewN("GGCCAC", 2);// returns 2
	getMaxSkewN("GGCCAC", 3);// returns 2
	getMaxSkewN("GGCCAC", 4);// returns 2
	getMaxSkewN("GGCCAC", 5);// returns 2

	/*getMinSkewN() test cases:*/
	getMinSkewN("GGCCAC", 1);// returns 1
	getMinSkewN("GGCCAC", 2);// returns 1
	getMinSkewN("GGCCAC", 3);// returns 1
	getMinSkewN("GGCCAC", 4);// returns 0
	getMinSkewN("GGCCAC", 5);// returns 0

}
void getSkewTest(char *str1, int n, int expectedResult) {
    int result = getSkew(str1, n);
     
    printf("getSkew(\"%s\", %i) ", str1, n);
    
    if(result == expectedResult) {
        printf("PASSED\n");
    }
    else {
        printf("FAILED (Expected %i, got %i.)\n", expectedResult, result);
        errorCount++;
    }
}
// x -> [0, 1] (left, right)
// y -> [0, 1] (top, bottom)
// size -> [0, 1] (small -> big)
// skew -> [0, 1] (low, high)
void CalibrationDialog::getParams(const std::vector<cv::Point2f> & corners, const cv::Size & boardSize, const cv::Size & imageSize,
		float & x, float & y, float & size, float & skew)
{
	float area = getArea(corners, boardSize);
	size = std::sqrt(area / (imageSize.width * imageSize.height));
	skew = getSkew(corners, boardSize);
	float meanX = 0.0f;
	float meanY = 0.0f;
	for(unsigned int i=0; i<corners.size(); ++i)
	{
		meanX += corners[i].x;
		meanY += corners[i].y;
	}
	meanX /= corners.size();
	meanY /= corners.size();
	x = meanX / imageSize.width;
	y = meanY / imageSize.height;
}
int main(){
	int choice = 7, result, n;
	char *str1, *str2;
	
	while(choice != 0){	//while user has not chosen to exit the program
		printMenu(&choice);	//calls function printMenu
		
		str1 = (char *)malloc(100*sizeof(char));
		str2 = (char *)malloc(100*sizeof(char));
		
		switch(choice){
			case 1:
				printf("\n*****************************************\n");
				printf("*\t   Get Hamming Distance\t\t*\n");
				printf("*****************************************\n");
				
				printf("\nEnter string 1: ");
				scanf("%s", str1);
				printf("Enter string 2: ");
				scanf("%s", str2);
				//return value of function getHammingDistance stored in result
				result = getHammingDistance(str1, str2);
				
				if(result == 0){	//if the strings have unequal length
					printf("\nError! Strings have unequal length!\n");
					
				}else{	//if the strings have equal length
					printf("\nHamming Distance: %d\n", result);
				}
				
				break;
				
			case 2:
				printf("\n*****************************************\n");
				printf("*\t Count Substring Pattern\t*\n");
				printf("*****************************************\n");
				
				printf("\nEnter original string: ");
				scanf("%s", str1);
				printf("Enter pattern: ");
				scanf("%s", str2);
				//return value of function countSubstrPattern stored in result
				result = countSubstrPattern(str1, str2);
				printf("\nNumber of occurence of pattern in orginal: %d\n", result);
				break;
				
			case 3:
				printf("\n*****************************************\n");
				printf("*\t    Is String Valid\t\t*\n");
				printf("*****************************************\n");
				
				printf("\nEnter alphabet: ");
				scanf("%s", str1);
				printf("Enter string: ");
				scanf("%s", str2);
				//return value of function isValidString stored in result
				result = isValidString(str2, str1);
				
				if(result == 1){
					printf("\nString is valid.\n");
				}else{
					printf("\nString is not valid.\n");
				}
				
				break;
				
			case 4:
				printf("\n*****************************************\n");
				printf("*\t\tGet Skew\t\t*\n");
				printf("*****************************************\n");
				
				printf("\nEnter genome string: ");
				scanf("%s", str1);
				printf("Enter number: ");
				scanf("%d", &n);
				
				if(n > (strlen(str1)+1) || n <= 0){
					printf("\nError! Number must be within string length!\n");
				}else{
					//return value of function getSkew stored in result
					result = getSkew(str1, n);
					printf("\nNumber of G-C: %d\n", result);
				}
				
				break;
				
			case 5:
				printf("\n*****************************************\n");
				printf("*\t  Get Maximum Skew of N\t\t*\n");
				printf("*****************************************\n");
				
				printf("\nEnter genome string: ");
				scanf("%s", str1);
				printf("Enter number: ");
				scanf("%d", &n);
				
				if(n > (strlen(str1)+1) || n <= 0){
					printf("\nError! Number must be within string length!\n");
				}else{
					//return value of function getMaxSkewN stored in result
					result = getMaxSkewN(str1, n);
					printf("\nMaximum Skew: %d\n", result);
				}
				
				break;
				
			case 6:
				printf("\n*****************************************\n");
				printf("*\t  Get Minimum Skew of N\t\t*\n");
				printf("*****************************************\n");
				
				printf("\nEnter genome string: ");
				scanf("%s", str1);
				printf("Enter number: ");
				scanf("%d", &n);
				
				if(n > (strlen(str1)+1) || n <= 0){
					printf("\nError! Number must be within string length!\n");
				}else{
					//return value of function getMinSkewN stored in result
					result = getMinSkewN(str1, n);
					printf("\nMinimum Skew: %d\n", result);
				}
				
				break;
				
			case 0:
				free(str1);
				free(str2);
				printf("\nProgram Terminated...\n");
				break;
				
			default:
				printf("\nInvalid input!\n");
				break;
		}
		
	}
}
main(){
	int x;
	
	printf("getHammingDistance\n");
	x = getHammingDistance("AACCTT","GGCCTT");
	printf("%d\n",x );
	x = getHammingDistance("TCGGA","AAAAG");
	printf("%d\n",x );
	x = getHammingDistance("A","AG");
	printf("%d\n",x );
	
	printf("countSubstrPattern\n");
	x = countSubstrPattern("AATATATAGG","GG");
	printf("%d\n",x);
	x = countSubstrPattern("AATATATAGG","ATA");
	printf("%d\n",x);
	x = countSubstrPattern("AATATATAGG","ACTGACTGACTG");
	printf("%d\n",x);
	
	printf("isValidString\n");
	x = isValidString("AAGGCTATGC","ACGT");
	printf("%d\n",x);
	x = isValidString("AAGGCTATGa","ACGT");
	printf("%d\n",x);
	x = isValidString("ACGT","ACGT");
	printf("%d\n",x);
	x = isValidString("ACGT101_","ACGT");
	printf("%d\n",x);
	x = isValidString("091212345","0123456789");
	printf("%d\n",x);
	
	printf("getSkew\n");
	x = getSkew("GGCCAC", 1);
	printf("%d\n",x );
	x = getSkew("GGCCAC", 2);
	printf("%d\n",x );
	x = getSkew("GGCCAC", 3);
	printf("%d\n",x );
	x = getSkew("GGCCAC", 4);
	printf("%d\n",x );
	x = getSkew("GGCCAC", 5);
	printf("%d\n",x );
	
	printf("getMaxSkewN\n");
	x = getMaxSkewN("GGCCAC", 1);
	printf("%d\n",x );
	x = getMaxSkewN("GGCCAC", 2);
	printf("%d\n",x );
	x = getMaxSkewN("GGCCAC", 3);
	printf("%d\n",x );
	x = getMaxSkewN("GGCCAC", 4);
	printf("%d\n",x );
	x = getMaxSkewN("GGCCAC", 5);
	printf("%d\n",x );
	
	printf("getMinSkewN\n");
	x = getMinSkewN("GGCCAC", 1);
	printf("%d\n",x );
	x = getMinSkewN("GGCCAC", 2);
	printf("%d\n",x );
	x = getMinSkewN("GGCCAC", 3);
	printf("%d\n",x );
	x = getMinSkewN("GGCCAC", 4);
	printf("%d\n",x );
	x = getMinSkewN("GGCCAC", 5);
	printf("%d\n",x );
}