/******************************************************************** * Copyright (c) 2001-2009, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************* * This test program is intended for testing error conditions of the * transliterator APIs to make sure the exceptions are raised where * necessary. * * Date Name Description * 11/14/2001 hshih Creation. * ********************************************************************/ #include "unicode/utypes.h" #if !UCONFIG_NO_TRANSLITERATION #include "ittrans.h" #include "trnserr.h" #include "unicode/utypes.h" #include "unicode/translit.h" #include "unicode/uniset.h" #include "unicode/unifilt.h" #include "cpdtrans.h" #include <string.h> #include <stdio.h> #include <stdlib.h> #include "unicode/rep.h" #include "unicode/locid.h" //--------------------------------------------- // runIndexedTest //--------------------------------------------- void TransliteratorErrorTest::runIndexedTest(int32_t index, UBool exec, const char* &name, char* /*par*/) { switch (index) { TESTCASE(0,TestTransliteratorErrors); TESTCASE(1, TestUnicodeSetErrors); TESTCASE(2, TestRBTErrors); TESTCASE(3, TestCoverage); //TESTCASE(3, TestUniToHexErrors); //TESTCASE(4, TestHexToUniErrors); // TODO: Add a subclass to test clone(). default: name = ""; break; } } void TransliteratorErrorTest::TestTransliteratorErrors() { UnicodeString trans="Latin-Greek"; UnicodeString bogusID="LATINGREEK-GREEKLATIN"; UnicodeString newID="Bogus-Latin"; UnicodeString newIDRules="zzz > Z; f <> ph"; UnicodeString bogusRules="a } [b-g m-p "; UParseError parseError; UErrorCode status = U_ZERO_ERROR; UnicodeString testString="A quick fox jumped over the lazy dog."; UnicodeString insertString="cats and dogs"; int32_t stoppedAt = 0, len; UTransPosition pos; Transliterator* t= Transliterator::createInstance(trans, UTRANS_FORWARD, parseError, status); if(t==0 || U_FAILURE(status)){ dataerrln("FAIL: construction of Latin-Greek - %s", u_errorName(status)); return; } pos.contextLimit = 0; pos.contextStart = 0; pos.limit = 0; pos.start = 0; len = testString.length(); stoppedAt = t->transliterate(testString, 0, 100); if (stoppedAt != -1) { errln("FAIL: Out of bounds check failed (1)."); } else if (testString.length() != len) { testString="A quick fox jumped over the lazy dog."; errln("FAIL: Transliterate fails and the target string was modified."); } stoppedAt = t->transliterate(testString, 100, testString.length()-1); if (stoppedAt != -1) errln("FAIL: Out of bounds check failed (2)."); else if (testString.length() != len) { testString="A quick fox jumped over the lazy dog."; errln("FAIL: Transliterate fails and the target string was modified."); } pos.start = 100; pos.limit = testString.length(); t->transliterate(testString, pos, status); if (U_SUCCESS(status)) { errln("FAIL: Start offset is out of bounds, error not reported.\n"); } status = U_ZERO_ERROR; pos.limit = 100; pos.start = 0; t->transliterate(testString, pos, status); if (U_SUCCESS(status)) { errln("FAIL: Limit offset is out of bounds, error not reported.\n"); } status = U_ZERO_ERROR; len = pos.contextLimit = testString.length(); pos.contextStart = 0; pos.limit = len - 1; pos.start = 5; t->transliterate(testString, pos, insertString, status); if (len == pos.limit) { errln("FAIL: Test insertion with string: the transliteration position limit didn't change as expected."); if (U_SUCCESS(status)) { errln("FAIL: Error code wasn't set either."); } } status = U_ZERO_ERROR; pos.contextStart = 0; pos.contextLimit = testString.length(); pos.limit = testString.length() -1; pos.start = 5; t->transliterate(testString, pos, (UChar32)0x0061, status); if (len == pos.limit) { errln("FAIL: Test insertion with character: the transliteration position limit didn't change as expected."); if (U_SUCCESS(status)) { errln("FAIL: Error code wasn't set either."); } } status = U_ZERO_ERROR; len = pos.limit = testString.length(); pos.contextStart = 0; pos.contextLimit = testString.length() - 1; pos.start = 5; t->transliterate(testString, pos, insertString, status); if (U_SUCCESS(status)) { errln("FAIL: Out of bounds check failed (3)."); if (testString.length() != len) errln("FAIL: The input string was modified though the offsets were out of bounds."); } Transliterator* t1= Transliterator::createInstance(bogusID, UTRANS_FORWARD, parseError, status); if(t1!=0 || U_SUCCESS(status)){ delete t1; errln("FAIL: construction of bogus ID \"LATINGREEK-GREEKLATIN\""); } status = U_ZERO_ERROR; Transliterator* t2 = Transliterator::createFromRules(newID, newIDRules, UTRANS_FORWARD, parseError, status); if (U_SUCCESS(status)) { Transliterator* t3 = t2->createInverse(status); if (U_SUCCESS(status)) { delete t3; errln("FAIL: The newID transliterator was not registered so createInverse should fail."); } else { delete t3; } } status = U_ZERO_ERROR; Transliterator* t4 = Transliterator::createFromRules(newID, bogusRules, UTRANS_FORWARD, parseError, status); if (t4 != NULL || U_SUCCESS(status)) { errln("FAIL: The rules is malformed but error was not reported."); if (parseError.offset != -1) { errln("FAIL: The parse error offset isn't set correctly when fails."); } else if (parseError.postContext[0] == 0 || parseError.preContext[0] == 0) { errln("FAIL: The parse error pre/post context isn't reset properly."); } delete t4; } delete t; delete t2; } void TransliteratorErrorTest::TestUnicodeSetErrors() { UnicodeString badPattern="[[:L:]-[0x0300-0x0400]"; UnicodeSet set; UErrorCode status = U_ZERO_ERROR; UnicodeString result; if (!set.isEmpty()) { errln("FAIL: The default ctor of UnicodeSet created a non-empty object."); } set.applyPattern(badPattern, status); if (U_SUCCESS(status)) { errln("FAIL: Applied a bad pattern to the UnicodeSet object okay."); } status = U_ZERO_ERROR; UnicodeSet *set1 = new UnicodeSet(badPattern, status); if (U_SUCCESS(status)) { errln("FAIL: Created a UnicodeSet based on bad patterns."); } delete set1; } //void TransliteratorErrorTest::TestUniToHexErrors() { // UErrorCode status = U_ZERO_ERROR; // Transliterator *t = new UnicodeToHexTransliterator("", TRUE, NULL, status); // if (U_SUCCESS(status)) { // errln("FAIL: Created a UnicodeToHexTransliterator with an empty pattern."); // } // delete t; // // status = U_ZERO_ERROR; // t = new UnicodeToHexTransliterator("\\x", TRUE, NULL, status); // if (U_SUCCESS(status)) { // errln("FAIL: Created a UnicodeToHexTransliterator with a bad pattern."); // } // delete t; // // status = U_ZERO_ERROR; // t = new UnicodeToHexTransliterator(); // ((UnicodeToHexTransliterator*)t)->applyPattern("\\x", status); // if (U_SUCCESS(status)) { // errln("FAIL: UnicodeToHexTransliterator::applyPattern succeeded with a bad pattern."); // } // delete t; //} void TransliteratorErrorTest::TestRBTErrors() { UnicodeString rules="ab>y"; UnicodeString id="MyRandom-YReverse"; //UnicodeString goodPattern="[[:L:]&[\\u0000-\\uFFFF]]"; /* all BMP letters */ UErrorCode status = U_ZERO_ERROR; UParseError parseErr; /*UnicodeSet *set = new UnicodeSet(goodPattern, status); if (U_FAILURE(status)) { errln("FAIL: Was not able to create a good UnicodeSet based on valid patterns."); return; }*/ Transliterator *t = Transliterator::createFromRules(id, rules, UTRANS_REVERSE, parseErr, status); if (U_FAILURE(status)) { errln("FAIL: Was not able to create a good RBT to test registration."); //delete set; return; } Transliterator::registerInstance(t); Transliterator::unregister(id); status = U_ZERO_ERROR; Transliterator* t1= Transliterator::createInstance(id, UTRANS_REVERSE, parseErr, status); if(U_SUCCESS(status)){ delete t1; errln("FAIL: construction of unregistered ID failed."); } } //void TransliteratorErrorTest::TestHexToUniErrors() { // UErrorCode status = U_ZERO_ERROR; // Transliterator *t = new HexToUnicodeTransliterator("", NULL, status); // if (U_FAILURE(status)) { // errln("FAIL: Could not create a HexToUnicodeTransliterator with an empty pattern."); // } // delete t; // status = U_ZERO_ERROR; // t = new HexToUnicodeTransliterator("\\x", NULL, status); // if (U_SUCCESS(status)) { // errln("FAIL: Created a HexToUnicodeTransliterator with a bad pattern."); // } // delete t; // status = U_ZERO_ERROR; // t = new HexToUnicodeTransliterator(); // ((HexToUnicodeTransliterator*)t)->applyPattern("\\x", status); // if (U_SUCCESS(status)) { // errln("FAIL: HexToUnicodeTransliterator::applyPattern succeeded with a bad pattern."); // } // delete t; //} class StubTransliterator: public Transliterator{ public: StubTransliterator(): Transliterator(UNICODE_STRING_SIMPLE("Any-Null"), 0) {} virtual void handleTransliterate(Replaceable& ,UTransPosition& offsets,UBool) const { offsets.start = offsets.limit; } virtual UClassID getDynamicClassID() const{ static char classID = 0; return (UClassID)&classID; } }; void TransliteratorErrorTest::TestCoverage() { StubTransliterator stub; if (stub.clone() != NULL){ errln("FAIL: default Transliterator::clone() should return NULL"); } } #endif /* #if !UCONFIG_NO_TRANSLITERATION */