]> granicus.if.org Git - icu/commitdiff
ICU-13516 Defining behavior when an invalid code point is passed to foldCase.
authorShane Carr <shane@unicode.org>
Fri, 22 Dec 2017 23:44:35 +0000 (23:44 +0000)
committerShane Carr <shane@unicode.org>
Fri, 22 Dec 2017 23:44:35 +0000 (23:44 +0000)
X-SVN-Rev: 40748

icu4c/source/test/intltest/ucdtest.cpp
icu4c/source/test/intltest/ucdtest.h
icu4j/main/tests/core/src/com/ibm/icu/dev/test/lang/UCharacterCaseTest.java

index 489d6cdf275d82b4ff9e19ba5e29995b6c25db04..e5c5989b9fc67f74fa07d9c264a21c87b7d74a51 100644 (file)
@@ -63,6 +63,7 @@ void UnicodeTest::runIndexedTest( int32_t index, UBool exec, const char* &name,
     TESTCASE_AUTO(TestBidiPairedBracketType);
     TESTCASE_AUTO(TestEmojiProperties);
     TESTCASE_AUTO(TestDefaultScriptExtensions);
+    TESTCASE_AUTO(TestInvalidCodePointFolding);
     TESTCASE_AUTO_END;
 }
 
@@ -546,3 +547,21 @@ void UnicodeTest::TestDefaultScriptExtensions() {
                  uscript_getScriptExtensions(0x3012, scx, UPRV_LENGTHOF(scx), errorCode));
     assertEquals("U+3012 num scx[0]", USCRIPT_COMMON, scx[0]);
 }
+
+void UnicodeTest::TestInvalidCodePointFolding(void) {
+    // Test behavior when an invalid code point is passed to u_foldCase
+    static const UChar32 invalidCodePoints[] = {
+            0xD800, // lead surrogate
+            0xDFFF, // trail surrogate
+            0xFDD0, // noncharacter
+            0xFFFF, // noncharacter
+            0x110000, // out of range
+            -1 // negative
+    };
+    for (auto cp : invalidCodePoints) {
+        assertEquals("Invalid code points should be echoed back",
+                cp, u_foldCase(cp, U_FOLD_CASE_DEFAULT));
+        assertEquals("Invalid code points should be echoed back",
+                cp, u_foldCase(cp, U_FOLD_CASE_EXCLUDE_SPECIAL_I));
+    }
+}
index 82ffb0e8dcc7ebe4a5f058a38d3b53161aed86a0..8a7ae3f4ecf7f36bda93e24943d4cf89b5bf4f88 100644 (file)
@@ -42,6 +42,7 @@ public:
     void TestBidiPairedBracketType();
     void TestEmojiProperties();
     void TestDefaultScriptExtensions();
+    void TestInvalidCodePointFolding();
 
 private:
 
index 09e4e2ef6c3178986e04bb3e061275821ee03b0e..f54fbec2cce1c057ccef31817b65bde8e8b9d983 100644 (file)
@@ -192,6 +192,28 @@ public final class UCharacterCaseTest extends TestFmwk
         }
     }
 
+    @Test
+    public void TestInvalidCodePointFolding() {
+        int[] invalidCodePoints = {
+                0xD800, // lead surrogate
+                0xDFFF, // trail surrogate
+                0xFDD0, // noncharacter
+                0xFFFF, // noncharacter
+                0x110000, // out of range
+                -1 // negative
+        };
+        for (int cp : invalidCodePoints) {
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, true));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, false));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, UCharacter.FOLD_CASE_DEFAULT));
+            assertEquals("Invalid code points should be echoed back",
+                    cp, UCharacter.foldCase(cp, UCharacter.FOLD_CASE_EXCLUDE_SPECIAL_I));
+        }
+    }
+
     /**
      * Testing the strings case mapping methods
      */