/***************************************************************************************** * * * 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/15/2000 Madhu Creation. ************************************************************************/ #include "ittrans.h" #include "unhxtrts.h" #include "unicode/utypes.h" #include "unicode/translit.h" #include "unicode/unitohex.h" #include "unicode/unifilt.h" #include "intltest.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'; return atoi(buffer); } //--------------------------------------------- // runIndexedTest //--------------------------------------------- void UniToHexTransliteratorTest::runIndexedTest( int32_t index, bool_t exec, char* &name, char* par ) { if (exec) logln((UnicodeString)"TestSuite UnicodeToHexadecimal Transliterator API "); switch (index) { case 0: name = "TestConstruction"; if (exec) TestConstruction(); break; case 1: name = "TestCloneEqual"; if (exec) TestCloneEqual(); break; case 2: name = "TestUpperCase"; if (exec) TestUpperCase(); break; case 3: name = "TestPattern"; if (exec) TestPattern(); break; case 4: name = "TestSimpleTransliterate"; if (exec) TestSimpleTransliterate(); break; case 5: name = "TestTransliterate"; if (exec) TestTransliterate(); break; default: name = ""; break; /*needed to end loop*/ } } /** * Used by TestConstruction() and TestTransliterate. */ class TestUniFilter : public UnicodeFilter { virtual UnicodeFilter* clone() const { return new TestUniFilter(*this); } virtual bool_t contains(UChar c) const { if(c=='c' || c=='a' || c=='C' || c=='A') return FALSE; else return TRUE; } }; void UniToHexTransliteratorTest::TestConstruction(){ UErrorCode status=U_ZERO_ERROR; logln("Testing the construction UnicodeToHexTransliterator()"); UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(); if(trans1==0){ errln("UnicodeToHexTransliterator construction failed Error=" + (UnicodeString)u_errorName(status)); return; } delete trans1; logln("Testing the cosntruction UnicodeToHexTransliterator(pattern, status)"); UnicodeString pattern("\\\\U+0000abc"); trans1=new UnicodeToHexTransliterator(pattern, status); if(U_FAILURE(status)){ errln("UnicodeToHexTransliterator construction failed with pattern =" + pattern + " Error=" + (UnicodeString)u_errorName(status)); status=U_ZERO_ERROR; return; } delete trans1; logln("Testing the cosntruction UnicodeToHexTransliterator(pattern, status) with illegal pattern"); UnicodeString pattern2("\\X+"); trans1=new UnicodeToHexTransliterator(pattern2, status); if(U_FAILURE(status)){ logln("OK: UnicodeToHexTransliterator construction for illegal pattern failed, as expected"); status=U_ZERO_ERROR; } else { errln("Error: calling the UnicodeToHexTransliterator constructor with illegal pattern should fail"); delete trans1; } logln("Testing the construction UnicodeToHexTransliterator(pattern, isUppercase, adoptedFilter, status)"); trans1=new UnicodeToHexTransliterator(pattern, FALSE, NULL, status); if(U_FAILURE(status)){ errln("UnicodeToHexTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status)); status=U_ZERO_ERROR; return; } logln("Testing the copy construction"); UnicodeToHexTransliterator *trans1copy=new UnicodeToHexTransliterator(*trans1); if(trans1->toPattern() != trans1copy->toPattern() || trans1->isUppercase() != trans1copy->isUppercase() || trans1->getID() != trans1copy->getID()){ errln("Copy construction failed"); } delete trans1copy; delete trans1; logln("Testing the construction UnicodeToHexTransliterator(pattern, isUppercase, adoptedFilter, status)"); trans1=new UnicodeToHexTransliterator(pattern, TRUE, new TestUniFilter, status); if(U_FAILURE(status)){ errln("UnicodeToHexTransliterator construction failed Error=" + (UnicodeString)u_errorName(status)); status=U_ZERO_ERROR; return; } logln("Testing the copy construction"); trans1copy=new UnicodeToHexTransliterator(*trans1); if(trans1->toPattern() != trans1copy->toPattern() || trans1->isUppercase() != trans1copy->isUppercase() || trans1->getID() != trans1copy->getID() || trans1->getFilter() == NULL || trans1copy->getFilter() == NULL ){ errln("Copy construction failed"); } delete trans1copy; delete trans1; } void UniToHexTransliteratorTest::TestCloneEqual(){ UErrorCode status=U_ZERO_ERROR; UnicodeToHexTransliterator *transdefault=new UnicodeToHexTransliterator(); UnicodeString pattern1("\\U##00"); UnicodeString pattern2("\\\\uni0000"); UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(pattern1, status); if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ errln("UnicodeToHexTransliterator construction failed"); status=U_ZERO_ERROR; return; } UnicodeToHexTransliterator *trans2=new UnicodeToHexTransliterator(pattern2, status); if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ errln("UnicodeToHexTransliterator construction failed"); status=U_ZERO_ERROR; return; } logln("Testing the clone() API of the UnicodeToHexTransliterator"); UnicodeToHexTransliterator *transdefaultclone=(UnicodeToHexTransliterator*)transdefault->clone(); UnicodeToHexTransliterator *trans1clone=(UnicodeToHexTransliterator*)trans1->clone(); UnicodeToHexTransliterator *trans2clone=(UnicodeToHexTransliterator*)trans2->clone(); if(transdefault->toPattern() != transdefaultclone->toPattern() || transdefault->isUppercase() != transdefaultclone->isUppercase() || trans1->toPattern() != trans1clone->toPattern() || trans1->isUppercase() != trans1clone->isUppercase() || trans2->toPattern() != trans2clone->toPattern() || trans2->isUppercase() != trans2clone->isUppercase() || transdefault->toPattern() == trans1->toPattern() || trans1->toPattern() == trans2clone->toPattern() || trans2->toPattern() == transdefault->toPattern() ) { errln("Error: clone() failed"); } logln("Testing the =operator of the UnicodeToHexTransliterator"); UnicodeToHexTransliterator *transdefaultequal=transdefault; UnicodeToHexTransliterator *trans1equal=trans1; UnicodeToHexTransliterator *trans2equal=trans2; if(transdefault->toPattern() != transdefaultequal->toPattern() || transdefault->isUppercase() != transdefaultequal->isUppercase() || trans1->toPattern() != trans1equal->toPattern() || trans1->isUppercase() != trans1equal->isUppercase() || trans2->toPattern() != trans2equal->toPattern() || trans2->isUppercase() != trans2equal->isUppercase() || transdefault->toPattern() == trans1->toPattern() || trans1->toPattern() == trans2equal->toPattern() || trans2->toPattern() == transdefault->toPattern() ) { errln("Error: equal() failed"); } if(transdefaultclone->toPattern() != transdefaultequal->toPattern() || transdefaultclone->isUppercase() != transdefaultequal->isUppercase() || trans1equal->toPattern() != trans1clone->toPattern() || trans1equal->isUppercase() != trans1clone->isUppercase() || trans2clone->toPattern() != trans2equal->toPattern() || trans2clone->isUppercase() != trans2equal->isUppercase() ) { errln("Error: equal() or clone() failed"); } delete transdefault; delete trans1; delete trans2; } void UniToHexTransliteratorTest::TestUpperCase(){ logln("Testing the isUppercase() and setUppercase() API of UnicodeToHexTransliterator"); UErrorCode status = U_ZERO_ERROR; UnicodeString str("abk"); /*default transliterator has upper case TRUE*/ UnicodeToHexTransliterator *transdefault=new UnicodeToHexTransliterator(); if(transdefault == 0){ errln("UnicodeToHexTransliterator construction failed"); return; } expect(*transdefault, "where uppercase=default", str, UnicodeString("\\u0061\\u0062\\u006B")); UnicodeString pattern("\\\\u0000"); /*transliterator with Uppercase FALSE*/ UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(pattern, FALSE, NULL, status); if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ errln("UnicodeToHexTransliterator construction failed with pattern =" + pattern); status=U_ZERO_ERROR; return; } expect(*trans1, "where uppercase=FALSE", str, UnicodeString("\\u0061\\u0062\\u006b")); /*doesn't display uppercase*/ if(transdefault->isUppercase() != TRUE || trans1->isUppercase() != FALSE ){ errln("isUpperCase() failed"); } /*changing the outputhexdigits to lower case for the default transliterator*/ transdefault->setUppercase(trans1->isUppercase()); if(transdefault->isUppercase() != trans1->isUppercase() || transdefault->isUppercase() != FALSE){ errln("setUppercase() failed"); } /*doesn't ouput uppercase hex, since transdefault's uppercase is set to FALSE using setUppercase*/ expect(*transdefault, "where uppercase=FALSE", str, UnicodeString("\\u0061\\u0062\\u006b")); /*trying round trip*/ transdefault->setUppercase(TRUE); if(transdefault->isUppercase() != TRUE || transdefault->isUppercase() == trans1->isUppercase() ){ errln("setUppercase() failed"); } /*displays upper case since it is set to TRUE*/ expect(*transdefault, "where uppercase=TRUE", str, UnicodeString("\\u0061\\u0062\\u006B")); delete transdefault; delete trans1; } void UniToHexTransliteratorTest::TestPattern(){ logln("Testing the applyPattern() and toPattern() API of UnicodeToHexTransliterator"); UErrorCode status = U_ZERO_ERROR; /*default transliterator has pattern \\u0000*/ UnicodeToHexTransliterator *transdefault=new UnicodeToHexTransliterator(); if(transdefault == 0){ errln("UnicodeToHexTransliterator construction failed"); return; } UnicodeString defaultpattern=transdefault->toPattern(); UnicodeString pattern1("\\\\U+0000"); UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(pattern1, TRUE, NULL, status); if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ errln("UnicodeToHexTransliterator construction failed with pattern =" + pattern1); status=U_ZERO_ERROR; return; } /*test toPattern() */ if(transdefault->toPattern() == trans1->toPattern() || transdefault->toPattern() != UnicodeString("\\\\u0000") || trans1->toPattern() != pattern1 ){ errln("Error: toPattern() failed"); } /*apply patterns for transdefault*/ UnicodeString str("abKf"); expectPattern(*transdefault, pattern1, str, "\\U+0061\\U+0062\\U+004B\\U+0066"); expectPattern(*transdefault, "\\U##00,", str, "U61,U62,U4B,U66,"); expectPattern(*transdefault, defaultpattern, str, "\\u0061\\u0062\\u004B\\u0066"); expectPattern(*trans1, "\\uni0000", str, "uni0061uni0062uni004Buni0066"); expectPattern(*trans1, "\\\\S-0000-E", str, "\\S-0061-E\\S-0062-E\\S-004B-E\\S-0066-E"); expectPattern(*trans1, "\\u##0000", str, "FAIL"); expectPattern(*trans1, "\\*0000", str, "*0061*0062*004B*0066"); expectPattern(*trans1, "\\u####", str, "FAIL"); delete trans1; delete transdefault; } void UniToHexTransliteratorTest::TestSimpleTransliterate(){ UErrorCode status=U_ZERO_ERROR; UnicodeString pattern1("\\\\U+0000"); UnicodeToHexTransliterator *trans1=new UnicodeToHexTransliterator(pattern1, TRUE, NULL, status); if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ errln("UnicodeToHexTransliterator construction failed with pattern =" + pattern1); status=U_ZERO_ERROR; return; } Transliterator::Position index(1,5,2); UnicodeString source("Hello"); UnicodeString rsource(source); UnicodeString expected("He\\U+006C\\U+006C\\U+006F"); trans1->handleTransliterate(rsource, index, FALSE); expectAux(trans1->getID() + ":handleTransliterator ", source + "-->" + rsource, rsource==expected, expected); delete trans1; } void UniToHexTransliteratorTest::TestTransliterate(){ UErrorCode status=U_ZERO_ERROR; UnicodeString Data[]={ //pattern, source, index.start, index.limit, index.cursor, expectedResult, expectedResult using filter(a, b) "U+##00", "abc", "1", "3", "2", "abU+63", "abc", "\\\\u0000", "abc", "1", "2", "1", "a\\u0062c", "a\\u0062c", "Uni0000", "abc", "1", "3", "2", "abUni0063", "abc", "U[0000]", "hello", "0", "4", "2", "heU[006C]U[006C]o", "heU[006C]U[006C]o", "prefix-0000-suffix", "abc", "1", "3", "1", "aprefix-0062-suffixprefix-0063-suffix", "aprefix-0062-suffixc", "*##00*", "hellothere", "1", "8", "4", "hell*6F**74**68**65*re", "hell*6F**74**68**65*re", }; int i; for(i=0;i" + rsource, rsource==expectedResult, expectedResult); UnicodeString rsource2(source); index=Transliterator::Position(start, limit, cursor); 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*/ UnicodeToHexTransliterator *copy=new UnicodeToHexTransliterator(t); rsource2.remove(); rsource2.append(source); index=Transliterator::Position(start, limit, cursor); copy->handleTransliterate(rsource2, index, FALSE); expectAux(t.getID() + "COPY:handleTransliterator(increment=FALSE) " + message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); index=Transliterator::Position(start, limit, cursor); 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*/ UnicodeToHexTransliterator *clone=(UnicodeToHexTransliterator*)t.clone(); rsource2.remove(); rsource2.append(source); index=Transliterator::Position(start, limit, cursor); clone->handleTransliterate(rsource2, index, FALSE); expectAux(t.getID() + "CLONE:handleTransliterator(increment=FALSE) "+ message,source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); index=Transliterator::Position(start, limit, cursor); 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*/ UnicodeToHexTransliterator equal=t; rsource2.remove(); rsource2.append(source); index=Transliterator::Position(start, limit, cursor); equal.handleTransliterate(rsource2, index, FALSE); expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); index=Transliterator::Position(start, limit, cursor); equal.handleTransliterate(rsource2, index, TRUE); expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); } void UniToHexTransliteratorTest::expectPattern(UnicodeToHexTransliterator& 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, (UnicodeString)" with pattern "+pattern, source, expectedResult); } } } } void UniToHexTransliteratorTest::expect(const UnicodeToHexTransliterator& 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); Transliterator::Position index(0,source.length(),0); t.handleTransliterate(rsource, index, TRUE); expectAux(t.getID() + ":handleTransliterate " + message, source + "->" + rsource, rsource==expectedResult, expectedResult); } void UniToHexTransliteratorTest::expectAux(const UnicodeString& tag, const UnicodeString& summary, bool_t pass, const UnicodeString& expectedResult) { if (pass) { logln(UnicodeString("(")+tag+") " + prettify(summary)); } else { errln(UnicodeString("FAIL: (")+tag+") " + prettify(summary) + ", expected " + prettify(expectedResult)); } }