]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/transtst.cpp
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / intltest / transtst.cpp
index d9d161b7817dfc1f33855fa9ec38236ded009369..6b263a988deb553e0ea9f8fedf5f438c58b27b1e 100644 (file)
@@ -1,3 +1,5 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 **********************************************************************
 *   Copyright (C) 1999-2016, International Business Machines
@@ -194,6 +196,7 @@ TransliteratorTest::runIndexedTest(int32_t index, UBool exec,
         TESTCASE(82,TestHalfwidthFullwidth);
         TESTCASE(83,TestThai);
         TESTCASE(84,TestAny);
+        TESTCASE(85,TestHansHant);
         default: name = ""; break;
     }
 }
@@ -241,7 +244,8 @@ void TransliteratorTest::TestInstantiation() {
         if (t == 0) {
 #if UCONFIG_NO_BREAK_ITERATION
             // If UCONFIG_NO_BREAK_ITERATION is on, then only Thai should fail.
-            if (id.compare((UnicodeString)"Thai-Latin") != 0)
+            if (id.compare((UnicodeString)"Thai-Latn") != 0 &&
+                id.compare((UnicodeString)"Thai-Latin") != 0)
 #endif
                 dataerrln(UnicodeString("FAIL: Couldn't create ") + id +
                       /*", parse error " + parseError.code +*/
@@ -654,7 +658,7 @@ int gTestFilterClassID = 0;
  * Used by TestFiltering().
  */
 class TestFilter : public UnicodeFilter {
-    virtual UnicodeFunctor* clone() const {
+    virtual TestFilter* clone() const {
         return new TestFilter(*this);
     }
     virtual UBool contains(UChar32 c) const {
@@ -1944,7 +1948,7 @@ class TestTrans : public Transliterator {
 public:
     TestTrans(const UnicodeString& id) : Transliterator(id, 0) {
     }
-    virtual Transliterator* clone(void) const {
+    virtual TestTrans* clone(void) const {
         return new TestTrans(getID());
     }
     virtual void handleTransliterate(Replaceable& /*text*/, UTransPosition& offsets,
@@ -2337,17 +2341,17 @@ void TransliteratorTest::TestCompoundFilterID(void) {
             exp = CharsToUnicodeString(DATA[i+3]);
         }
         UBool expOk = (DATA[i+1] != NULL);
-        Transliterator* t = NULL;
+        LocalPointer<Transliterator> t;
         UParseError pe;
         UErrorCode ec = U_ZERO_ERROR;
         if (id.charAt(0) == 0x23/*#*/) {
-            t = Transliterator::createFromRules("ID", id, direction, pe, ec);
+            t.adoptInstead(Transliterator::createFromRules("ID", id, direction, pe, ec));
         } else {
-            t = Transliterator::createInstance(id, direction, pe, ec);
+            t.adoptInstead(Transliterator::createInstance(id, direction, pe, ec));
         }
-        UBool ok = (t != NULL && U_SUCCESS(ec));
+        UBool ok = (t.isValid() && U_SUCCESS(ec));
         UnicodeString transID;
-        if (t!=0) {
+        if (t.isValid()) {
             transID = t->getID();
         }
         else {
@@ -2359,7 +2363,6 @@ void TransliteratorTest::TestCompoundFilterID(void) {
             if (source.length() != 0) {
                 expect(*t, source, exp);
             }
-            delete t;
         } else {
             dataerrln((UnicodeString)"FAIL: " + id + " => " + transID + ", " +
                   u_errorName(ec));
@@ -3173,12 +3176,12 @@ void TransliteratorTest::TestToRulesMark() {
     
     UParseError pe;
     UErrorCode ec = U_ZERO_ERROR;
-    Transliterator *t2 = Transliterator::createFromRules("source-target", UnicodeString(testRules, -1, US_INV), UTRANS_FORWARD, pe, ec);
-    Transliterator *t3 = Transliterator::createFromRules("target-source", UnicodeString(testRules, -1, US_INV), UTRANS_REVERSE, pe, ec);
+    LocalPointer<Transliterator> t2(
+            Transliterator::createFromRules("source-target", UnicodeString(testRules, -1, US_INV), UTRANS_FORWARD, pe, ec));
+    LocalPointer<Transliterator> t3(
+            Transliterator::createFromRules("target-source", UnicodeString(testRules, -1, US_INV), UTRANS_REVERSE, pe, ec));
 
     if (U_FAILURE(ec)) {
-        delete t2;
-        delete t3;
         dataerrln((UnicodeString)"FAIL: createFromRules => " + u_errorName(ec));
         return;
     }
@@ -3188,9 +3191,6 @@ void TransliteratorTest::TestToRulesMark() {
     
     checkRules("Failed toRules FORWARD", *t2, UnicodeString(testRulesForward, -1, US_INV));
     checkRules("Failed toRules BACKWARD", *t3, UnicodeString(testRulesBackward, -1, US_INV));
-
-    delete t2;
-    delete t3;
 }
 
 /**
@@ -3572,12 +3572,24 @@ void TransliteratorTest::TestIncrementalProgress(void) {
                 _trans(*t, test, rev);
                 Transliterator *inv = t->createInverse(status);
                 if (U_FAILURE(status)) {
+                    // The following are forward-only, it is OK that creating an inverse will not work:
+                    // 1. Devanagari-Arabic
+                    // 2. Any-*/BGN
+                    // 2a. Any-*/BGN_1981
+                    // 3. Any-*/UNGEGN
+                    // 4. Any-*/MNS
+                    // If UCONFIG_NO_BREAK_ITERATION is on, Latin-Thai is also not expected to work.
+                    if (    id.compare((UnicodeString)"Devanagari-Arabic/") != 0
+                         && !(id.startsWith((UnicodeString)"Any-") &&
+                                (id.endsWith((UnicodeString)"/BGN") || id.endsWith((UnicodeString)"/BGN_1981") || id.endsWith((UnicodeString)"/UNGEGN") || id.endsWith((UnicodeString)"/MNS"))
+                             )
 #if UCONFIG_NO_BREAK_ITERATION
-                    // If UCONFIG_NO_BREAK_ITERATION is on, then only Thai should fail.
-                    if (id.compare((UnicodeString)"Latin-Thai/") != 0)
+                         && id.compare((UnicodeString)"Latin-Thai/") != 0
 #endif
+                       )
+                    {
                         errln((UnicodeString)"FAIL: Could not create inverse of " + id);
-
+                    }
                     delete t;
                     delete inv;
                     continue;
@@ -3862,6 +3874,21 @@ void TransliteratorTest::TestAnyX(void) {
            CharsToUnicodeString("greek:abkABK hiragana:abuku cyrillic:abc"));
 
     delete anyLatin;
+
+    status = U_ZERO_ERROR;
+    Transliterator* anyASCII =
+        Transliterator::createInstance("Any-Latin;Latin-ASCII", UTRANS_FORWARD, parseError, status);
+    if (U_FAILURE(status) || anyASCII==0) {
+        dataerrln("FAIL: createInstance returned NULL and/or set status %s", u_errorName(status));
+        delete anyASCII;
+        return;
+    }
+
+    expect(*anyASCII,
+           CharsToUnicodeString("ArabicDigits:\\u0660\\u0661\\u0664\\u0669 PersianDigits:\\u06F0\\u06F1\\u06F4\\u06F9"),
+           CharsToUnicodeString("ArabicDigits:0149 PersianDigits:0149"));
+
+    delete anyASCII;
 }
 
 /**
@@ -4051,7 +4078,7 @@ void TransliteratorTest::TestAllCodepoints(){
 
 } 
 
-#define TEST_TRANSLIT_ID(id, cls) { \
+#define TEST_TRANSLIT_ID(id, cls) UPRV_BLOCK_MACRO_BEGIN { \
   UErrorCode ec = U_ZERO_ERROR; \
   Transliterator* t = Transliterator::createInstance(id, UTRANS_FORWARD, ec); \
   if (U_FAILURE(ec)) { \
@@ -4063,9 +4090,9 @@ void TransliteratorTest::TestAllCodepoints(){
     /* *t = *t; */ /*can't do this: coverage test for assignment op*/ \
   } \
   delete t; \
-}
+} UPRV_BLOCK_MACRO_END
 
-#define TEST_TRANSLIT_RULE(rule, cls) { \
+#define TEST_TRANSLIT_RULE(rule, cls) UPRV_BLOCK_MACRO_BEGIN { \
   UErrorCode ec = U_ZERO_ERROR; \
   UParseError pe; \
   Transliterator* t = Transliterator::createFromRules("_", rule, UTRANS_FORWARD, pe, ec); \
@@ -4078,7 +4105,7 @@ void TransliteratorTest::TestAllCodepoints(){
     /* *t = *t; */ /*can't do this: coverage test for assignment op*/ \
   } \
   delete t; \
-}
+} UPRV_BLOCK_MACRO_END
 
 void TransliteratorTest::TestBoilerplate() {
     TEST_TRANSLIT_ID("Any-Latin", AnyTransliterator);
@@ -4664,6 +4691,32 @@ void TransliteratorTest::TestThai(void) {
 #endif
 }
 
+/**
+ * Test for rdar://problem/61817095 (and maybe eventually other Hans-Hant errors)
+ * Apple-only
+ * ICU4C only
+ */
+void TransliteratorTest::TestHansHant(void) {
+    UParseError parseError;
+    UErrorCode status = U_ZERO_ERROR;
+    Transliterator* tr = Transliterator::createInstance("Hans-Hant", UTRANS_FORWARD, parseError, status);
+    if (U_FAILURE(status)) {
+        errln("FAIL: createInstance failed with %s", u_errorName(status));
+        return;
+    }
+    
+    const char* _sourceText =     "\\u810f \\u5185\\u810f \\u810f\\u5668 \\u4e94\\u810f \\u5fc3\\u810f \\u809d\\u810f \\u813e\\u810f \\u80c3\\u810f \\u80be\\u810f \\u80f0\\u810f \\u810f\\u8151 \\u80ba\\u810f";
+    const char* _expectedResult = "\\u9ad2 \\u5167\\u81df \\u81df\\u5668 \\u4e94\\u81df \\u5fc3\\u81df \\u809d\\u81df \\u813e\\u81df \\u80c3\\u81df \\u814e\\u81df \\u80f0\\u81df \\u81df\\u8151 \\u80ba\\u81df";
+    
+    UnicodeString sourceText(_sourceText);
+    UnicodeString expectedResult(_expectedResult);
+    sourceText = sourceText.unescape();
+    expectedResult = expectedResult.unescape();
+    
+    expect(*tr, sourceText, expectedResult);
+    delete tr;
+}
+
 
 //======================================================================
 // Support methods