From: Scott Russell Date: Mon, 16 Sep 2013 13:43:10 +0000 (+0000) Subject: ICU-10261 give DateFormat more granular leniency control (updated tests didn't get... X-Git-Tag: milestone-59-0-1~2521 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e22e451cd8100f394d6693e48823efb060092b34;p=icu ICU-10261 give DateFormat more granular leniency control (updated tests didn't get committed) X-SVN-Rev: 34328 --- diff --git a/icu4c/source/test/intltest/dtfmttst.cpp b/icu4c/source/test/intltest/dtfmttst.cpp index c5404f84a68..d364c3c2e40 100644 --- a/icu4c/source/test/intltest/dtfmttst.cpp +++ b/icu4c/source/test/intltest/dtfmttst.cpp @@ -100,6 +100,7 @@ void DateFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &nam TESTCASE_AUTO(TestRelativeOther); */ TESTCASE_AUTO(TestDotAndAtLeniency); + TESTCASE_AUTO(TestDateFormatLeniency); TESTCASE_AUTO_END; } @@ -3673,6 +3674,7 @@ void DateFormatTest::TestNumberAsStringParsing() } formatter->setLenient(itemPtr->lenient); + formatter->setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, itemPtr->lenient, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, itemPtr->lenient, status); UDate date1 = formatter->parse(itemPtr->dateString, status); if (U_FAILURE(status)) { if (!itemPtr->expectFail) { @@ -4191,6 +4193,61 @@ UBool DateFormatTest::showParse(DateFormat &format, const UnicodeString &formatt return ok; } + +typedef struct { + const char * locale; + UBool leniency; + UnicodeString parseString; + UnicodeString pattern; + UnicodeString expectedResult; // null indicates expected error +} TestDateFormatLeniencyItem; + +void DateFormatTest::TestDateFormatLeniency() { + // For details see http://bugs.icu-project.org/trac/ticket/10261 + + const UDate july022008 = 1215000001979.0; + const TestDateFormatLeniencyItem items[] = { + //locale leniency parse String pattern expected result + { "en", true, UnicodeString("2008-07 02"), UnicodeString("yyyy-LLLL dd"), UnicodeString("2008-July 02") }, + { "en", false, UnicodeString("2008-07 02"), UnicodeString("yyyy-LLLL dd"), NULL }, + { "en", true, UnicodeString("2008-Jan 02"), UnicodeString("yyyy-LLL. dd"), UnicodeString("2008-Jan 02") }, + { "en", false, UnicodeString("2008-Jan 02"), UnicodeString("yyyy-LLL. dd"), NULL }, + { "en", true, UnicodeString("2008-Jan--02"), UnicodeString("yyyy-MMM' -- 'dd"), UnicodeString("2008-Jan 02") }, + { "en", false, UnicodeString("2008-Jan--02"), UnicodeString("yyyy-MMM' -- 'dd"), NULL }, + // terminator + { NULL, true, UnicodeString(""), UnicodeString(""), UnicodeString("") } + }; + UErrorCode status = U_ZERO_ERROR; + Calendar* cal = Calendar::createInstance(status); + if (U_FAILURE(status)) { + dataerrln(UnicodeString("FAIL: Unable to create Calendar for default timezone and locale.")); + } else { + cal->setTime(july022008, status); + const TestDateFormatLeniencyItem * itemPtr; + for (itemPtr = items; itemPtr->locale != NULL; itemPtr++ ) { + + Locale locale = Locale::createFromName(itemPtr->locale); + status = U_ZERO_ERROR; + ParsePosition pos(0); + SimpleDateFormat * sdmft = new SimpleDateFormat(itemPtr->pattern, locale, status); + sdmft->setLenient(itemPtr->leniency); + sdmft->setBooleanAttribute(UDAT_PARSE_ALLOW_WHITESPACE, itemPtr->leniency, status).setBooleanAttribute(UDAT_PARSE_ALLOW_NUMERIC, itemPtr->leniency, status); + UDate d = sdmft->parse(itemPtr->parseString, pos); + + if(pos.getErrorIndex() > -1) + if(itemPtr->expectedResult != NULL) { + errln("error: unexpected error - " + itemPtr->parseString + " - error index " + pos.getErrorIndex() + " - leniency " + itemPtr->leniency); + continue; + } else + continue; + + + + } + } + +} + #endif /* #if !UCONFIG_NO_FORMATTING */ //eof diff --git a/icu4c/source/test/intltest/dtfmttst.h b/icu4c/source/test/intltest/dtfmttst.h index 829903fabe0..1cdfe8f7772 100644 --- a/icu4c/source/test/intltest/dtfmttst.h +++ b/icu4c/source/test/intltest/dtfmttst.h @@ -228,6 +228,9 @@ public: */ void TestDotAndAtLeniency(); + + void TestDateFormatLeniency(); + private: UBool showParse(DateFormat &format, const UnicodeString &formattedString);