| 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
|
|
|
|
|