/*****************************************************************************************
*                                                                                       *
* COPYRIGHT:                                                                            *
*   (C) Copyright International Business Machines Corporation,  2000                    *
*   Licensed Material - Program-Property of IBM - All Rights Reserved.                  *
*   US Government Users Restricted Rights - Use, duplication, or disclosure             *
*   restricted by GSA ADP Schedule Contract with IBM Corp.                              *
*                                                                                       *
*****************************************************************************************
************************************************************************
*   Date        Name        Description
*   03/17/2000   Madhu        Creation.
************************************************************************/

#include "ittrans.h"
#include "hxuntrts.h"
#include "unicode/utypes.h"
#include "unicode/translit.h"
#include "unicode/hextouni.h"
#include "unicode/unifilt.h"
#include "intltest.h"
#include "cmemory.h"
#include <string.h>
#include <stdio.h>
/*converts a Unicodestring to integer*/
static int32_t getInt(UnicodeString str)
{
	int len=str.length();
	char *alias;
	char *buffer=new char[len+1];
	alias=buffer;
	for(int i=0; i< len; i++){
		*alias=(char)str.charAt(i);
		alias++;
	}
	*alias='\0';
    int32_t result = atoi(buffer);
	return result;
}

//---------------------------------------------
// runIndexedTest
//---------------------------------------------

void HexToUniTransliteratorTest::runIndexedTest( int32_t index, UBool exec, char* &name, char* par )
{
    if (exec) logln((UnicodeString)"TestSuite HexadecimalToUnicode Transliterator API ");
    switch (index) {
     
        case 0: name = "TestConstruction"; if (exec) TestConstruction(); break;
        case 1: name = "TestCloneEqual"; if (exec) TestCloneEqual(); break;
 		case 2: name = "TestPattern"; if (exec) TestPattern(); break;
        case 3: name = "TestSimpleTransliterate"; if (exec) TestSimpleTransliterate(); break;
        case 4: name = "TestTransliterate"; if (exec) TestTransliterate(); break;
        default: name = ""; break; /*needed to end loop*/
    }
}
/**
 * Used by TestConstruction() and TestTransliterate.
 */
class TestHexFilter : public UnicodeFilter {
    virtual UnicodeFilter* clone() const {
        return new TestHexFilter(*this);
    }
    virtual UBool contains(UChar c) const {
       if(c == 0x0061 || c == 0x0063 )
          return FALSE;
       else
          return TRUE;
    }
};
void HexToUniTransliteratorTest::TestConstruction(){
	UErrorCode status=U_ZERO_ERROR;
	logln("Testing the construction HexToUnicodeTransliterator()");
	HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator();
	if(trans1==0){
		errln("HexToUnicodeTransliterator construction failed Error=" + (UnicodeString)u_errorName(status));
		return;
	}
    delete trans1;

	logln("Testing the cosntruction HexToUnicodeTransliterator(pattern, status)");
    UnicodeString pattern("\\\\U+0000abc");
	trans1=new HexToUnicodeTransliterator(pattern, status);
	if(U_FAILURE(status)){
		errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern + "  Error=" + (UnicodeString)u_errorName(status));
		status=U_ZERO_ERROR;
		return;
	}
    delete trans1;

	logln("Testing the construction HexToUnicodeTransliterator(pattern, status) with illegal pattern");
	UnicodeString pattern2("\\X+");
	trans1=new HexToUnicodeTransliterator(pattern2, status);
	if(U_FAILURE(status)){
		logln("OK: HexToUnicodeTransliterator construction for illegal pattern failed, as expected");
		status=U_ZERO_ERROR;
	} else {
		errln("Error: calling the HexToUnicodeTransliterator constructor with illegal pattern should fail");
		delete trans1;
	}

	logln("Testing the construction HexToUnicodeTransliterator(pattern, adoptedFilter, status)");
    trans1=new HexToUnicodeTransliterator(pattern, NULL, status);
	if(U_FAILURE(status)){
		errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status));
		status=U_ZERO_ERROR;
		return;
	}
	logln("Testing the copy construction");
	HexToUnicodeTransliterator *trans1copy=new HexToUnicodeTransliterator(*trans1);
	if(trans1->toPattern() != trans1copy->toPattern() || 
		trans1->getID() != trans1copy->getID() ){
		errln("Copy construction failed");
	}    
	delete trans1copy; 
	delete trans1;

	logln("Testing the construction HexToUnicodeTransliterator(adoptedFilter)");
	
    trans1=new HexToUnicodeTransliterator(new TestHexFilter);
	if(trans1 == 0){
		errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status));
		return;
	}
	logln("Testing the copy construction");
    trans1copy=new HexToUnicodeTransliterator(*trans1);
	if(trans1->getFilter() == NULL || trans1copy->getFilter() == NULL ||
		trans1->toPattern() != trans1copy->toPattern() || 
		trans1->getID() != trans1copy->getID() 	){
		errln("Copy construction failed");
	}
    
	delete trans1copy; 
	delete trans1;
	
}
	
void HexToUniTransliteratorTest::TestCloneEqual(){
	UErrorCode status=U_ZERO_ERROR;
	HexToUnicodeTransliterator *transdefault=new HexToUnicodeTransliterator();
	UnicodeString pattern1("\\U##00");
	UnicodeString pattern2("\\\\uni0000");
	HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, status);
    if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){
		errln("HexToUnicodeTransliterator construction failed");
		status=U_ZERO_ERROR;
		return;
	}
	HexToUnicodeTransliterator *trans2=new HexToUnicodeTransliterator(pattern2, status);
    if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){
		errln("HexToUnicodeTransliterator construction failed");
		status=U_ZERO_ERROR;
		return;
	}

    logln("Testing the clone() API of the HexToUnicodeTransliterator");
	HexToUnicodeTransliterator *transdefaultclone=(HexToUnicodeTransliterator*)transdefault->clone();
	HexToUnicodeTransliterator *trans1clone=(HexToUnicodeTransliterator*)trans1->clone();
	HexToUnicodeTransliterator *trans2clone=(HexToUnicodeTransliterator*)trans2->clone();
	if(transdefault->toPattern() !=  transdefaultclone->toPattern()      || 
		trans1->toPattern() != trans1clone->toPattern()     || 
		trans2->toPattern() != trans2clone->toPattern()     || 
	    transdefault->toPattern() == trans1->toPattern()    || 
		trans1->toPattern() == trans2clone->toPattern()     || 
		trans2->toPattern() == transdefault->toPattern()    ) {
		errln("Error: clone() failed");
	}
	
	logln("Testing the =operator of the HexToUnicodeTransliterator");
    HexToUnicodeTransliterator *transdefaultequal=new HexToUnicodeTransliterator();
    HexToUnicodeTransliterator *trans1equal=new HexToUnicodeTransliterator();
	HexToUnicodeTransliterator *trans2equal=new HexToUnicodeTransliterator();
    *transdefaultequal=*transdefault;
    *trans1equal=*trans1;
    *trans2equal=*trans2;
	if(transdefault->toPattern() != transdefaultequal->toPattern()      ||
		trans1->toPattern() != trans1equal->toPattern()      ||
		trans2->toPattern() != trans2equal->toPattern()      ||
		transdefault->toPattern() == trans1->toPattern()     ||
		trans1->toPattern() == trans2equal->toPattern()      ||
		trans2->toPattern() == transdefault->toPattern()  ) {
		errln("Error: equal() failed");
	}
	if(transdefaultclone->toPattern() != transdefaultequal->toPattern() || 
		trans1equal->toPattern()  != trans1clone->toPattern()  || 	
		trans2clone->toPattern() != trans2equal->toPattern()  ){
			errln("Error: equal() or clone() failed");
	}
    delete transdefaultequal;
    delete trans1equal;
    delete trans2equal;
	delete transdefault;
	delete trans1;
	delete trans2;
}

void HexToUniTransliteratorTest::TestPattern(){
	logln("Testing the applyPattern() and toPattern() API of HexToUnicodeTransliterator");
    UErrorCode status = U_ZERO_ERROR; 
	/*default transliterator has pattern \\u0000*/
	HexToUnicodeTransliterator *transdefault=new HexToUnicodeTransliterator();
    if(transdefault == 0){
		errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status));
		return;
	}
    UnicodeString defaultpattern=transdefault->toPattern();
	
	UnicodeString pattern1("\\\\U+0000", "");
	HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, NULL, status);
	if(U_FAILURE(status) ){
		errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern1);
		status=U_ZERO_ERROR;
		return;
	}
    /*test toPattern() */
	if(transdefault->toPattern() == trans1->toPattern() ||
		transdefault->toPattern() != UnicodeString("\\\\u0000;\\\\U0000;u+0000;U+0000", "") ||
		trans1->toPattern() != pattern1 ){
		errln("Error: toPattern() failed "+ transdefault->toPattern());
	}
    
	/*apply patterns for transdefault*/
	UnicodeString str("abKf");
	expectPattern(*transdefault,  pattern1,  UnicodeString("\\U+0061\\U+0062\\U+004B\\U+0066", ""), str);
	expectPattern(*transdefault,  UnicodeString("\\U##00,", ""), UnicodeString("U61,U62,U4B,U66,", ""), str);
	expectPattern(*transdefault, defaultpattern, UnicodeString("\\u0061\\u0062\\u004B\\u0066", ""),  str);
	expectPattern(*trans1, UnicodeString("\\uni0000", ""),  UnicodeString("uni0061uni0062uni004Buni0066", ""),  str);
	expectPattern(*trans1, UnicodeString("\\\\S-0000-E", ""), UnicodeString("\\S-0061-E\\S-0062-E\\S-004B-E\\S-0066-E", ""),  str);
	expectPattern(*trans1, UnicodeString("\\u##0000", ""), UnicodeString("\\u##0061\\u##0062", ""), "FAIL");
	expectPattern(*trans1, UnicodeString("\\*0000", ""),  UnicodeString("*0061*0062*004B*0066", ""),  str); 
	expectPattern(*trans1, UnicodeString("\\u####", ""), UnicodeString("\\u##0061\\u##0062", ""), "FAIL");

	delete trans1;
	delete transdefault;

}
void HexToUniTransliteratorTest::TestSimpleTransliterate(){
	logln("Testing the handleTransliterate() API of HexToUnicodeTransliterator");
	UErrorCode status=U_ZERO_ERROR;
	UnicodeString pattern1("\\\\U+0000", "");
	HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, NULL, status);
	if(U_FAILURE(status)){
		errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern1 + "Error: " + (UnicodeString)u_errorName(status));
		status=U_ZERO_ERROR;
		return;
	}
	UnicodeString source("He\\U+006C\\U+006C\\U+006F", "");
	UnicodeString rsource(source);
	UTransPosition index={1, source.length(),2,source.length()};
	UnicodeString expected("Hello");
	trans1->handleTransliterate(rsource, index, FALSE);
	expectAux(trans1->getID() + ":handleTransliterator ", source + "-->" + rsource, rsource==expected, expected);
    expect(*trans1, "", UnicodeString("\\U+0048\\U+0065\\U+006C\\U+006C\\U+006F", ""), expected);
	delete trans1;

	HexToUnicodeTransliterator *trans2=new HexToUnicodeTransliterator(new TestHexFilter);
	expect(*trans2, "with Filter(0x0061, 0x0063) ", CharsToUnicodeString("\\u0061\\u0062\\u0063"),
		CharsToUnicodeString("\\u0061b\\u0063") );
	delete trans2;

}
void HexToUniTransliteratorTest::TestTransliterate(){
    UErrorCode status=U_ZERO_ERROR;
	UnicodeString Data[]={
		//pattern, source, index.contextStart, index.contextLimit, index.start, expectedResult,
		UnicodeString("U+##00", ""),    UnicodeString("abU+63", ""), "1", "7", "2",  UnicodeString("abc", ""), 	
		UnicodeString("\\\\u0000", ""), UnicodeString("a\\u0062c", ""), "1", "7", "1",  UnicodeString("abc", ""), 
		UnicodeString("Uni0000", ""),   UnicodeString("abUni0063", ""), "1", "9", "2",  UnicodeString("abc", ""), 
		UnicodeString("U[0000]", ""),   UnicodeString("heU[006C]U[006C]o", ""), "0", "16", "2", UnicodeString("hello", ""), 
		UnicodeString("prefix-0000-suffix", ""), UnicodeString("aprefix-0062-suffixprefix-0063-suffix", ""), "1", "39", "1", UnicodeString("abc", ""), 
		UnicodeString("*##00*", ""),    UnicodeString("hell*6F**74**68**65*re", ""),  "1", "20", "4", UnicodeString("hellothere", ""), 
	
	};
	int i;
	for(i=0;i<sizeof(Data)/sizeof(Data[0]);i=i+6){
			HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(Data[i+0], NULL, status);
				if(U_FAILURE(status)){
				errln("HexToUnicodeTransliterator construction failed with pattern =" + Data[i+0]);
				status=U_ZERO_ERROR;
				continue;
			}
			expectTranslit(*trans1, "", Data[i+1], getInt(Data[i+2]), getInt(Data[i+3]), getInt(Data[i+4]), Data[i+5] );
			delete trans1;
		    	       
	}
			
	
}

//======================================================================
// Support methods
//======================================================================

void HexToUniTransliteratorTest::expectTranslit(const HexToUnicodeTransliterator& t,
												const UnicodeString& message,
												const UnicodeString& source, 
												int32_t start, int32_t limit, int32_t cursor,
												const UnicodeString& expectedResult){
    

	UTransPosition _index={start, limit, cursor, limit};
    UTransPosition index;
    uprv_memcpy(&index, &_index, sizeof(index));
   	UnicodeString rsource(source);
	t.handleTransliterate(rsource, index, FALSE);
	expectAux(t.getID() + ":handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource, rsource==expectedResult, expectedResult);
    
	UnicodeString rsource2(source);
    uprv_memcpy(&index, &_index, sizeof(index));
	t.handleTransliterate(rsource2, index, TRUE);
	expectAux(t.getID() + ":handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
   
    /*ceates a copy constructor and checks the transliteration*/
	HexToUnicodeTransliterator *copy=new HexToUnicodeTransliterator(t);
	rsource2.remove();
	rsource2.append(source);
    uprv_memcpy(&index, &_index, sizeof(index));
	copy->handleTransliterate(rsource2, index, FALSE);
	expectAux(t.getID() + "COPY:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
    
	rsource2.remove();
	rsource2.append(source);
    uprv_memcpy(&index, &_index, sizeof(index));
	copy->handleTransliterate(rsource2, index, TRUE);
	expectAux(t.getID() + "COPY:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
    delete copy;

	/*creates a clone and tests transliteration*/
	HexToUnicodeTransliterator *clone=(HexToUnicodeTransliterator*)t.clone();
	rsource2.remove();
	rsource2.append(source);
    uprv_memcpy(&index, &_index, sizeof(index));
	clone->handleTransliterate(rsource2, index, FALSE);
	expectAux(t.getID() + "CLONE:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
    
	rsource2.remove();
	rsource2.append(source);
    uprv_memcpy(&index, &_index, sizeof(index));
	clone->handleTransliterate(rsource2, index, TRUE);
	expectAux(t.getID() + "CLONE:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
   
	/*Uses the assignment operator to create a transliterator and tests transliteration*/
	HexToUnicodeTransliterator equal=t;
	rsource2.remove();
	rsource2.append(source);
    uprv_memcpy(&index, &_index, sizeof(index));
	equal.handleTransliterate(rsource2, index, FALSE);
	expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
    
	rsource2.remove();
	rsource2.append(source);
    uprv_memcpy(&index, &_index, sizeof(index));
	equal.handleTransliterate(rsource2, index, TRUE);
	expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult);
   

}


void HexToUniTransliteratorTest::expectPattern(HexToUnicodeTransliterator& t,
												const UnicodeString& pattern, 
												const UnicodeString& source, 
												const UnicodeString& expectedResult){
    UErrorCode status=U_ZERO_ERROR; 
	t.applyPattern(pattern, status);
	if(expectedResult == "FAIL"){
		if(U_FAILURE(status)){
			logln("OK: calling applyPattern() with illegal pattern failed as expected. Error=" + (UnicodeString)u_errorName(status));
			status=U_ZERO_ERROR;
			return;
		}
	}
    else{
		if(U_FAILURE(status)){
			errln("Error: applyPattern() failed with pattern =" + pattern + "--->" + (UnicodeString)u_errorName(status));
			return;
		}else {
			if(t.toPattern() != pattern) {
				errln("Error: applyPattern or toPatten failed.  Expected: " + pattern + "Got: " + t.toPattern());
			}
			else{
				logln("OK: applyPattern passed. Testing transliteration");
				expect(t, " with pattern "+pattern, source, expectedResult);
			}
		}
	}
		
}
void HexToUniTransliteratorTest::expect(const HexToUnicodeTransliterator& t,
								 const UnicodeString& message,
                                const UnicodeString& source,
                                const UnicodeString& expectedResult) {
    
    UnicodeString rsource(source);
    t.transliterate(rsource);
    expectAux(t.getID() + ":Replaceable " + message, source + "->" + rsource, rsource==expectedResult, expectedResult);

	// Test handleTransliterate (incremental) transliteration -- 
    rsource.remove();
	rsource.append(source);
    UTransPosition index={0,source.length(),0,source.length()};
	t.handleTransliterate(rsource, index, TRUE);
	expectAux(t.getID() + ":handleTransliterate " + message, source + "->" + rsource, rsource==expectedResult, expectedResult);


}
void HexToUniTransliteratorTest::expectAux(const UnicodeString& tag,
                                   const UnicodeString& summary, UBool pass,
                                   const UnicodeString& expectedResult) {
    if (pass) {
        logln(UnicodeString("(")+tag+") " + prettify(summary));
    } else {
        errln(UnicodeString("FAIL: (")+tag+") "
              + prettify(summary)
              + ", expected " + prettify(expectedResult));
    }
}



