/********************************************************************
 * 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 <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, bool_t 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;
                 
        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 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");
			 

         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"),        "bhaaarata" ,
         //  "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");
         Transliterator::Position index(19,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");
         Transliterator::Position index1[]={
             //START, LIMIT, CURSOR
             Transliterator::Position(10, 10, 12),   //invalid since CURSOR>LIMIT valid:-START <= CURSOR <= LIMIT
             Transliterator::Position(17, 16, 17),   //invalid since START>LIMIT valid:-0<=START<=LIMIT
             Transliterator::Position(-1, 16, 14),   //invalid since START<0
             Transliterator::Position(3,  50, 2 )    //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);
		Transliterator::Position index(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.start = index.limit = index.cursor = 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");
		keyboardAux(t, Data, rs, 0, 20);

        rs="Hindi --";
		t=Transliterator::createInstance("Latin-Devanagari");
		if(t == 0)
			errln("FAIL : construction");
        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;
	Transliterator::Position index(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.start=getInt(Data[i+0]);
        index.limit=getInt(Data[i+1]);
        index.cursor=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;
}

/**
 * Used by TestFiltering().
 */
class TestFilter1 : public UnicodeFilter {
    virtual UnicodeFilter* clone() const {
        return new TestFilter1(*this);
    }
    virtual bool_t 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 bool_t 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 bool_t 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) {
        Transliterator::Position index(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.start=getInt(DATA[i+2]);
                 index.limit=getInt(DATA[i+3]);
                 index.cursor=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, Transliterator::Position& index){
		 // Show the start index '{' and the cursor '|'
			UnicodeString a, b, c;
			got.extractBetween(0, index.start, a);
			got.extractBetween(index.start, index.cursor, b);
			got.extractBetween(index.cursor, 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) );

 }




