void test_convertBasedNumberToBase10Number_will_throw_error_when_a_symbol_inside_the_hexadecimal_expression_star_with_0x()
{
	String testTokenizer;
	String *testTokenizer1;
	Error exception;
	testTokenizer.rawString = "0x1@00";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	//Since it is work , c whether work for other symbol
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("0x1@00",errorMessage.rawString);
		TEST_ASSERT_EQUAL(3,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	testTokenizer.rawString = "0x1$00";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("0x1$00",errorMessage.rawString);
		TEST_ASSERT_EQUAL(3,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	testTokenizer.rawString = "0x1=00";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("0x1=00",errorMessage.rawString);
		TEST_ASSERT_EQUAL(3,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
}
void test_convertBasedNumberToBase10Number_will_throw_error_when_a_space_is_inside_the_hexadecimal_expression_star_with_0x()
{
	String testTokenizer;
	String *testTokenizer1;
	Error exception;
	testTokenizer.rawString = "0x1456781 00";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 12;
	
	//Make sure this will work for longer expression.
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("0x1456781 00",errorMessage.rawString);
		TEST_ASSERT_EQUAL(9,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
}
void test_convertBasedNumberToBase10Number_will_convert_hexadecimal_number_starting_with_h()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "h'100'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("256",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(3,testTokenizer1->length);
	free(testTokenizer1);

	//Go with some other longer number.
	testTokenizer.rawString = "h'4875'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 7;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("18549",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(5,testTokenizer1->length);
	free(testTokenizer1);

	//Try some value with integer that exceed 9 
	testTokenizer.rawString = "h'beef'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 7;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("48879",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(5,testTokenizer1->length);
	free(testTokenizer1);

	testTokenizer.rawString = "h'abcdef'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 9;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("11259375",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(8,testTokenizer1->length);
	free(testTokenizer1);
	//*****Error checking tested in test_throwError.c
	
}
void test_convertBasedNumberToBase10Number_will_convert_hexadecimal_number_starting_with_0x()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "0x1234";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("4660",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(4,testTokenizer1->length);
	free(testTokenizer1);

	testTokenizer.rawString = "0xabcd";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("43981",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(5,testTokenizer1->length);
	free(testTokenizer1);

	testTokenizer.rawString = "0x1a2c3b";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 8;	
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("1715259",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(7,testTokenizer1->length);
	free(testTokenizer1);

	testTokenizer.rawString = "0xaaaa";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("43690",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(5,testTokenizer1->length);
	free(testTokenizer1);
	//*****Error checking tested in test_throwError.c
}
void test_convertBasedNumberToBase10Number_will_convert_the_hexadecimal_number_if_it_is_middle_of_the_expression()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "12+o'226'*128";
	testTokenizer.startIndex = 3;
	testTokenizer.length = 13;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("12+150*128",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(3,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(10,testTokenizer1->length);
	free(testTokenizer1);
}
void test_convertBasedNumberToBase10Number_will_convert_the_hexadecimal_number_if_it_is_inside_expression()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "12+h'1234'";
	testTokenizer.startIndex = 3;
	testTokenizer.length = 10;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("12+4660",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(3,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(7,testTokenizer1->length);
	free(testTokenizer1);
}
void test_convertBasedNumberToBase10Number_will_convert_the_number_if_it_is_inside_expression()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "0x1234+12";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 9;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("4660+12",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(7,testTokenizer1->length);
	free(testTokenizer1);
}
void test_convertBasedNumberToBase10Number_will_convert_hexadecimal_number_end_with_h()
{
	String *testTokenizer =malloc(sizeof(String));
	String *testTokenizer1;
	testTokenizer->rawString = "100h";
	testTokenizer->startIndex = 0;
	testTokenizer->length = 4;
	testTokenizer1 = convertBasedNumberToBase10Number(testTokenizer);
	TEST_ASSERT_EQUAL_STRING("256",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(3,testTokenizer1->length);
	free(testTokenizer1);
	free(testTokenizer);
}
void test_convertBasedNumberToBase10Number_will_convert_octal_number_starting_with_o()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "o'100'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("64",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(2,testTokenizer1->length);
	free(testTokenizer1);

	testTokenizer.rawString = "o'4775'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 7;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("2557",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(4,testTokenizer1->length);
	free(testTokenizer1);
	//*****Error checking tested in test_throwError.c
}
void test_convertBasedNumberToBase10Number_will_convert_binary_number_starting_with_b()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "b'100'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("4",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(1,testTokenizer1->length);
	free(testTokenizer1);

	//Go with some other longer number.
	testTokenizer.rawString = "b'101100101'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 12;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("357",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(3,testTokenizer1->length);
	free(testTokenizer1);
	//*****Error checking tested in test_throwError.c
}
void test_convertBasedNumberToBase10Number_will_convert_decimal_number_starting_with_d()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "d'100'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_NOT_NULL(testTokenizer1);
	TEST_ASSERT_EQUAL_STRING("100",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(3,testTokenizer1->length);
	free(testTokenizer1);

	testTokenizer.rawString = "d'1814561'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 10;
	testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	TEST_ASSERT_EQUAL_STRING("1814561",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(7,testTokenizer1->length);
	free(testTokenizer1);
	//*****Error checking tested in test_throwError.c
}
void test_convertBasedNumberToBase10Number_will_convert_bigger_hexadecimal_number_end_with_h()
{	
	String *testTokenizer =malloc(sizeof(String));
	String *testTokenizer1;
	testTokenizer->rawString = "0abcdefh";
	testTokenizer->startIndex = 0;
	testTokenizer->length = 8;
	//Go with some other longer number.
	testTokenizer1 = convertBasedNumberToBase10Number(testTokenizer);
	TEST_ASSERT_EQUAL_STRING("11259375",testTokenizer1->rawString);
	TEST_ASSERT_EQUAL(0,testTokenizer1->startIndex);
	TEST_ASSERT_EQUAL(8,testTokenizer1->length);
	free(testTokenizer1);
	free(testTokenizer);
	
	//*****Error checking tested in test_throwError.c
}
void test_convertBasedNumberToBase10Number_will_throw_error_when_a_space_is_or_other_unwanted_simbol_inside_the_hexadecimal_expression_end_with_h()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "c0ffee h";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 8;
	Error exception;
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("c0ffee h",errorMessage.rawString);
		TEST_ASSERT_EQUAL(6,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	testTokenizer.rawString = "c0ffeekh";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 8;
	
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("c0ffeekh",errorMessage.rawString);
		TEST_ASSERT_EQUAL(6,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	testTokenizer.rawString = "c0ffeek";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 7;
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("c0ffeek",errorMessage.rawString);
		TEST_ASSERT_EQUAL(6,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	testTokenizer.rawString = "c0ffeey";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 7;
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("c0ffeey",errorMessage.rawString);
		TEST_ASSERT_EQUAL(6,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
}
void test_convertBasedNumberToBase10Number_will_throw_error_when_a_space_is_or_other_unwanted_simbol_inside_the_hexadecimal_expression()
{
	String testTokenizer;
	String *testTokenizer1;
	testTokenizer.rawString = "h'1 00'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	Error exception;
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("h'1 00'",errorMessage.rawString);
		TEST_ASSERT_EQUAL(3,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	
	testTokenizer.rawString = "h'1456781 00'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 13;
	//Make sure this will work for longer expression.
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("h'1456781 00'",errorMessage.rawString);
		TEST_ASSERT_EQUAL(9,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	testTokenizer.rawString = "h'1@00'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	//Since it is work , c whether work for other symbol
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("h'1@00'",errorMessage.rawString);
		TEST_ASSERT_EQUAL(3,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	testTokenizer.rawString = "h'1$00'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("h'1$00'",errorMessage.rawString);
		TEST_ASSERT_EQUAL(3,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
	
	testTokenizer.rawString = "h'1=00'";
	testTokenizer.startIndex = 0;
	testTokenizer.length = 6;
	Try
	{
		testTokenizer1 = convertBasedNumberToBase10Number(&testTokenizer);
	}
	Catch(exception)
	{
		TEST_ASSERT_EQUAL(INVALID_EXPRESSION,exception);
		
		// Check the error message been updated or not . 
		TEST_ASSERT_EQUAL_STRING("h'1=00'",errorMessage.rawString);
		TEST_ASSERT_EQUAL(3,errorMessage.position);
		TEST_ASSERT_EQUAL_STRING("Invalid expression ! ",errorMessage.message);
		
	}
}
/*
	This function will generate a string
	
	Input: 
	*expression 					which contain the string(expression)
	
	Output: 
	none
	
	return: 
	Tokenizer 						which pass to the getToken to generate token.
	
	Throw:
	UNDEFINED_IDENTIFIER			if the expression contained undefined identifier
	INVALID_EXPRESSION				if the expression contained invalid expression (not following format)
*/
String *stringCreate(char *expression) {
	int length = strlen(expression);
	String *newString = malloc (sizeof(String));
	char *newRawString = malloc (length+1);
	int tempIndex,stringStartLocation,lengthOfTheIdentifier=0; 
	Token *newToken;
	char name[20];
	Error exception;
	stringCopy(expression, newRawString, 0, length);
	newString->rawString = newRawString;
	newString->startIndex = 0;
	newString->length = strlen(newString->rawString);
	Try
	{
	for(tempIndex=0;tempIndex<=newString->length;tempIndex++)
	{
		
		if (isalpha(newString->rawString[tempIndex])||(newString->rawString[tempIndex])=='.')
		{
				stringStartLocation=tempIndex;
				do
				{
					lengthOfTheIdentifier++;
					tempIndex++;
				}while(isalnum(newString->rawString[tempIndex])||(newString->rawString[tempIndex]=='.'));
				
				stringCopy(newString->rawString,name,stringStartLocation,lengthOfTheIdentifier);
				newToken=(Token*)checkIdentifier(name);
				tempIndex-=lengthOfTheIdentifier+1;
				
				if(newToken==NULL)
				{
					if(name[0]==48||name[0]==98
						||name[0]==100||name[0]==104
						||name[0]==111)
					{
						newString = convertBasedNumberToBase10Number(newString);
						newString->startIndex++;
					}
					else
					{
						newString = getFromListAndUpdate(newString, name);
					}
				}
				else if(newToken!=NULL)
				{
					tempIndex += lengthOfTheIdentifier;
				}
				
				lengthOfTheIdentifier=0;
			
		}
		else
		{
			if(newString->rawString[tempIndex]==48||newString->rawString[tempIndex]==98
				||newString->rawString[tempIndex]==100||newString->rawString[tempIndex]==104
				||newString->rawString[tempIndex]==111)
			{
				newString = convertBasedNumberToBase10Number(newString);

			}
			newString->startIndex++;
		}
	}
	}
	Catch(exception)
	{
		errorMessage.rawString = newString->rawString;
		errorMessage.position = newString->startIndex;
		if(exception == UNDEFINED_IDENTIFIER)
		{
			Throw(UNDEFINED_IDENTIFIER);
		}
		else if(exception == INVALID_EXPRESSION)
		{
			Throw(INVALID_EXPRESSION);
		}
	}
	newString->startIndex=0;
	return newString;
}