| Index: source/test/intltest/tzfmttst.cpp
|
| diff --git a/source/test/intltest/tzfmttst.cpp b/source/test/intltest/tzfmttst.cpp
|
| index ffdaeae279c62e374fe7df698060bb59bb5e6201..c3a03317cc40b4957e909358b1fdc76bdf706dd0 100644
|
| --- a/source/test/intltest/tzfmttst.cpp
|
| +++ b/source/test/intltest/tzfmttst.cpp
|
| @@ -1,6 +1,6 @@
|
| /*
|
| *******************************************************************************
|
| -* Copyright (C) 2007-2013, International Business Machines Corporation and *
|
| +* Copyright (C) 2007-2014, International Business Machines Corporation and *
|
| * others. All Rights Reserved. *
|
| *******************************************************************************
|
| */
|
| @@ -76,6 +76,7 @@ TimeZoneFormatTest::runIndexedTest( int32_t index, UBool exec, const char* &name
|
| TESTCASE(2, TestParse);
|
| TESTCASE(3, TestISOFormat);
|
| TESTCASE(4, TestFormat);
|
| + TESTCASE(5, TestFormatTZDBNames);
|
| default: name = ""; break;
|
| }
|
| }
|
| @@ -334,6 +335,40 @@ TimeZoneFormatTest::TestTimeZoneRoundTrip(void) {
|
| delete tzids;
|
| }
|
|
|
| +// Special exclusions in TestTimeZoneRoundTrip.
|
| +// These special cases do not round trip time as designed.
|
| +static UBool isSpecialTimeRoundTripCase(const char* loc,
|
| + const UnicodeString& id,
|
| + const char* pattern,
|
| + UDate time) {
|
| + struct {
|
| + const char* loc;
|
| + const char* id;
|
| + const char* pattern;
|
| + UDate time;
|
| + } EXCLUSIONS[] = {
|
| + {NULL, "Asia/Chita", "zzzz", 1414252800000.0},
|
| + {NULL, "Asia/Chita", "vvvv", 1414252800000.0},
|
| + {NULL, "Asia/Srednekolymsk", "zzzz", 1414241999999.0},
|
| + {NULL, "Asia/Srednekolymsk", "vvvv", 1414241999999.0},
|
| + {NULL, NULL, NULL, U_DATE_MIN}
|
| + };
|
| +
|
| + UBool isExcluded = FALSE;
|
| + for (int32_t i = 0; EXCLUSIONS[i].id != NULL; i++) {
|
| + if (EXCLUSIONS[i].loc == NULL || uprv_strcmp(loc, EXCLUSIONS[i].loc) == 0) {
|
| + if (id.compare(EXCLUSIONS[i].id) == 0) {
|
| + if (EXCLUSIONS[i].pattern == NULL || uprv_strcmp(pattern, EXCLUSIONS[i].pattern) == 0) {
|
| + if (EXCLUSIONS[i].time == U_DATE_MIN || EXCLUSIONS[i].time == time) {
|
| + isExcluded = TRUE;
|
| + }
|
| + }
|
| + }
|
| + }
|
| + }
|
| + return isExcluded;
|
| +}
|
| +
|
| struct LocaleData {
|
| int32_t index;
|
| int32_t testCounts;
|
| @@ -457,6 +492,11 @@ public:
|
| }
|
| }
|
|
|
| + if (*tzid == "Pacific/Apia" && uprv_strcmp(PATTERNS[patidx], "vvvv") == 0
|
| + && log.logKnownIssue("11052", "Ambiguous zone name - Samoa Time")) {
|
| + continue;
|
| + }
|
| +
|
| BasicTimeZone *tz = (BasicTimeZone*) TimeZone::createTimeZone(*tzid);
|
| sdf->setTimeZone(*tz);
|
|
|
| @@ -526,7 +566,9 @@ public:
|
| UnicodeString msg = (UnicodeString) "Time round trip failed for " + "tzid=" + *tzid + ", locale=" + data.locales[locidx].getName() + ", pattern=" + PATTERNS[patidx]
|
| + ", text=" + text + ", time=" + testTimes[testidx] + ", restime=" + parsedDate + ", diff=" + (parsedDate - testTimes[testidx]);
|
| // Timebomb for TZData update
|
| - if (expectedRoundTrip[testidx]) {
|
| + if (expectedRoundTrip[testidx]
|
| + && !isSpecialTimeRoundTripCase(data.locales[locidx].getName(), *tzid,
|
| + PATTERNS[patidx], testTimes[testidx])) {
|
| log.errln((UnicodeString) "FAIL: " + msg);
|
| } else if (REALLY_VERBOSE) {
|
| log.logln(msg);
|
| @@ -685,7 +727,7 @@ typedef struct {
|
| int32_t inPos;
|
| const char* locale;
|
| UTimeZoneFormatStyle style;
|
| - UBool parseAll;
|
| + uint32_t parseOptions;
|
| const char* expected;
|
| int32_t outPos;
|
| UTimeZoneFormatTimeType timeType;
|
| @@ -694,26 +736,94 @@ typedef struct {
|
| void
|
| TimeZoneFormatTest::TestParse(void) {
|
| const ParseTestData DATA[] = {
|
| - // text inPos locale style parseAll expected outPos timeType
|
| - {"Z", 0, "en_US", UTZFMT_STYLE_ISO_EXTENDED_FULL, false, "Etc/GMT", 1, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"Z", 0, "en_US", UTZFMT_STYLE_SPECIFIC_LONG, false, "Etc/GMT", 1, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"Zambia time", 0, "en_US", UTZFMT_STYLE_ISO_EXTENDED_FULL, true, "Etc/GMT", 1, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"Zambia time", 0, "en_US", UTZFMT_STYLE_GENERIC_LOCATION, false, "Africa/Lusaka", 11, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"Zambia time", 0, "en_US", UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL, true, "Africa/Lusaka", 11, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"+00:00", 0, "en_US", UTZFMT_STYLE_ISO_EXTENDED_FULL, false, "Etc/GMT", 6, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"-01:30:45", 0, "en_US", UTZFMT_STYLE_ISO_EXTENDED_FULL, false, "GMT-01:30:45", 9, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"-7", 0, "en_US", UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL, false, "GMT-07:00", 2, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"-2222", 0, "en_US", UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL, false, "GMT-22:22", 5, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"-3333", 0, "en_US", UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL, false, "GMT-03:33", 4, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"XXX+01:30YYY", 3, "en_US", UTZFMT_STYLE_LOCALIZED_GMT, false, "GMT+01:30", 9, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"GMT0", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT, false, "Etc/GMT", 3, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"EST", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT, false, "America/New_York", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| - {"ESTx", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT, false, "America/New_York", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| - {"EDTx", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT, false, "America/New_York", 3, UTZFMT_TIME_TYPE_DAYLIGHT},
|
| - {"EST", 0, "en_US", UTZFMT_STYLE_SPECIFIC_LONG, false, NULL, 0, UTZFMT_TIME_TYPE_UNKNOWN},
|
| - {"EST", 0, "en_US", UTZFMT_STYLE_SPECIFIC_LONG, true, "America/New_York", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| - {"EST", 0, "en_CA", UTZFMT_STYLE_SPECIFIC_SHORT, false, "America/Toronto", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| - {NULL, 0, NULL, UTZFMT_STYLE_GENERIC_LOCATION, false, NULL, 0, UTZFMT_TIME_TYPE_UNKNOWN}
|
| + // text inPos locale style
|
| + // parseOptions expected outPos timeType
|
| + {"Z", 0, "en_US", UTZFMT_STYLE_ISO_EXTENDED_FULL,
|
| + UTZFMT_PARSE_OPTION_NONE, "Etc/GMT", 1, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"Z", 0, "en_US", UTZFMT_STYLE_SPECIFIC_LONG,
|
| + UTZFMT_PARSE_OPTION_NONE, "Etc/GMT", 1, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"Zambia time", 0, "en_US", UTZFMT_STYLE_ISO_EXTENDED_FULL,
|
| + UTZFMT_PARSE_OPTION_ALL_STYLES, "Etc/GMT", 1, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"Zambia time", 0, "en_US", UTZFMT_STYLE_GENERIC_LOCATION,
|
| + UTZFMT_PARSE_OPTION_NONE, "Africa/Lusaka", 11, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"Zambia time", 0, "en_US", UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL,
|
| + UTZFMT_PARSE_OPTION_ALL_STYLES, "Africa/Lusaka", 11, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"+00:00", 0, "en_US", UTZFMT_STYLE_ISO_EXTENDED_FULL,
|
| + UTZFMT_PARSE_OPTION_NONE, "Etc/GMT", 6, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"-01:30:45", 0, "en_US", UTZFMT_STYLE_ISO_EXTENDED_FULL,
|
| + UTZFMT_PARSE_OPTION_NONE, "GMT-01:30:45", 9, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"-7", 0, "en_US", UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL,
|
| + UTZFMT_PARSE_OPTION_NONE, "GMT-07:00", 2, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"-2222", 0, "en_US", UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL,
|
| + UTZFMT_PARSE_OPTION_NONE, "GMT-22:22", 5, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"-3333", 0, "en_US", UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL,
|
| + UTZFMT_PARSE_OPTION_NONE, "GMT-03:33", 4, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"XXX+01:30YYY", 3, "en_US", UTZFMT_STYLE_LOCALIZED_GMT,
|
| + UTZFMT_PARSE_OPTION_NONE, "GMT+01:30", 9, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"GMT0", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_NONE, "Etc/GMT", 3, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"EST", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_NONE, "America/New_York", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"ESTx", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_NONE, "America/New_York", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"EDTx", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_NONE, "America/New_York", 3, UTZFMT_TIME_TYPE_DAYLIGHT},
|
| +
|
| + {"EST", 0, "en_US", UTZFMT_STYLE_SPECIFIC_LONG,
|
| + UTZFMT_PARSE_OPTION_NONE, NULL, 0, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"EST", 0, "en_US", UTZFMT_STYLE_SPECIFIC_LONG,
|
| + UTZFMT_PARSE_OPTION_ALL_STYLES, "America/New_York", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"EST", 0, "en_CA", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_NONE, "America/Toronto", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"CST", 0, "en_US", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_NONE, "America/Chicago", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"CST", 0, "en_GB", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_NONE, NULL, 0, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"CST", 0, "en_GB", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS, "America/Chicago", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"--CST--", 2, "en_GB", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS, "America/Chicago", 5, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"CST", 0, "zh_CN", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS, "Asia/Shanghai", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"AEST", 0, "en_AU", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS, "Australia/Sydney", 4, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"AST", 0, "ar_SA", UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS, "Asia/Riyadh", 3, UTZFMT_TIME_TYPE_STANDARD},
|
| +
|
| + {"AQTST", 0, "en", UTZFMT_STYLE_SPECIFIC_LONG,
|
| + UTZFMT_PARSE_OPTION_NONE, NULL, 0, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"AQTST", 0, "en", UTZFMT_STYLE_SPECIFIC_LONG,
|
| + UTZFMT_PARSE_OPTION_ALL_STYLES, NULL, 0, UTZFMT_TIME_TYPE_UNKNOWN},
|
| +
|
| + {"AQTST", 0, "en", UTZFMT_STYLE_SPECIFIC_LONG,
|
| + UTZFMT_PARSE_OPTION_ALL_STYLES | UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS, "Asia/Aqtobe", 5, UTZFMT_TIME_TYPE_DAYLIGHT},
|
| +
|
| + {NULL, 0, NULL, UTZFMT_STYLE_GENERIC_LOCATION,
|
| + UTZFMT_PARSE_OPTION_NONE, NULL, 0, UTZFMT_TIME_TYPE_UNKNOWN}
|
| };
|
|
|
| for (int32_t i = 0; DATA[i].text; i++) {
|
| @@ -725,8 +835,7 @@ TimeZoneFormatTest::TestParse(void) {
|
| }
|
| UTimeZoneFormatTimeType ttype = UTZFMT_TIME_TYPE_UNKNOWN;
|
| ParsePosition pos(DATA[i].inPos);
|
| - int32_t parseOptions = DATA[i].parseAll ? UTZFMT_PARSE_OPTION_ALL_STYLES : UTZFMT_PARSE_OPTION_NONE;
|
| - TimeZone* tz = tzfmt->parse(DATA[i].style, DATA[i].text, pos, parseOptions, &ttype);
|
| + TimeZone* tz = tzfmt->parse(DATA[i].style, DATA[i].text, pos, DATA[i].parseOptions, &ttype);
|
|
|
| UnicodeString errMsg;
|
| if (tz) {
|
| @@ -1025,4 +1134,102 @@ TimeZoneFormatTest::TestFormat(void) {
|
| }
|
| }
|
|
|
| +void
|
| +TimeZoneFormatTest::TestFormatTZDBNames(void) {
|
| + UDate dateJan = 1358208000000.0; // 2013-01-15T00:00:00Z
|
| + UDate dateJul = 1373846400000.0; // 2013-07-15T00:00:00Z
|
| +
|
| + const FormatTestData DATA[] = {
|
| + {
|
| + "en",
|
| + "America/Chicago",
|
| + dateJan,
|
| + UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + "CST",
|
| + UTZFMT_TIME_TYPE_STANDARD
|
| + },
|
| + {
|
| + "en",
|
| + "Asia/Shanghai",
|
| + dateJan,
|
| + UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + "CST",
|
| + UTZFMT_TIME_TYPE_STANDARD
|
| + },
|
| + {
|
| + "zh_Hans",
|
| + "Asia/Shanghai",
|
| + dateJan,
|
| + UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + "CST",
|
| + UTZFMT_TIME_TYPE_STANDARD
|
| + },
|
| + {
|
| + "en",
|
| + "America/Los_Angeles",
|
| + dateJul,
|
| + UTZFMT_STYLE_SPECIFIC_LONG,
|
| + "GMT-07:00", // No long display names
|
| + UTZFMT_TIME_TYPE_DAYLIGHT
|
| + },
|
| + {
|
| + "ja",
|
| + "America/Los_Angeles",
|
| + dateJul,
|
| + UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + "PDT",
|
| + UTZFMT_TIME_TYPE_DAYLIGHT
|
| + },
|
| + {
|
| + "en",
|
| + "Australia/Sydney",
|
| + dateJan,
|
| + UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + "AEDT",
|
| + UTZFMT_TIME_TYPE_DAYLIGHT
|
| + },
|
| + {
|
| + "en",
|
| + "Australia/Sydney",
|
| + dateJul,
|
| + UTZFMT_STYLE_SPECIFIC_SHORT,
|
| + "AEST",
|
| + UTZFMT_TIME_TYPE_STANDARD
|
| + },
|
| +
|
| + {0, 0, 0.0, UTZFMT_STYLE_GENERIC_LOCATION, 0, UTZFMT_TIME_TYPE_UNKNOWN}
|
| + };
|
| +
|
| + for (int32_t i = 0; DATA[i].locale; i++) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + Locale loc(DATA[i].locale);
|
| + LocalPointer<TimeZoneFormat> tzfmt(TimeZoneFormat::createInstance(loc, status));
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Fail TimeZoneFormat::createInstance: %s", u_errorName(status));
|
| + continue;
|
| + }
|
| + TimeZoneNames *tzdbNames = TimeZoneNames::createTZDBInstance(loc, status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln("Fail TimeZoneNames::createTZDBInstance: %s", u_errorName(status));
|
| + continue;
|
| + }
|
| + tzfmt->adoptTimeZoneNames(tzdbNames);
|
| +
|
| + LocalPointer<TimeZone> tz(TimeZone::createTimeZone(DATA[i].tzid));
|
| + UnicodeString out;
|
| + UTimeZoneFormatTimeType timeType;
|
| +
|
| + tzfmt->format(DATA[i].style, *(tz.getAlias()), DATA[i].date, out, &timeType);
|
| + UnicodeString expected(DATA[i].expected, -1, US_INV);
|
| + expected = expected.unescape();
|
| +
|
| + assertEquals(UnicodeString("Format result for ") + DATA[i].tzid + " (Test Case " + i + ")", expected, out);
|
| + if (DATA[i].timeType != timeType) {
|
| + dataerrln(UnicodeString("Formatted time zone type (Test Case ") + i + "), returned="
|
| + + timeType + ", expected=" + DATA[i].timeType);
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| #endif /* #if !UCONFIG_NO_FORMATTING */
|
|
|