X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/4388f060552cc537e71e957d32f35e9d75a61233..4f1e1a09ce4daed860e35d359ce2fceccb0764e8:/icuSources/test/intltest/dtfmtrtts.cpp diff --git a/icuSources/test/intltest/dtfmtrtts.cpp b/icuSources/test/intltest/dtfmtrtts.cpp index a8fd9669..2206d0fe 100644 --- a/icuSources/test/intltest/dtfmtrtts.cpp +++ b/icuSources/test/intltest/dtfmtrtts.cpp @@ -1,6 +1,8 @@ +// © 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html /*********************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2010, International Business Machines Corporation + * Copyright (c) 1997-2015, International Business Machines Corporation * and others. All Rights Reserved. ***********************************************************************/ @@ -13,6 +15,7 @@ #include "unicode/gregocal.h" #include "dtfmtrtts.h" #include "caltest.h" +#include "cstring.h" #include #include @@ -28,8 +31,6 @@ #define INFINITE 0 #endif -static const UVersionInfo ICU_452 = {4,5,2,0}; - // Define this to test just a single locale //#define TEST_ONE_LOC "cs_CZ" @@ -171,7 +172,7 @@ void DateFormatRoundTripTest::TestDateFormatRoundTrip() #if 1 // installed locales for (int i=0; i < locCount; ++i) { - test(avail[i]); + test(avail[i]); } #endif @@ -248,7 +249,7 @@ void DateFormatRoundTripTest::test(const Locale& loc) for(style = DateFormat::FULL; style <= DateFormat::SHORT; ++style) { if (TEST_TABLE[itable++]) { - logln("Testing style " + UnicodeString(styleName((DateFormat::EStyle)style))); + logln("Testing style " + UnicodeString(styleName((DateFormat::EStyle)style))); DateFormat *df = DateFormat::createTimeInstance((DateFormat::EStyle)style, loc); if(df == NULL) { errln(UnicodeString("Could not DF::createTimeInstance ") + UnicodeString(styleName((DateFormat::EStyle)style)) + " Locale: " + loc.getDisplayName(temp)); @@ -285,6 +286,10 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB UBool isGregorian = FALSE; UErrorCode minStatus = U_ZERO_ERROR; + if(fmt->getCalendar() == NULL) { + errln((UnicodeString)"DateFormatRoundTripTest::test, DateFormat getCalendar() returns null for " + origLocale.getName()); + return; + } UDate minDate = CalendarTest::minDateOfCalendar(*fmt->getCalendar(), isGregorian, minStatus); if(U_FAILURE(minStatus)) { errln((UnicodeString)"Failure getting min date for " + origLocale.getName()); @@ -335,7 +340,7 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB for(loop = 0; loop < DEPTH; ++loop) { if (loop > 0) { d[loop] = fmt->parse(s[loop-1], status); - failure(status, "fmt->parse", s[loop-1]+" in locale: " + origLocale.getName()); + failure(status, "fmt->parse", s[loop-1]+" in locale: " + origLocale.getName() + " with pattern: " + pat); status = U_ZERO_ERROR; /* any error would have been reported */ } @@ -433,14 +438,34 @@ void DateFormatRoundTripTest::test(DateFormat *fmt, const Locale &origLocale, UB else if (hasZoneDisplayName && d[0] < 0) { maxSmatch = 2; } + else if (timeOnly && !isGregorian && hasZoneDisplayName && maxSmatch == 1) { + int32_t startRaw, startDst; + fmt->getTimeZone().getOffset(d[1], FALSE, startRaw, startDst, status); + failure(status, "TimeZone::getOffset"); + // If the calendar type is not Gregorian and the pattern is time only, + // the calendar implementation may use a date before 1970 as day 0. + // In this case, time zone offset of the default year might be + // different from the one at 1970-01-01 in PST and string match requires + // one more iteration. + if (startRaw + startDst != -28800000) { + maxSmatch = 2; + } + } } - if(dmatch > maxDmatch || smatch > maxSmatch) { // Special case for Japanese and Islamic (could have large negative years) + /* + * Special case for Japanese and Buddhist (could have large negative years) + * Also, Hebrew calendar need help handling leap month. + */ + if(dmatch > maxDmatch || smatch > maxSmatch) { const char *type = fmt->getCalendar()->getType(); if(!strcmp(type,"japanese") || (!strcmp(type,"buddhist"))) { maxSmatch = 4; maxDmatch = 4; - } + } else if(!strcmp(type,"hebrew")) { + maxSmatch = 3; + maxDmatch = 3; + } } // Use @v to see verbose results on successful cases @@ -509,13 +534,16 @@ UnicodeString& DateFormatRoundTripTest::escape(const UnicodeString& src, Unicode { dst.remove(); for (int32_t i = 0; i < src.length(); ++i) { - UChar c = src[i]; - if(c < 0x0080) + UChar32 c = src.char32At(i); + if (c >= 0x10000) { + ++i; + } + if (c < 0x0080) { dst += c; - else { + } else { dst += UnicodeString("["); - char buf [8]; - sprintf(buf, "%#x", c); + char buf [12]; + sprintf(buf, "%#04x", c); dst += UnicodeString(buf); dst += UnicodeString("]"); }