#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: ");
TESTCASE_AUTO(testSeriesMatcher);
TESTCASE_AUTO(testCombinedCurrencyMatcher);
TESTCASE_AUTO(testAffixPatternMatcher);
+ TESTCASE_AUTO(test20360_BidiOverflow);
+ TESTCASE_AUTO(testInfiniteRecursion);
TESTCASE_AUTO_END;
}
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)) {
assertEquals(
"Non-Greedy Parse failed: " + message,
cas.expectedResultDouble,
- resultObject.getDouble());
+ resultObject.getDouble(status));
}
if (0 != (cas.flags & 0x04)) {
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));
}
}
}
}
}
+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