/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 2000, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/
/************************************************************************
*   Date        Name        Description
*   1/03/2000   Madhu        Creation.
************************************************************************/

#include "ittrans.h"
#include "transapi.h"
#include "unicode/utypes.h"
#include "unicode/translit.h"
#include "unicode/rbt.h"
#include "unicode/unifilt.h"
#include "unicode/cpdtrans.h"
#include "unicode/nultrans.h"
#include <string.h>
#include <stdio.h>
#include "unicode/rep.h"

int32_t getInt(UnicodeString str)
{
    char buffer[20];
	int len=str.length();
    if(len>=20) {
        len=19;
    }
    str.extract(0, len, buffer, "");
    buffer[len]=0;
	return atoi(buffer);
}

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

void TransliteratorAPITest::runIndexedTest( int32_t index, UBool exec, char* &name, char* par )
{
    if (exec) logln((UnicodeString)"TestSuite Transliterator API ");
    switch (index) {
     
        case 0: name = "TestgetInverse"; if (exec) TestgetInverse(); break;
        case 1: name = "TestgetID"; if (exec) TestgetID(); break;
		case 2: name = "TestGetDisplayName"; if (exec) TestGetDisplayName(); break;
        case 3: name = "TestTransliterate1"; if (exec) TestTransliterate1(); break;
        case 4: name = "TestTransliterate2"; if (exec) TestTransliterate2(); break;
        case 5: name = "TestTransliterate3"; if (exec) TestTransliterate3(); break;
        case 6: name = "TestSimpleKeyboardTransliterator"; if (exec) TestSimpleKeyboardTransliterator(); break;
        case 7: name = "TestKeyboardTransliterator1"; if (exec) TestKeyboardTransliterator1(); break;
        case 8: name = "TestKeyboardTransliterator2"; if (exec) TestKeyboardTransliterator2(); break;
        case 9: name = "TestKeyboardTransliterator3"; if (exec) TestKeyboardTransliterator3(); break;
		case 10: name = "TestGetAdoptFilter"; if (exec) TestGetAdoptFilter(); break;
		case 11: name = "TestClone"; if (exec) TestClone(); break;
        case 12: name = "TestNullTransliterator"; if (exec) TestNullTransliterator(); break;
                 
        default: name = ""; break; /*needed to end loop*/
    }
}


void TransliteratorAPITest::TestgetID() {
         UnicodeString trans="Latin-Greek";
		 UnicodeString ID;
	     Transliterator* t= Transliterator::createInstance(trans);
		 if(t==0)
			 errln("FAIL: construction");
		 else{
		 ID= t->getID();
         if( ID != trans)
            errln("FAIL: getID returned " + ID + " instead of Latin-Greek");
		 }
		
         for (int i=0; i<Transliterator::countAvailableIDs(); i++){
			ID = (UnicodeString) Transliterator::getAvailableID(i);
            t = Transliterator::createInstance(ID);
			if(t == 0){
				errln("FAIL: " + ID);
				continue;
			}
            if(ID != t->getID())
                errln("FAIL: getID() returned " + t->getID() + " instead of " + ID);
         }
		 delete t;

		 
		 Transliterator* t1=Transliterator::createInstance("Latin-Devanagari");
		 Transliterator* t2=Transliterator::createInstance("Latin-Hebrew");
		 if(t1 ==0 || t2 == 0){
			 errln("FAIL: construction");
			 return;
		 }
		 Transliterator* t3=t1->clone();
		 Transliterator* t4=t2->clone();

		 if(t1->getID() != t3->getID() || t2->getID() != t4->getID() || 
			 t1->getID() == t4->getID() || t2->getID() == t3->getID() || 
			 t1->getID()== t4->getID() )
				errln("FAIL: getID or clone failed");

         

		 Transliterator* t5=Transliterator::createInstance("Latin-Devanagari");
		 if(t5 == 0)
			 errln("FAIL: construction");
		 if(t1->getID() != t5->getID() || t5->getID() != t3->getID() || t1->getID() != t3->getID())
			 errln("FAIL: getID or clone failed");
			 

		 delete t1;
		 delete t2;
         delete t3;
         delete t4;
		 delete t5;
		 

 }
void TransliteratorAPITest::TestgetInverse() {
         Transliterator* t1    = Transliterator::createInstance("Kana-Latin");
         Transliterator* invt1 = Transliterator::createInstance("Latin-Kana");
         Transliterator* t2    = Transliterator::createInstance("Latin-Devanagari");
         Transliterator* invt2 = Transliterator::createInstance("Devanagari-Latin");
         if(t1 == 0 || invt1 == 0 || t2 == 0 || invt2 == 0) {
             errln("FAIL: in instantiation");
			 return;
         }

         Transliterator* inverse1=t1->createInverse();
         Transliterator* inverse2=t2->createInverse();
         if(inverse1->getID() != invt1->getID() || inverse2->getID() != invt2->getID()
            || inverse1->getID() == invt2->getID() || inverse2->getID() == invt1->getID() ) 
            errln("FAIL: getInverse() ");

         UnicodeString TransID[]={
           "Halfwidth-Fullwidth",
           "Fullwidth-Halfwidth",
           "Greek-Latin" ,
           "Latin-Greek", 
           "Arabic-Latin",
           "Latin-Arabic",
           "Kana-Latin",
           "Latin-Kana",
           "Hebrew-Latin",
           "Latin-Hebrew",
           "Cyrillic-Latin", 
           "Latin-Cyrillic", 
           "Devanagari-Latin", 
           "Latin-Devanagari", 
           "Unicode-Hex",
           "Hex-Unicode"
         };
         for(int i=0; i<sizeof(TransID)/sizeof(TransID[0]); i=i+2){
			 t1=Transliterator::createInstance(TransID[i]);
			 if(t1 == 0){
               errln("FAIL: in instantiation for" + TransID[i]);
			   continue;
			 }
             inverse1=t1->createInverse();
             if(inverse1->getID() != TransID[i+1] )
                 errln("FAIL :getInverse() for " + TransID[i] + " returned " + inverse1->getID() + " instead of " + TransID[i+1]);
         }
         delete t1;
		 delete t2;
		 delete invt1;
		 delete invt2;
   
 }
void TransliteratorAPITest::TestClone(){
    Transliterator *t1, *t2, *t3, *t4;
	t1=Transliterator::createInstance("Latin-Devanagari");
	t2=Transliterator::createInstance("Latin-Hebrew");
	if(t1 == 0 || t2 == 0){
		errln("FAIL: construction");
		return;
	}
	t3=t1->clone();
	t4=t2->clone();

	if(t1->getID() != t3->getID() || t2->getID() != t4->getID() )
		errln("FAIL: clone or getID failed");
	if(t1->getID()==t4->getID() || t2->getID()==t3->getID() ||  t1->getID()==t4->getID())
		errln("FAIL: clone or getID failed");
     
	delete t1;
	delete t2;

}

void TransliteratorAPITest::TestGetDisplayName() {
    UnicodeString dispNames[]= { 
             //ID, displayName
              "CurlyQuotes-StraightQuotes" ,"CurlyQuotes to StraightQuotes",
              "Unicode-Hex"                ,"Unicode to Hex Escape",
              "Halfwidth-Fullwidth"        ,"Halfwidth to Fullwidth" ,
              "Latin-Arabic"               ,"Latin to Arabic"      ,
              "Latin-Devanagari"           ,"Latin to Devanagari"  ,
              "Greek-Latin"                ,"Greek to Latin"       ,
              "Arabic-Latin"               ,"Arabic to Latin"      ,
              "Hex-Unicode"                ,"Hex Escape to Unicode",
              "Cyrillic-Latin"             ,"Cyrillic to Latin"    ,
              "Latin-Greek"                ,"Latin to Greek"       ,
              "Latin-Kana"                 ,"Latin to Kana"        ,
              "Latin-Hebrew"               ,"Latin to Hebrew"      ,
              "Kana-Latin"                 ,"Kana to Latin"        
          };
        UnicodeString name="";
		Transliterator* t;
		UnicodeString message;
        for (int32_t i=0; i<sizeof(dispNames)/sizeof(dispNames[0]); i=i+2 ) {
            t = Transliterator::createInstance(dispNames[i+0]);
			if(t==0){
			 errln("FAIL: construction: " + dispNames[i+0]);
			 continue;
			}
			t->getDisplayName(t->getID(), name);
            message="Display name for ID:" + t->getID();
            doTest(message, name, dispNames[i+1]);
            name=""; 
		    t->getDisplayName(t->getID(), Locale::US, name);
			message.remove();
			message.append("Display name for on english locale ID:");
			message.append(t->getID());
		//	message="Display name for on english locale ID:" + t->getID();
		    doTest(message, name, dispNames[i+1]);
			name="";
			
        }

delete t;
   

} 

void TransliteratorAPITest::TestTransliterate1(){

	     
         UnicodeString Data[]={ 
             //ID, input string, transliterated string
             "Unicode-Hex",         "hello",                               "\\u0068\\u0065\\u006C\\u006C\\u006F" ,
             "Hex-Unicode",         "\\u0068\\u0065\\u006C\\u006C\\u006F", "hello"  ,
             "Latin-Devanagari",    "bhaarata",                            CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924") ,
             "Devanagari-Latin",    CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"),        "bhaarata" ,
         //  "Contracted-Expanded", CharsToUnicodeString("\\u00C0\\u00C1\\u0042"),               CharsToUnicodeString("\\u0041\\u0300\\u0041\\u0301\\u0042") ,
         //  "Expanded-Contracted", CharsToUnicodeString("\\u0041\\u0300\\u0041\\u0301\\u0042"), CharsToUnicodeString("\\u00C0\\u00C1\\u0042") ,
             "Latin-Arabic",        "aap",                                 CharsToUnicodeString("\\u0627\\u06A4")     ,
             "Arabic-Latin",        CharsToUnicodeString("\\u0627\\u06A4"),                      "aap" 
         };
                  
       
         UnicodeString gotResult;
		 UnicodeString temp;
		 UnicodeString message;
         Transliterator* t;
         logln("Testing transliterate");
        
         for(int i=0;i<sizeof(Data)/sizeof(Data[0]); i=i+3){
			t=Transliterator::createInstance(Data[i+0]);
            if(t==0){
			 errln("FAIL: construction: " + Data[i+0]);
			 continue;
			}
            gotResult = Data[i+1];
            t->transliterate(gotResult);
			message=t->getID() + "->transliterate(UnicodeString, UnicodeString) for\n\t Source:" + Data[i+1];
            doTest(message, gotResult, Data[i+2]);

            //doubt here
            temp=Data[i+1];
            t->transliterate(temp);
            message.remove();
            message.append(t->getID());
            message.append("->transliterate(Replaceable) for \n\tSource:");
            message.append(Data[i][1]);
            doTest(message, temp, Data[i+2]);
			
         }
		 delete t;

         
}
void TransliteratorAPITest::TestTransliterate2(){
         //testing tranliterate(String text, int start, int limit, StringBuffer result)
       UnicodeString Data2[]={
             //ID, input string, start, limit, transliterated string
             "Unicode-Hex",         "hello! How are you?",  "0", "5", "\\u0068\\u0065\\u006C\\u006C\\u006F", "\\u0068\\u0065\\u006C\\u006C\\u006F! How are you?" ,
             "Unicode-Hex",         "hello! How are you?",  "7", "12", "\\u0048\\u006F\\u0077\\u0020\\u0061", "hello! \\u0048\\u006F\\u0077\\u0020\\u0061re you?",
             "Hex-Unicode",         CharsToUnicodeString("\\u0068\\u0065\\u006C\\u006C\\u006F\\u0021\\u0020"), "0", "5",  "hello", "hello! "  ,
           //  "Contracted-Expanded", CharsToUnicodeString("\\u00C0\\u00C1\\u0042"),        "1", "2",  CharsToUnicodeString("\\u0041\\u0301"), CharsToUnicodeString("\\u00C0\\u0041\\u0301\\u0042") ,
             "Devanagari-Latin",    CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), "0", "1",  "bha", CharsToUnicodeString("bha\\u093E\\u0930\\u0924") ,
             "Devanagari-Latin",    CharsToUnicodeString("\\u092D\\u093E\\u0930\\u0924"), "1", "2",  "aa", CharsToUnicodeString("\\u092Daa\\u0930\\u0924")  

         };
         logln("\n   Testing transliterate(String, int, int, StringBuffer)");
         Transliterator* t;
         UnicodeString gotResBuf;
		 UnicodeString temp;
         int32_t start, limit;
         for(int32_t i=0; i<sizeof(Data2)/sizeof(Data2[0]); i=i+6){
             t=Transliterator::createInstance(Data2[i+0]);
             if(t==0){
			 errln("FAIL: construction: " + Data2[i+0]);
			 continue;
			 }
		     start=getInt(Data2[i+2]);
			 limit=getInt(Data2[i+3]);
             Data2[i+1].extractBetween(start, limit, gotResBuf);
             t->transliterate(gotResBuf);
			 //  errln("FAIL: calling transliterate on " + t->getID());
             doTest(t->getID() + ".transliterate(UnicodeString, int32_t, int32_t, UnicodeString):(" + start + "," + limit + ")  for \n\t source: " + Data2[i+1], gotResBuf, Data2[i+4]);
          
             temp=Data2[i+1];
			 t->transliterate(temp, start, limit);
			 doTest(t->getID() + ".transliterate(Replaceable, int32_t, int32_t, ):(" + start + "," + limit + ")  for \n\t source: " + Data2[i+1], temp, Data2[i+5]);
         }

         
         logln("\n   Try calling transliterate with illegal start and limit values");
         t=Transliterator::createInstance("Unicode-Hex");
         gotResBuf = temp = "try start greater than limit";
         t->transliterate(gotResBuf, 10, 5);
         if(gotResBuf == temp)
              logln("OK: start greater than limit value handled correctly");
		  else
		 	   errln("FAIL: start greater than limit value returned" + gotResBuf);
        
		 delete t; 


}
void TransliteratorAPITest::TestTransliterate3(){
         UnicodeString rs="This is the replaceable String";
         UnicodeString Data[] = {
             "0",  "0",  "This is the replaceable String",
             "2",  "3",  "Th\\u0069s is the replaceable String",
             "21", "23", "Th\\u0069s is the repl\\u0061\\u0063eable String",
             "14", "17", "Th\\u0069s is t\\u0068\\u0065\\u0020repl\\u0061\\u0063eable String",
             
         };
         int start, limit;
		 UnicodeString message;
		 Transliterator *t=Transliterator::createInstance("Unicode-Hex");
		 if(t == 0)
			 errln("FAIL : construction");
         for(int i=0; i<sizeof(Data)/sizeof(Data[0]); i=i+3){
             start=getInt(Data[i+0]);
             limit=getInt(Data[i+1]);
             t->transliterate(rs, start, limit);
			 message=t->getID() + ".transliterate(ReplaceableString, start, limit):("+start+","+limit+"):";
             doTest(message, rs, Data[i+2]); 
         }
}

void TransliteratorAPITest::TestSimpleKeyboardTransliterator(){
         logln("simple call to transliterate");
		 UErrorCode status=U_ZERO_ERROR;
         Transliterator* t=Transliterator::createInstance("Unicode-Hex");
		 if(t == 0)
			 errln("FAIL : construction");
         UTransPosition index={19,20,20,20};
         UnicodeString rs= "Transliterate this-''";
         UnicodeString insertion="abc";
         UnicodeString expected="Transliterate this-'\\u0061\\u0062\\u0063'";
         t->transliterate(rs, index, insertion, status);
         if(U_FAILURE(status))
			 errln("FAIL: " + t->getID()+ ".translitere(Replaceable, int[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
         t->finishTransliteration(rs, index);
		 UnicodeString message="transliterate";
		 doTest(message, rs, expected);
          
         logln("try calling transliterate with invalid index values");
         UTransPosition index1[]={
             //START, LIMIT, CURSOR
             {10, 10, 12, 10},   //invalid since CURSOR>LIMIT valid:-START <= CURSOR <= LIMIT
             {17, 16, 17, 17},   //invalid since START>LIMIT valid:-0<=START<=LIMIT
             {-1, 16, 14, 16},   //invalid since START<0
             {3,  50, 2,  50}    //invalid since LIMIT>text.length()
         };
         for(int i=0; i<sizeof(index1)/sizeof(index1[0]); i++){
           status=U_ZERO_ERROR;
           t->transliterate(rs, index1[i], insertion, status);
           if(status == U_ILLEGAL_ARGUMENT_ERROR)
			   logln("OK: invalid index values handled correctly");
           else
			   errln("FAIL: invalid index values didn't throw U_ILLEGAL_ARGUMENT_ERROR throw" + (UnicodeString)u_errorName(status));
         }

		 delete t;
} 
void TransliteratorAPITest::TestKeyboardTransliterator1(){
        UnicodeString Data[]={
            //insertion, buffer
            "a",   "\\u0061"                                           ,
            "bbb", "\\u0061\\u0062\\u0062\\u0062"                      ,
            "ca",  "\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061"        ,
            " ",   "\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061\\u0020" ,
            "",  "\\u0061\\u0062\\u0062\\u0062\\u0063\\u0061\\u0020"   ,
			
			"a",   "\\u0061"                                           ,
			"b",   "\\u0061\\u0062"                                    ,
			"z",   "\\u0061\\u0062\\u007A"                             ,
			"",    "\\u0061\\u0062\\u007A"                              

        };
		Transliterator* t=Transliterator::createInstance("Unicode-Hex");
        //keyboardAux(t, Data);
		UTransPosition index={0, 0, 0, 0};
	    UErrorCode status=U_ZERO_ERROR;
        UnicodeString s;
	int i;
        logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");
        for (i=0; i<10; i=i+2) {
           UnicodeString log;
           if (Data[i+0] != "") {
               log = s + " + " + Data[i+0] + " -> ";
               t->transliterate(s, index, Data[i+0], status);
               if(U_FAILURE(status)){
                   errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
				   continue;
			   }
           }else {
               log = s + " => ";
               t->finishTransliteration(s, index);
           }
		   // Show the start index '{' and the cursor '|'
           displayOutput(s, Data[i+1], log, index);
               
        }
        
		s="";
		status=U_ZERO_ERROR;
        index.contextStart = index.contextLimit = index.start = index.limit = 0;
		logln("Testing transliterate(Replaceable, int32_t, UChar, UErrorCode)");
		for(i=10; i<sizeof(Data)/sizeof(Data[0]); i=i+2){
			UnicodeString log;
             if (Data[i+0] != "") {
               log = s + " + " + Data[i+0] + " -> ";
               UChar c=Data[i+0].charAt(0);
               t->transliterate(s, index, c, status);
               if(U_FAILURE(status))
                   errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UChar, UErrorCode)-->" + (UnicodeString)u_errorName(status));
			       continue;
			 }else {
               log = s + " => ";
               t->finishTransliteration(s, index);
			 }
		    // Show the start index '{' and the cursor '|'
            displayOutput(s, Data[i+1], log, index); 
		}

       delete t;
}
void TransliteratorAPITest::TestKeyboardTransliterator2(){
          UnicodeString Data[]={
             //insertion, buffer, index[START], index[LIMIT], index[CURSOR]
             //data for Unicode-Hex
             "abc",    "Initial String: add-\\u0061\\u0062\\u0063-",                     "19", "20", "20",
             "a",      "In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-",        "2",  "3",  "2" ,
             "b",      "\\u0062In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", "0",  "0",  "0" ,
             "",     "\\u0062In\\u0069\\u0061tial String: add-\\u0061\\u0062\\u0063-", "0",  "0",  "0" ,
             //data for Latin-Devanagiri
             "aa",     CharsToUnicodeString("Hindi -\\u0906-"),                    "6",  "7",  "6",
             "maa",    CharsToUnicodeString("Hindi -\\u0906\\u092E\\u093E-"),        "7",  "8",  "7",
             "raa",    CharsToUnicodeString("Hi\\u0930\\u093Endi -\\u0906\\u092E\\u093E-"),        "1", "2", "2",
             "",       CharsToUnicodeString("Hi\\u0930\\u093Endi -\\u0906\\u092E\\u093E-"),        "1", "2", "2"
             //data for contracted-Expanded
          //   CharsToUnicodeString("\\u00C1"), CharsToUnicodeString("Ad\\u0041\\u0301d here:"),             "1",  "2",  "1" ,
          //   CharsToUnicodeString("\\u00C0"), CharsToUnicodeString("Ad\\u0041\\u0301d here:\\u0041\\u0300"), "11", "11", "11",
          //   "",     CharsToUnicodeString("Ad\\u0041\\u0301d here:\\u0041\\u0300"), "11", "11", "11",
         };
        Transliterator *t;
        UnicodeString rs;
        UnicodeString dataStr;
		logln("Testing transliterate(Replaceable, int32_t, UnicodeString, UErrorCode)");       
        
		rs="Initial String: add--";
        t=Transliterator::createInstance("Unicode-Hex");
		if(t == 0)
			errln("FAIL : construction");
        else {
		    keyboardAux(t, Data, rs, 0, 20);
            delete t;
        }

        rs="Hindi --";
		t=Transliterator::createInstance("Latin-Devanagari");
		if(t == 0)
			errln("FAIL : construction");
        else
            keyboardAux(t, Data, rs, 20, 40);

		
      //  rs="Add here:";
     //   t=Transliterator::createInstance("Contracted-Expanded");
     //   keyboardAux(t, Data, rs, 35, 55);


		delete t;
} 
void TransliteratorAPITest::TestKeyboardTransliterator3(){
	UnicodeString s="This is the main string";
	 UnicodeString Data[] = {
		"0", "0", "0",  "This is the main string",
	    "1", "3", "2",  "Th\\u0069s is the main string",
		"20", "21", "20",  "Th\\u0069s is the mai\\u006E string"
	};
	
	UErrorCode status=U_ZERO_ERROR;
	UTransPosition index={0, 0, 0, 0};
	logln("Testing transliterate(Replaceable, int32_t, UErrorCode)");
	Transliterator *t=Transliterator::createInstance("Unicode-Hex");
	if(t == 0)
			errln("FAIL : construction");
	for(int32_t i=0; i<sizeof(Data)/sizeof(Data[0]); i=i+4){
		UnicodeString log;
		index.contextStart=getInt(Data[i+0]);
        index.contextLimit=index.limit=getInt(Data[i+1]);
        index.start=getInt(Data[i+2]);
        t->transliterate(s, index, status);
        if(U_FAILURE(status)){
           errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UErrorCode)-->" + (UnicodeString)u_errorName(status));
		   continue;
		}
		t->finishTransliteration(s, index);
		log = s + " => ";
		// Show the start index '{' and the cursor '|'
        displayOutput(s, Data[i+3], log, index); 
		}

	delete t;
}
void TransliteratorAPITest::TestNullTransliterator(){
    UnicodeString s("Transliterate using null transliterator");
    UErrorCode status=U_ZERO_ERROR;
    NullTransliterator *nullTrans=new NullTransliterator();
    int32_t transLimit;
    int32_t start=0;
    int32_t limit=s.length();
    UnicodeString replaceable=s;
    transLimit=nullTrans->transliterate(replaceable, start, limit);
    if(transLimit != limit){
        errln("ERROR: NullTransliterator->transliterate() failed");
    }
    doTest((UnicodeString)"nulTrans->transliterate", replaceable, s);
    replaceable.remove();
    replaceable.append(s);
    UTransPosition index={start, limit, 0, limit};
    nullTrans->handleTransliterate(replaceable, index, TRUE);
    if(index.start != limit){
        errln("ERROR: NullTransliterator->handleTransliterate() failed");
    }
    doTest((UnicodeString)"NullTransliterator->handleTransliterate", replaceable, s);

    
}
    



/**
 * Used by TestFiltering().
 */
class TestFilter1 : public UnicodeFilter {
    virtual UnicodeFilter* clone() const {
        return new TestFilter1(*this);
    }
    virtual UBool contains(UChar c) const {
       if(c==0x63 || c==0x61 || c==0x43 || c==0x41)
          return FALSE;
       else
          return TRUE;
    }
};
class TestFilter2 : public UnicodeFilter {
    virtual UnicodeFilter* clone() const {
        return new TestFilter2(*this);
    }
    virtual UBool contains(UChar c) const {
        if(c==0x65 || c==0x6c)
           return FALSE;
        else
           return TRUE;
    }
};
class TestFilter3 : public UnicodeFilter {
    virtual UnicodeFilter* clone() const {
        return new TestFilter3(*this);
    }
    virtual UBool contains(UChar c) const {
        if(c==0x6f || c==0x77)
           return FALSE;
        else
           return TRUE;
    }
};


void TransliteratorAPITest::TestGetAdoptFilter(){
	Transliterator *t=Transliterator::createInstance("Unicode-Hex");
	if(t == 0)
		errln("FAIL : construction");
    const UnicodeFilter *u=t->getFilter();
    if(u != NULL){
      errln("FAIL: getFilter failed. Didn't return null when the transliterator used no filtering");
    }
          
    UnicodeString got, temp, message;
    UnicodeString data="ABCabcbbCBa";
    temp = data;
	t->transliterate(temp);
	t->adoptFilter(new TestFilter1);

    got = data;
	t->transliterate(got);
    UnicodeString exp="A\\u0042Ca\\u0062c\\u0062\\u0062C\\u0042a";
	message="transliteration after adoptFilter(a,A,c,C) ";
    doTest(message, got, exp);
         
    logln("Testing round trip");
    t->adoptFilter((UnicodeFilter*)u);
    if(t->getFilter() == NULL)
       logln("OK: adoptFilter and getFilter round trip worked");
    else
       errln("FAIL: adoptFilter or getFilter round trip failed");  

    got = data;
    t->transliterate(got);
    exp="\\u0041\\u0042\\u0043\\u0061\\u0062\\u0063\\u0062\\u0062\\u0043\\u0042\\u0061";
    message="transliteration after adopting null filter";
    doTest(message, got, exp);
    message="adoptFilter round trip"; 
	doTest("adoptFilter round trip", got, temp);

    t->adoptFilter(new TestFilter2);
    data="heelloe";
	exp="\\u0068eell\\u006Fe";
    got = data;
	t->transliterate(got);
	message="transliteration using (e,l) filter";
    doTest("transliteration using (e,l) filter", got, exp);
	
	data="are well";
	exp="\\u0061\\u0072e\\u0020\\u0077ell";
    got = data;
    t->transliterate(got);
	doTest(message, got, exp);
    
    t->adoptFilter(new TestFilter3);
	data="ho, wow!";
	exp="\\u0068o\\u002C\\u0020wow\\u0021";
    got = data;
    t->transliterate(got);
	message="transliteration using (o,w) filter";
    doTest("transliteration using (o,w) filter", got, exp);

    data="owl";
	exp="ow\\u006C";
    got = data;
    t->transliterate(got);
	doTest("transliteration using (o,w) filter", got, exp);

	delete t;
	
}



void TransliteratorAPITest::keyboardAux(Transliterator *t, UnicodeString DATA[], UnicodeString& s, int32_t begin, int32_t end) {
        UTransPosition index={0, 0, 0, 0};
		UErrorCode status=U_ZERO_ERROR;
        for (int32_t i=begin; i<end; i=i+5) {
            UnicodeString log;
            if (DATA[i+0] != "") {
                 log = s + " + " + DATA[0] + " -> ";
                 index.contextStart=getInt(DATA[i+2]);
                 index.contextLimit=index.limit=getInt(DATA[i+3]);
                 index.start=getInt(DATA[i+4]);
                 t->transliterate(s, index, DATA[i+0], status);
                 if(U_FAILURE(status)){
					 errln("FAIL: " + t->getID()+ ".transliterate(Replaceable, int32_t[], UnicodeString, UErrorCode)-->" + (UnicodeString)u_errorName(status));
				 continue;
				 }
			} else {
               log = s + " => ";
               t->finishTransliteration(s, index);
            }
			 // Show the start index '{' and the cursor '|'
          displayOutput(s, DATA[i+1], log, index);
            
        }
}

void TransliteratorAPITest::displayOutput(const UnicodeString& got, const UnicodeString& expected, UnicodeString& log, UTransPosition& index){
		 // Show the start index '{' and the cursor '|'
			UnicodeString a, b, c;
			got.extractBetween(0, index.contextStart, a);
			got.extractBetween(index.contextStart, index.start, b);
			got.extractBetween(index.start, got.length(), c);
			log.append(a).
				append((UChar)0x7b/*{*/).
				append(b).
				append((UChar)0x7c/*|*/).
				append(c);
            if (got == expected) 
                logln("OK:" + prettify(log));
            else 
                errln("FAIL: " + prettify(log)  + ", expected " + prettify(expected));
}


/*Internal Functions used*/
void TransliteratorAPITest::doTest(const UnicodeString& message, const UnicodeString& result, const UnicodeString& expected){
	    if (result == expected) 
            logln((UnicodeString)"Ok: " + prettify(message) + " passed \"" + prettify(expected) + "\"");
        else 
            errln((UnicodeString)"FAIL:" + message + " failed  Got-->" + prettify(result)+ ", Expected--> " + prettify(expected) );

 }




