]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/intltest/numbertest_parse.cpp
ICU-64232.0.1.tar.gz
[apple/icu.git] / icuSources / test / intltest / numbertest_parse.cpp
index d5276b4fac3fb53e4ffe45d155a1a36d16de495c..53c527cc06a08cd92e6830d66d7902ab1078c8c6 100644 (file)
@@ -14,8 +14,6 @@
 #include <cmath>
 #include <numparse_affixes.h>
 
-using icu::unisets::get;
-
 void NumberParserTest::runIndexedTest(int32_t index, UBool exec, const char*& name, char*) {
     if (exec) {
         logln("TestSuite NumberParserTest: ");
@@ -25,6 +23,8 @@ void NumberParserTest::runIndexedTest(int32_t index, UBool exec, const char*& na
         TESTCASE_AUTO(testSeriesMatcher);
         TESTCASE_AUTO(testCombinedCurrencyMatcher);
         TESTCASE_AUTO(testAffixPatternMatcher);
+        TESTCASE_AUTO(test20360_BidiOverflow);
+        TESTCASE_AUTO(testInfiniteRecursion);
     TESTCASE_AUTO_END;
 }
 
@@ -139,10 +139,10 @@ void NumberParserTest::testBasic() {
             ParsedNumber resultObject;
             parser->parse(inputString, true, resultObject, status);
             assertTrue("Greedy Parse failed: " + message, resultObject.success());
-            assertEquals(
-                    "Greedy Parse failed: " + message, cas.expectedCharsConsumed, resultObject.charEnd);
-            assertEquals(
-                    "Greedy Parse failed: " + message, cas.expectedResultDouble, resultObject.getDouble());
+            assertEquals("Greedy Parse failed: " + message,
+                cas.expectedCharsConsumed, resultObject.charEnd);
+            assertEquals("Greedy Parse failed: " + message,
+                cas.expectedResultDouble, resultObject.getDouble(status));
         }
 
         if (0 != (cas.flags & 0x02)) {
@@ -157,7 +157,7 @@ void NumberParserTest::testBasic() {
             assertEquals(
                     "Non-Greedy Parse failed: " + message,
                     cas.expectedResultDouble,
-                    resultObject.getDouble());
+                    resultObject.getDouble(status));
         }
 
         if (0 != (cas.flags & 0x04)) {
@@ -171,10 +171,10 @@ void NumberParserTest::testBasic() {
             ParsedNumber resultObject;
             parser->parse(inputString, true, resultObject, status);
             assertTrue("Strict Parse failed: " + message, resultObject.success());
-            assertEquals(
-                    "Strict Parse failed: " + message, cas.expectedCharsConsumed, resultObject.charEnd);
-            assertEquals(
-                    "Strict Parse failed: " + message, cas.expectedResultDouble, resultObject.getDouble());
+            assertEquals("Strict Parse failed: " + message,
+                cas.expectedCharsConsumed, resultObject.charEnd);
+            assertEquals("Strict Parse failed: " + message,
+                cas.expectedResultDouble, resultObject.getDouble(status));
         }
     }
 }
@@ -350,5 +350,59 @@ void NumberParserTest::testAffixPatternMatcher() {
     }
 }
 
+void NumberParserTest::test20360_BidiOverflow() {
+    IcuTestErrorCode status(*this, "test20360_BidiOverflow");
+    UnicodeString inputString;
+    inputString.append(u'-');
+    for (int32_t i=0; i<100000; i++) {
+        inputString.append(u'\u061C');
+    }
+    inputString.append(u'5');
+
+    LocalPointer<const NumberParserImpl> parser(NumberParserImpl::createSimpleParser("en", u"0", 0, status));
+    if (status.errDataIfFailureAndReset("createSimpleParser() failed")) {
+        return;
+    }
+
+    ParsedNumber resultObject;
+    parser->parse(inputString, true, resultObject, status);
+    assertTrue("Greedy Parse, success", resultObject.success());
+    assertEquals("Greedy Parse, chars consumed", 100002, resultObject.charEnd);
+    assertEquals("Greedy Parse, expected double", -5.0, resultObject.getDouble(status));
+
+    resultObject.clear();
+    parser->parse(inputString, false, resultObject, status);
+    assertFalse("Non-Greedy Parse, success", resultObject.success());
+    assertEquals("Non-Greedy Parse, chars consumed", 1, resultObject.charEnd);
+}
+
+void NumberParserTest::testInfiniteRecursion() {
+    IcuTestErrorCode status(*this, "testInfiniteRecursion");
+    UnicodeString inputString;
+    inputString.append(u'-');
+    for (int32_t i=0; i<200; i++) {
+        inputString.append(u'\u061C');
+    }
+    inputString.append(u'5');
+
+    LocalPointer<const NumberParserImpl> parser(NumberParserImpl::createSimpleParser("en", u"0", 0, status));
+    if (status.errDataIfFailureAndReset("createSimpleParser() failed")) {
+        return;
+    }
+
+    ParsedNumber resultObject;
+    parser->parse(inputString, false, resultObject, status);
+    assertFalse("Default recursion limit, success", resultObject.success());
+    assertEquals("Default recursion limit, chars consumed", 1, resultObject.charEnd);
+
+    parser.adoptInstead(NumberParserImpl::createSimpleParser(
+        "en", u"0", PARSE_FLAG_ALLOW_INFINITE_RECURSION, status));
+    resultObject.clear();
+    parser->parse(inputString, false, resultObject, status);
+    assertTrue("Unlimited recursion, success", resultObject.success());
+    assertEquals("Unlimited recursion, chars consumed", 202, resultObject.charEnd);
+    assertEquals("Unlimited recursion, expected double", -5.0, resultObject.getDouble(status));
+}
+
 
 #endif