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

 }




