Index: icu46/source/test/intltest/trnserr.cpp |
=================================================================== |
--- icu46/source/test/intltest/trnserr.cpp (revision 0) |
+++ icu46/source/test/intltest/trnserr.cpp (revision 0) |
@@ -0,0 +1,283 @@ |
+/******************************************************************** |
+ * 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 */ |
Property changes on: icu46/source/test/intltest/trnserr.cpp |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |