/***************************************************************************************** * * * COPYRIGHT: * * (C) Copyright International Business Machines Corporation, 2001 * * 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/17/2000 Madhu Creation. ************************************************************************/ #include "ittrans.h" #include "hxuntrts.h" #include "unicode/utypes.h" #include "unicode/translit.h" #include "unicode/hextouni.h" #include "unicode/unifilt.h" #include "unicode/unicode.h" #include "intltest.h" #include "cmemory.h" #include #include /*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; itoPattern() != trans1copy->toPattern() || trans1->getID() != trans1copy->getID() ){ errln("Copy construction failed"); } delete trans1copy; delete trans1; logln("Testing the construction HexToUnicodeTransliterator(adoptedFilter)"); trans1=new HexToUnicodeTransliterator(new TestHexFilter); if(trans1 == 0){ errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status)); return; } logln("Testing the copy construction"); trans1copy=new HexToUnicodeTransliterator(*trans1); if(trans1->getFilter() == NULL || trans1copy->getFilter() == NULL || trans1->toPattern() != trans1copy->toPattern() || trans1->getID() != trans1copy->getID() ){ errln("Copy construction failed"); } delete trans1copy; delete trans1; } void HexToUniTransliteratorTest::TestCloneEqual(){ UErrorCode status=U_ZERO_ERROR; HexToUnicodeTransliterator *transdefault=new HexToUnicodeTransliterator(); UnicodeString pattern1("\\U##00"); UnicodeString pattern2("\\\\uni0000"); HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, status); if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ errln("HexToUnicodeTransliterator construction failed"); status=U_ZERO_ERROR; return; } HexToUnicodeTransliterator *trans2=new HexToUnicodeTransliterator(pattern2, status); if(U_FAILURE(status) && status==U_ILLEGAL_ARGUMENT_ERROR){ errln("HexToUnicodeTransliterator construction failed"); status=U_ZERO_ERROR; return; } logln("Testing the clone() API of the HexToUnicodeTransliterator"); HexToUnicodeTransliterator *transdefaultclone=(HexToUnicodeTransliterator*)transdefault->clone(); HexToUnicodeTransliterator *trans1clone=(HexToUnicodeTransliterator*)trans1->clone(); HexToUnicodeTransliterator *trans2clone=(HexToUnicodeTransliterator*)trans2->clone(); if(transdefault->toPattern() != transdefaultclone->toPattern() || trans1->toPattern() != trans1clone->toPattern() || trans2->toPattern() != trans2clone->toPattern() || transdefault->toPattern() == trans1->toPattern() || trans1->toPattern() == trans2clone->toPattern() || trans2->toPattern() == transdefault->toPattern() ) { errln("Error: clone() failed"); } logln("Testing the =operator of the HexToUnicodeTransliterator"); HexToUnicodeTransliterator *transdefaultequal=new HexToUnicodeTransliterator(); HexToUnicodeTransliterator *trans1equal=new HexToUnicodeTransliterator(); HexToUnicodeTransliterator *trans2equal=new HexToUnicodeTransliterator(); *transdefaultequal=*transdefault; *trans1equal=*trans1; *trans2equal=*trans2; if(transdefault->toPattern() != transdefaultequal->toPattern() || trans1->toPattern() != trans1equal->toPattern() || trans2->toPattern() != trans2equal->toPattern() || transdefault->toPattern() == trans1->toPattern() || trans1->toPattern() == trans2equal->toPattern() || trans2->toPattern() == transdefault->toPattern() ) { errln("Error: equal() failed"); } if(transdefaultclone->toPattern() != transdefaultequal->toPattern() || trans1equal->toPattern() != trans1clone->toPattern() || trans2clone->toPattern() != trans2equal->toPattern() ){ errln("Error: equal() or clone() failed"); } delete transdefaultequal; delete trans1equal; delete trans2equal; delete transdefault; delete trans1; delete trans2; } void HexToUniTransliteratorTest::TestPattern(){ logln("Testing the applyPattern() and toPattern() API of HexToUnicodeTransliterator"); UErrorCode status = U_ZERO_ERROR; /*default transliterator has pattern \\u0000*/ HexToUnicodeTransliterator *transdefault=new HexToUnicodeTransliterator(); if(transdefault == 0){ errln("HexToUnicodeTransliterator construction failed. Error=" + (UnicodeString)u_errorName(status)); return; } UnicodeString defaultpattern=transdefault->toPattern(); UnicodeString pattern1("\\\\U+0000", ""); HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, NULL, status); if(U_FAILURE(status) ){ errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern1); status=U_ZERO_ERROR; return; } /*test toPattern() */ if(transdefault->toPattern() == trans1->toPattern() || transdefault->toPattern() != UnicodeString("\\\\u0000;\\\\U0000;u+0000;U+0000", "") || trans1->toPattern() != pattern1 ){ errln("Error: toPattern() failed "+ transdefault->toPattern()); } /*apply patterns for transdefault*/ UnicodeString str("abKf"); expectPattern(*transdefault, pattern1, UnicodeString("\\U+0061\\U+0062\\U+004B\\U+0066", ""), str); expectPattern(*transdefault, UnicodeString("\\U##00,", ""), UnicodeString("U61,U62,U4B,U66,", ""), str); expectPattern(*transdefault, defaultpattern, UnicodeString("\\u0061\\u0062\\u004B\\u0066", ""), str); expectPattern(*trans1, UnicodeString("\\uni0000", ""), UnicodeString("uni0061uni0062uni004Buni0066", ""), str); expectPattern(*trans1, UnicodeString("\\\\S-0000-E", ""), UnicodeString("\\S-0061-E\\S-0062-E\\S-004B-E\\S-0066-E", ""), str); expectPattern(*trans1, UnicodeString("\\u##0000", ""), UnicodeString("\\u##0061\\u##0062", ""), "FAIL"); expectPattern(*trans1, UnicodeString("\\*0000", ""), UnicodeString("*0061*0062*004B*0066", ""), str); expectPattern(*trans1, UnicodeString("\\u####", ""), UnicodeString("\\u##0061\\u##0062", ""), "FAIL"); delete trans1; delete transdefault; } void HexToUniTransliteratorTest::TestSimpleTransliterate(){ logln("Testing the handleTransliterate() API of HexToUnicodeTransliterator"); UErrorCode status=U_ZERO_ERROR; UnicodeString pattern1("\\\\U+0000", ""); HexToUnicodeTransliterator *trans1=new HexToUnicodeTransliterator(pattern1, NULL, status); if(U_FAILURE(status)){ errln("HexToUnicodeTransliterator construction failed with pattern =" + pattern1 + "Error: " + (UnicodeString)u_errorName(status)); status=U_ZERO_ERROR; return; } UnicodeString source("He\\U+006C\\U+006C\\U+006F", ""); UnicodeString rsource(source); UTransPosition index; index.contextStart =1; index.contextLimit = source.length(); index.start = 2; index.limit =source.length(); UnicodeString expected("Hello"); trans1->handleTransliterate(rsource, index, FALSE); expectAux(trans1->getID() + ":handleTransliterator ", source + "-->" + rsource, rsource==expected, expected); expect(*trans1, "", UnicodeString("\\U+0048\\U+0065\\U+006C\\U+006C\\U+006F", ""), expected); delete trans1; HexToUnicodeTransliterator *trans2=new HexToUnicodeTransliterator(new TestHexFilter); expect(*trans2, "with Filter(0x0061, 0x0063) ", CharsToUnicodeString("\\u0061\\u0062\\u0063"), CharsToUnicodeString("\\u0061b\\u0063") ); delete trans2; } void HexToUniTransliteratorTest::TestTransliterate(){ UErrorCode status=U_ZERO_ERROR; UnicodeString Data[]={ //pattern, source, index.contextStart, index.contextLimit, index.start, expectedResult, UnicodeString("U+##00", ""), UnicodeString("abU+63", ""), "1", "7", "2", UnicodeString("abc", ""), UnicodeString("\\\\u0000", ""), UnicodeString("a\\u0062c", ""), "1", "7", "1", UnicodeString("abc", ""), UnicodeString("Uni0000", ""), UnicodeString("abUni0063", ""), "1", "9", "2", UnicodeString("abc", ""), UnicodeString("U[0000]", ""), UnicodeString("heU[006C]U[006C]o", ""), "0", "16", "2", UnicodeString("hello", ""), UnicodeString("prefix-0000-suffix", ""), UnicodeString("aprefix-0062-suffixprefix-0063-suffix", ""), "1", "39", "1", UnicodeString("abc", ""), UnicodeString("*##00*", ""), UnicodeString("hell*6F**74**68**65*re", ""), "1", "20", "4", UnicodeString("hellothere", ""), }; uint32_t i; for(i=0;i" + rsource, rsource==expectedResult, expectedResult); UnicodeString rsource2(source); uprv_memcpy(&index, &_index, sizeof(index)); 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*/ HexToUnicodeTransliterator *copy=new HexToUnicodeTransliterator(t); rsource2.remove(); rsource2.append(source); uprv_memcpy(&index, &_index, sizeof(index)); copy->handleTransliterate(rsource2, index, FALSE); expectAux(t.getID() + "COPY:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); uprv_memcpy(&index, &_index, sizeof(index)); 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*/ HexToUnicodeTransliterator *clone=(HexToUnicodeTransliterator*)t.clone(); rsource2.remove(); rsource2.append(source); uprv_memcpy(&index, &_index, sizeof(index)); clone->handleTransliterate(rsource2, index, FALSE); expectAux(t.getID() + "CLONE:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); uprv_memcpy(&index, &_index, sizeof(index)); 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*/ HexToUnicodeTransliterator equal=t; rsource2.remove(); rsource2.append(source); uprv_memcpy(&index, &_index, sizeof(index)); equal.handleTransliterate(rsource2, index, FALSE); expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=FALSE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); rsource2.remove(); rsource2.append(source); uprv_memcpy(&index, &_index, sizeof(index)); equal.handleTransliterate(rsource2, index, TRUE); expectAux(t.getID() + "=OPERATOR:handleTransliterator(increment=TRUE) "+ message, source + "-->" + rsource2, rsource2==expectedResult, expectedResult); } void HexToUniTransliteratorTest::expectPattern(HexToUnicodeTransliterator& 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, " with pattern "+pattern, source, expectedResult); } } } } void HexToUniTransliteratorTest::expect(const HexToUnicodeTransliterator& 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(); t.handleTransliterate(rsource, index, TRUE); expectAux(t.getID() + ":handleTransliterate " + message, source + "->" + rsource, rsource==expectedResult, expectedResult); } void HexToUniTransliteratorTest::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)); } }