/******************************************************************** * COPYRIGHT: * Copyright (c) 1997-2001, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /*********************************************************************** ************************************************************************ * 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 "unicode/unicode.h" #include "intltest.h" /*converts a Unicodestring to integer*/ static int32_t getInt(UnicodeString str) { int32_t result = 0; int32_t len = str.length(); int32_t i = 0; for(i=0; itransliterate(text, index, status); } else { t->finishTransliteration(text, index); } } /** * Used by TestConstruction() and TestTransliterate. */ class TestUniFilter : public UnicodeFilter { virtual UnicodeMatcher* clone() const { return new TestUniFilter(*this); } virtual UBool contains(UChar32 c) const { if(c==0x0063 || c==0x0061 || c==0x0043 || c==0x0041) 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=new UnicodeToHexTransliterator(); UnicodeToHexTransliterator *trans1equal=new UnicodeToHexTransliterator(); UnicodeToHexTransliterator *trans2equal=new UnicodeToHexTransliterator(); *transdefaultequal=*transdefault; *trans1equal=*trans1; *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 transdefaultclone; delete trans1clone; delete trans2clone; delete transdefaultequal; delete trans1equal; delete trans2equal; 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, UnicodeString("\\U+0061\\U+0062\\U+004B\\U+0066", "")); expectPattern(*transdefault, UnicodeString("\\U##00,", ""), str, UnicodeString("U61,U62,U4B,U66,", "")); expectPattern(*transdefault, defaultpattern, str, UnicodeString("\\u0061\\u0062\\u004B\\u0066", "")); expectPattern(*trans1, UnicodeString("\\uni0000", ""), str, UnicodeString("uni0061uni0062uni004Buni0066", "")); expectPattern(*trans1, UnicodeString("\\\\S-0000-E", ""), str, UnicodeString("\\S-0061-E\\S-0062-E\\S-004B-E\\S-0066-E", "")); expectPattern(*trans1, UnicodeString("\\u##0000", ""), str, UnicodeString("FAIL", "")); expectPattern(*trans1, UnicodeString("\\*0000", ""), str, UnicodeString("*0061*0062*004B*0066", "")); expectPattern(*trans1, UnicodeString("\\u####", ""), str, UnicodeString("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; } UTransPosition index={1,5,2,5}; UnicodeString source("Hello"); UnicodeString rsource(source); UnicodeString expected("He\\U+006C\\U+006C\\U+006F", ""); pseudoHandleTransliterate(trans1, 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.contextStart, index.contextLimit, index.start, expectedResult, expectedResult using filter(a, b) UnicodeString("U+##00", ""), UnicodeString("abc", ""), "1", "3", "2", UnicodeString("abU+63", ""), UnicodeString("abc", ""), UnicodeString("\\\\u0000", ""), UnicodeString("abc", ""), "1", "2", "1", UnicodeString("a\\u0062c", ""), UnicodeString("a\\u0062c", ""), UnicodeString("Uni0000", ""), UnicodeString("abc", ""), "1", "3", "2", UnicodeString("abUni0063", ""), UnicodeString("abc", ""), UnicodeString("U[0000]", ""), UnicodeString("hello", ""), "0", "4", "2", UnicodeString("heU[006C]U[006C]o", ""), UnicodeString("heU[006C]U[006C]o", ""), UnicodeString("prefix-0000-suffix", ""), UnicodeString("abc", ""), "1", "3", "1", UnicodeString("aprefix-0062-suffixprefix-0063-suffix", ""), UnicodeString("aprefix-0062-suffixc", ""), UnicodeString("*##00*", ""), UnicodeString("hellothere", ""), "1", "8", "4", UnicodeString("hell*6F**74**68**65*re", ""), UnicodeString("hell*6F**74**68**65*re", ""), }; uint32_t i; for(i=0;i" + rsource, rsource==expectedResult, expectedResult); UnicodeString rsource2(source); index=_index; pseudoHandleTransliterate(&t, 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=_index; pseudoHandleTransliterate(copy, rsource2, index, FALSE); expectAux(t.getID() + "COPY:handleTransliterator(increment=FALSE) " + message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); index=_index; pseudoHandleTransliterate(copy, 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=_index; pseudoHandleTransliterate(clone, rsource2, index, FALSE); expectAux(t.getID() + "CLONE:handleTransliterator(increment=FALSE) "+ message,source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); index=_index; pseudoHandleTransliterate(clone, rsource2, index, TRUE); expectAux(t.getID() + "CLONE:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); delete clone; /*Uses the assignment operator to create a transliterator and tests transliteration*/ UnicodeToHexTransliterator equal=t; rsource2.remove(); rsource2.append(source); index=_index; pseudoHandleTransliterate(&equal, rsource2, index, FALSE); expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); index=_index; pseudoHandleTransliterate(&equal, 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); UTransPosition index; index.contextStart=0; index.contextLimit = source.length(); index.start =0; index.limit=source.length(); pseudoHandleTransliterate(&t, rsource, index, TRUE); expectAux(t.getID() + ":handleTransliterate " + message, source + "->" + rsource, rsource==expectedResult, expectedResult); } void UniToHexTransliteratorTest::expectAux(const UnicodeString& tag, const UnicodeString& summary, UBool pass, const UnicodeString& expectedResult) { if (pass) { logln(UnicodeString("(")+tag+") " + prettify(summary)); } else { errln(UnicodeString("FAIL: (")+tag+") " + prettify(summary) + ", expected " + prettify(expectedResult)); } }