16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/******************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Corporation and others. All Rights Reserved. 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/ 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/simpletz.h" 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/smpdtfmt.h" 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/strenum.h" 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "tzregts.h" 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "calregts.h" 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ***************************************************************************** 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// class TimeZoneRegressionTest 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ***************************************************************************** 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* length of an array */ 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0])) 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZoneRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // if (exec) logln((UnicodeString)"TestSuite NumberFormatRegressionTest"); 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (index) { 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(0, Test4052967); 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(1, Test4073209); 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(2, Test4073215); 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(3, Test4084933); 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(4, Test4096952); 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(5, Test4109314); 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(6, Test4126678); 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(7, Test4151406); 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(8, Test4151429); 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(9, Test4154537); 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(10, Test4154542); 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(11, Test4154650); 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(12, Test4154525); 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(13, Test4162593); 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(14, TestJ186); 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(15, TestJ449); 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(16, TestJDK12API); 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(17, Test4176686); 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CASE(18, Test4184229); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org default: name = ""; break; 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZoneRegressionTest::failure(UErrorCode status, const char* msg) 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status)); 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return TRUE; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return FALSE; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4052967 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4052967() { 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // {sfb} not applicable in C++ ? 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*logln("*** CHECK TIMEZONE AGAINST HOST OS SETTING ***"); 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("user.timezone:" + System.getProperty("user.timezone", "<not set>")); 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(new Date().toString()); 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");*/ 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4073209 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4073209() { 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *z1 = TimeZone::createTimeZone("PST"); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *z2 = TimeZone::createTimeZone("PST"); 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (z1 == z2) 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: TimeZone should return clones"); 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete z1; 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete z2; 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUDate TimeZoneRegressionTest::findTransitionBinary(const SimpleTimeZone& tz, UDate min, UDate max) { 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool startsInDST = tz.inDaylightTime(min, status); 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tz.inDaylightTime(max, status) == startsInDST) { 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln((UnicodeString)"Error: inDaylightTime() != " + ((!startsInDST)?"TRUE":"FALSE")); 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0; 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while ((max - min) > 100) { // Min accuracy in ms 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate mid = (min + max) / 2; 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tz.inDaylightTime(mid, status) == startsInDST) { 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org min = mid; 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org max = mid; 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0; 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return (min + max) / 2; 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUDate TimeZoneRegressionTest::findTransitionStepwise(const SimpleTimeZone& tz, UDate min, UDate max) { 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool startsInDST = tz.inDaylightTime(min, status); 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0; 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (min < max) { 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tz.inDaylightTime(min, status) != startsInDST) { 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return min; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0; 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org min += (UDate)24*60*60*1000; // one day 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4073215 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// {sfb} will this work using a Calendar? 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4073215() 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString str, str2; 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *z = new SimpleTimeZone(0, "GMT"); 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (z->useDaylightTime()) 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: Fix test to start with non-DST zone"); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z->setStartRule(UCAL_FEBRUARY, 1, UCAL_SUNDAY, 0, status); 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "z->setStartRule()"); 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z->setEndRule(UCAL_MARCH, -1, UCAL_SUNDAY, 0, status); 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "z->setStartRule()"); 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!z->useDaylightTime()) 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: DST not active"); 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GregorianCalendar cal(1997, UCAL_JANUARY, 31, status); 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Error creating calendar %s", u_errorName(status)); 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "new GregorianCalendar"); 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal.adoptTimeZone(z); 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleDateFormat sdf((UnicodeString)"E d MMM yyyy G HH:mm", status); 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Error creating date format %s", u_errorName(status)); 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sdf.setCalendar(cal); 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "new SimpleDateFormat"); 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate jan31, mar1, mar31; 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool indt = z->inDaylightTime(jan31=cal.getTime(status), status); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "inDaylightTime or getTime call on Jan 31"); 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (indt) { 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: Jan 31 inDaylightTime=TRUE, exp FALSE"); 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal.set(1997, UCAL_MARCH, 1); 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org indt = z->inDaylightTime(mar1=cal.getTime(status), status); 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "inDaylightTime or getTime call on Mar 1"); 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!indt) { 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString str; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sdf.format(cal.getTime(status), str); 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "getTime"); 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"Fail: " + str + " inDaylightTime=FALSE, exp TRUE"); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal.set(1997, UCAL_MARCH, 31); 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org indt = z->inDaylightTime(mar31=cal.getTime(status), status); 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "inDaylightTime or getTime call on Mar 31"); 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (indt) { 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: Mar 31 inDaylightTime=TRUE, exp FALSE"); 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal.set(1997, Calendar::DECEMBER, 31); 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate dec31 = cal.getTime(status); 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "getTime"); 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate trans = findTransitionStepwise(*z, jan31, dec31); 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln((UnicodeString)"Stepwise from " + 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sdf.format(jan31, str.remove()) + "; transition at " + 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE")); 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org trans = findTransitionStepwise(*z, mar1, dec31); 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln((UnicodeString)"Stepwise from " + 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sdf.format(mar1, str.remove()) + "; transition at " + 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE")); 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org trans = findTransitionStepwise(*z, mar31, dec31); 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln((UnicodeString)"Stepwise from " + 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sdf.format(mar31, str.remove()) + "; transition at " + 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE")); 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4084933 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The expected behavior of TimeZone around the boundaries is: 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (Assume transition time of 2:00 AM) 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * day of onset 1:59 AM STD = display name 1:59 AM ST 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 2:00 AM STD = display name 3:00 AM DT 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * day of end 0:59 AM STD = display name 1:59 AM DT 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 1:00 AM STD = display name 1:00 AM ST 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4084933() { 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *tz = TimeZone::createTimeZone("PST"); 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset1 = tz->getOffset(1, 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), status); 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset2 = tz->getOffset(1, 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000)-1, status); 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset3 = tz->getOffset(1, 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (1*60*60*1000), status); 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset4 = tz->getOffset(1, 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (1*60*60*1000)-1, status); 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The following was added just for consistency. It shows that going *to* Daylight 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Savings Time (PDT) does work at 2am. 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset5 = tz->getOffset(1, 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_APRIL, 6, UCAL_SUNDAY, (2*60*60*1000), status); 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset6 = tz->getOffset(1, 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_APRIL, 6, UCAL_SUNDAY, (2*60*60*1000)-1, status); 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset5a = tz->getOffset(1, 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_APRIL, 6, UCAL_SUNDAY, (3*60*60*1000), status); 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset6a = tz->getOffset(1, 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_APRIL, 6, UCAL_SUNDAY, (3*60*60*1000)-1, status); 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset7 = tz->getOffset(1, 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_APRIL, 6, UCAL_SUNDAY, (1*60*60*1000), status); 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset8 = tz->getOffset(1, 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_APRIL, 6, UCAL_SUNDAY, (1*60*60*1000)-1, status); 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t SToffset = (int32_t)(-8 * 60*60*1000L); 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t DToffset = (int32_t)(-7 * 60*60*1000L); 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ERR_IF_FAIL(x) if(x) { dataerrln("FAIL: TimeZone misbehaving - %s", #x); } 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(U_FAILURE(status)) 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset1 != SToffset) 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset2 != SToffset) 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset3 != SToffset) 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset4 != DToffset) 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset5 != DToffset) 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset6 != SToffset) 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset5a != DToffset) 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset6a != DToffset) 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset7 != SToffset) 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ERR_IF_FAIL(offset8 != SToffset) 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#undef ERR_IF_FAIL 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tz; 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4096952 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4096952() { 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // {sfb} serialization not applicable 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString ZONES [] = { UnicodeString("GMT"), UnicodeString("MET"), UnicodeString("IST") }; 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool pass = TRUE; 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //try { 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i=0; i < ZONES.length; ++i) { 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *zone = TimeZone::createTimeZone(ZONES[i]); 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString id; 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (zone->getID(id) != ZONES[i]) 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: Test broken; zones not instantiating"); 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ByteArrayOutputStream baos; 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ObjectOutputStream ostream = 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org new ObjectOutputStream(baos = new 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ByteArrayOutputStream()); 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ostream.writeObject(zone); 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ostream.close(); 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org baos.close(); 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ObjectInputStream istream = 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org new ObjectInputStream(new 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ByteArrayInputStream(baos.toByteArray())); 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone frankenZone = (TimeZone) istream.readObject(); 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //logln("Zone: " + zone); 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //logln("FrankenZone: " + frankenZone); 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!zone.equals(frankenZone)) { 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("TimeZone " + zone.getID() + 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " not equal to serialized/deserialized one"); 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pass = false; 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!pass) errln("Fail: TimeZone serialization/equality bug"); 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org catch (IOException e) { 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: " + e); 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org e.print32_tStackTrace(); 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org catch (ClassNotFoundException e) { 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: " + e); 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org e.print32_tStackTrace(); 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4109314 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4109314() { 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GregorianCalendar *testCal = (GregorianCalendar*)Calendar::createInstance(status); 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Error creating calendar %s", u_errorName(status)); 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete testCal; 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "Calendar::createInstance"); 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *PST = TimeZone::createTimeZone("PST"); 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*Object[] testData = { 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org PST, new Date(98,Calendar.APRIL,4,22,0), new Date(98, Calendar.APRIL, 5,6,0), 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org PST, new Date(98,Calendar.OCTOBER,24,22,0), new Date(98,Calendar.OCTOBER,25,6,0), 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org };*/ 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate testData [] = { 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CalendarRegressionTest::makeDate(98,UCAL_APRIL,4,22,0), 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CalendarRegressionTest::makeDate(98, UCAL_APRIL,5,6,0), 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CalendarRegressionTest::makeDate(98,UCAL_OCTOBER,24,22,0), 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CalendarRegressionTest::makeDate(98,UCAL_OCTOBER,25,6,0) 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool pass = TRUE; 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < 4; i+=2) { 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //testCal->setTimeZone((TimeZone) testData[i]); 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testCal->setTimeZone(*PST); 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate t = testData[i]; 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate end = testData[i+1]; 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(testCal->getTime(status) < end) { 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testCal->setTime(t, status); 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( ! checkCalendar314(testCal, PST)) 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pass = FALSE; 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org t += 60*60*1000.0; 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if ( ! pass) 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: TZ API inconsistent"); 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete testCal; 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete PST; 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZoneRegressionTest::checkCalendar314(GregorianCalendar *testCal, TimeZone *testTZ) 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // GregorianCalendar testCal = (GregorianCalendar)aCal.clone(); 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t tzOffset, tzRawOffset; 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org float tzOffsetFloat,tzRawOffsetFloat; 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Here is where the user made an error. They were passing in the value of 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // the MILLSECOND field; you need to pass in the millis in the day in STANDARD 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // time. 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate millis = testCal->get(UCAL_MILLISECOND, status) + 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1000.0 * (testCal->get(UCAL_SECOND, status) + 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 60.0 * (testCal->get(UCAL_MINUTE, status) + 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 60.0 * (testCal->get(UCAL_HOUR_OF_DAY, status)))) - 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testCal->get(UCAL_DST_OFFSET, status); 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Fix up millis to be in range. ASSUME THAT WE ARE NOT AT THE 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * BEGINNING OR END OF A MONTH. We must add this code because 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * getOffset() has been changed to be more strict about the parameters 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * it receives -- it turns out that this test was passing in illegal 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * values. */ 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t date = testCal->get(UCAL_DATE, status); 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t dow = testCal->get(UCAL_DAY_OF_WEEK, status); 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while(millis < 0) { 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org millis += U_MILLIS_PER_DAY; 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org --date; 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dow = UCAL_SUNDAY + ((dow - UCAL_SUNDAY + 6) % 7); 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org while (millis >= U_MILLIS_PER_DAY) { 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org millis -= U_MILLIS_PER_DAY; 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++date; 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dow = UCAL_SUNDAY + ((dow - UCAL_SUNDAY + 1) % 7); 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzOffset = testTZ->getOffset((uint8_t)testCal->get(UCAL_ERA, status), 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testCal->get(UCAL_YEAR, status), 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org testCal->get(UCAL_MONTH, status), 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org date, 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (uint8_t)dow, 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int32_t)millis, 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status); 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzRawOffset = testTZ->getRawOffset(); 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzOffsetFloat = (float)tzOffset/(float)3600000; 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tzRawOffsetFloat = (float)tzRawOffset/(float)3600000; 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate testDate = testCal->getTime(status); 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool inDaylightTime = testTZ->inDaylightTime(testDate, status); 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)"MM/dd/yyyy HH:mm", status); 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org sdf->setCalendar(*testCal); 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString inDaylightTimeString; 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool passed; 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(inDaylightTime) 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inDaylightTimeString = " DST "; 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org passed = (tzOffset == (tzRawOffset + 3600000)); 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inDaylightTimeString = " "; 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org passed = (tzOffset == tzRawOffset); 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString output; 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FieldPosition pos(0); 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org output = testTZ->getID(output) + " " + sdf->format(testDate, output, pos) + 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " Offset(" + tzOffsetFloat + ")" + 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " RawOffset(" + tzRawOffsetFloat + ")" + 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org " " + millis/(float)3600000 + " " + 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inDaylightTimeString; 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (passed) 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org output += " "; 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org output += "ERROR"; 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (passed) 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(output); 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(output); 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete sdf; 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return passed; 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4126678 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * CANNOT REPRODUDE 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Yet another _alleged_ bug in TimeZone::getOffset(), a method that never 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * should have been made public. It's simply too hard to use correctly. 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The original test code failed to do the following: 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (1) Call Calendar::setTime() before getting the fields! 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (2) Use the right millis (as usual) for getOffset(); they were passing 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in the MILLIS field, instead of the STANDARD MILLIS IN DAY. 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * When you fix these two problems, the test passes, as expected. 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4126678() 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Calendar *cal = Calendar::createInstance(status); 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Error creating calendar %s", u_errorName(status)); 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete cal; 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "Calendar::createInstance"); 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *tz = TimeZone::createTimeZone("PST"); 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal->adoptTimeZone(tz); 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal->set(1998, UCAL_APRIL, 5, 10, 0); 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (! tz->useDaylightTime() || U_FAILURE(status)) 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("We're not in Daylight Savings Time and we should be. - %s", u_errorName(status)); 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //cal.setTime(dt); 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t era = cal->get(UCAL_ERA, status); 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t year = cal->get(UCAL_YEAR, status); 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t month = cal->get(UCAL_MONTH, status); 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t day = cal->get(UCAL_DATE, status); 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t dayOfWeek = cal->get(UCAL_DAY_OF_WEEK, status); 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t millis = cal->get(UCAL_MILLISECOND, status) + 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (cal->get(UCAL_SECOND, status) + 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (cal->get(UCAL_MINUTE, status) + 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (cal->get(UCAL_HOUR, status) * 60) * 60) * 1000) - 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal->get(UCAL_DST_OFFSET, status); 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "cal->get"); 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset = tz->getOffset((uint8_t)era, year, month, day, (uint8_t)dayOfWeek, millis, status); 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t raw_offset = tz->getRawOffset(); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (offset == raw_offset) 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Offsets should match"); 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete cal; 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4151406 4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TimeZone::getAvailableIDs(int32_t) throws exception for certain values, 4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * due to a faulty constant in TimeZone::java. 4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4151406() { 4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t max = 0; 4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t h=-28; h<=30; ++h) { 4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // h is in half-hours from GMT; rawoffset is in millis 4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t rawoffset = h * 1800000; 5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t hh = (h<0) ? -h : h; 5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString hname = UnicodeString((h<0) ? "GMT-" : "GMT+") + 5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ((hh/2 < 10) ? "0" : "") + 5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (hh/2) + ':' + 5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ((hh%2==0) ? "00" : "30"); 5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //try { 5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t count; 5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringEnumeration* ids = TimeZone::createEnumeration(rawoffset); 5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ids == NULL) { 5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Fail: TimeZone::createEnumeration(rawoffset)"); 5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org continue; 5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org count = ids->count(ec); 5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count> max) 5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org max = count; 5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (count > 0) { 5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(hname + ' ' + (UnicodeString)count + (UnicodeString)" e.g. " + *ids->snext(ec)); 5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(hname + ' ' + count); 5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // weiv 11/27/2002: why uprv_free? This should be a delete 5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete ids; 5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //delete [] ids; 5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //uprv_free(ids); 5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*} catch (Exception e) { 5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(hname + ' ' + "Fail: " + e); 5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }*/ 5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("Maximum zones per offset = %d", max); 5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4151429 5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4151429() { 5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // {sfb} silly test in C++, since we are using an enum and not an int 5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //try { 5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*TimeZone *tz = TimeZone::createTimeZone("GMT"); 5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString name; 5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tz->getDisplayName(TRUE, TimeZone::LONG, 5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Locale.getDefault(), name); 5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("IllegalArgumentException not thrown by TimeZone::getDisplayName()");*/ 5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} catch(IllegalArgumentException e) {} 5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4154537 5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * SimpleTimeZone::hasSameRules() doesn't work for zones with no DST 5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and different DST parameters. 5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4154537() { 5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // tz1 and tz2 have no DST and different rule parameters 5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *tz1 = new SimpleTimeZone(0, "1", 0, 0, 0, 0, 2, 0, 0, 0, status); 5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *tz2 = new SimpleTimeZone(0, "2", 1, 0, 0, 0, 3, 0, 0, 0, status); 5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // tza and tzA have the same rule params 5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *tza = new SimpleTimeZone(0, "a", 0, 1, 0, 0, 3, 2, 0, 0, status); 5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *tzA = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 3, 2, 0, 0, status); 5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // tzb differs from tza 5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *tzb = new SimpleTimeZone(0, "b", 0, 1, 0, 0, 3, 1, 0, 0, status); 5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) 5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Couldn't create TimeZones"); 5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (tz1->useDaylightTime() || tz2->useDaylightTime() || 5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org !tza->useDaylightTime() || !tzA->useDaylightTime() || 5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org !tzb->useDaylightTime()) { 5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Test is broken -- rewrite it"); 5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!tza->hasSameRules(*tzA) || tza->hasSameRules(*tzb)) { 5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: hasSameRules() broken for zones with rules"); 5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!tz1->hasSameRules(*tz2)) { 5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: hasSameRules() returns false for zones without rules"); 5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //errln("zone 1 = " + tz1); 5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //errln("zone 2 = " + tz2); 5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tz1; 5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tz2; 5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tza; 5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tzA; 5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tzb; 5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4154542 5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * SimpleTimeZOne constructors, setStartRule(), and setEndRule() don't 5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * check for out-of-range arguments. 5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest:: Test4154542() 5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD = 1; 5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t BAD = 0; 5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD_MONTH = UCAL_JANUARY; 5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD_DAY = 1; 5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD_DAY_OF_WEEK = UCAL_SUNDAY; 5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD_TIME = 0; 6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t DATA [] = { 6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, INT32_MIN, 0, INT32_MAX, INT32_MIN, 6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, UCAL_JANUARY, -5, UCAL_SUNDAY, 0, 6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, UCAL_DECEMBER, 5, UCAL_SATURDAY, 24*60*60*1000, 6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_DECEMBER, 5, UCAL_SATURDAY, 24*60*60*1000+1, 6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_DECEMBER, 5, UCAL_SATURDAY, -1, 6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_JANUARY, -6, UCAL_SUNDAY, 0, 6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_DECEMBER, 6, UCAL_SATURDAY, 24*60*60*1000, 6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, UCAL_DECEMBER, 1, 0, 0, 6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, UCAL_DECEMBER, 31, 0, 0, 6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_APRIL, 31, 0, 0, 6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_DECEMBER, 32, 0, 0, 6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_JANUARY-1, 1, UCAL_SUNDAY, 0, 6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_DECEMBER+1, 1, UCAL_SUNDAY, 0, 6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, UCAL_DECEMBER, 31, -UCAL_SUNDAY, 0, 6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, UCAL_DECEMBER, 31, -UCAL_SATURDAY, 0, 6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_DECEMBER, 32, -UCAL_SATURDAY, 0, 6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_DECEMBER, -32, -UCAL_SATURDAY, 0, 6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, UCAL_DECEMBER, 31, -UCAL_SATURDAY-1, 0, 6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *zone = new SimpleTimeZone(0, "Z"); 6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i=0; i < 18*5; i+=5) { 6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool shouldBeGood = (DATA[i] == GOOD); 6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t month = DATA[i+1]; 6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t day = DATA[i+2]; 6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t dayOfWeek = DATA[i+3]; 6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t time = DATA[i+4]; 6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //Exception ex = null; 6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //try { 6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone->setStartRule(month, day, dayOfWeek, time, status); 6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} catch (IllegalArgumentException e) { 6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ex = e; 6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} 6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status) != shouldBeGood) { 6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("setStartRule(month=") + month + ", day=" + day + 6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ", dayOfWeek=" + dayOfWeek + ", time=" + time + 6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (shouldBeGood ? (") should work") 6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : ") should fail but doesn't")); 6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //ex = null; 6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //try { 6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone->setEndRule(month, day, dayOfWeek, time, status); 6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} catch (IllegalArgumentException e) { 6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ex = e; 6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} 6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status) != shouldBeGood) { 6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("setEndRule(month=") + month + ", day=" + day + 6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ", dayOfWeek=" + dayOfWeek + ", time=" + time + 6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (shouldBeGood ? (") should work") 6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : ") should fail but doesn't")); 6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //ex = null; 6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //try { 6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // {sfb} need to look into ctor problems! (UErrorCode vs. dst signature confusion) 6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *temp = new SimpleTimeZone(0, "Z", 6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time, 6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK, 6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD_TIME,status); 6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} catch (IllegalArgumentException e) { 6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ex = e; 6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} 6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status) != shouldBeGood) { 6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("SimpleTimeZone(month=") + month + ", day=" + day + 6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ", dayOfWeek=" + dayOfWeek + ", time=" + time + 6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (shouldBeGood ? (", <end>) should work")// + ex) 6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : ", <end>) should fail but doesn't")); 6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete temp; 6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //ex = null; 6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //try { 6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org temp = new SimpleTimeZone(0, "Z", 6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK, 6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD_TIME, 6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,status); 6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} catch (IllegalArgumentException e) { 6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // ex = e; 6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} 6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_SUCCESS(status) != shouldBeGood) { 6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("SimpleTimeZone(<start>, month=") + month + ", day=" + day + 6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ", dayOfWeek=" + dayOfWeek + ", time=" + time + 6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (shouldBeGood ? (") should work")// + ex) 6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : ") should fail but doesn't")); 6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete temp; 6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete zone; 6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4154525 7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * SimpleTimeZone accepts illegal DST savings values. These values 7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * must be non-zero. There is no upper limit at this time. 7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZoneRegressionTest::Test4154525() 7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD = 1, BAD = 0; 7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t DATA [] = { 7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1, GOOD, 7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, BAD, 7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org -1, BAD, 7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 60*60*1000, GOOD, 7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org INT32_MIN, BAD, 7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time 7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int32_t i = 0; i < 10; i+=2) { 7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t savings = DATA[i]; 7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool valid = DATA[i+1] == GOOD; 7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString method; 7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int32_t j=0; j < 2; ++j) { 7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *z=NULL; 7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org switch (j) { 7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 0: 7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org method = "constructor"; 7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z = new SimpleTimeZone(0, "id", 7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCAL_JANUARY, 1, 0, 0, 7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCAL_MARCH, 1, 0, 0, 7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org savings, status); // <- what we're interested in 7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org case 1: 7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org method = "setDSTSavings()"; 7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z = new SimpleTimeZone(0, "GMT"); 7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z->setDSTSavings(savings, status); 7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org break; 7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(valid) { 7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("Fail: DST savings of ") + savings + " to " + method + " gave " + u_errorName(status)); 7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(UnicodeString("Pass: DST savings of ") + savings + " to " + method + " gave " + u_errorName(status)); 7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(valid) { 7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(UnicodeString("Pass: DST savings of ") + savings + " accepted by " + method); 7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("Fail: DST savings of ") + savings + " accepted by " + method); 7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete z; 7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4154650 7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * SimpleTimeZone.getOffset accepts illegal arguments. 7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZoneRegressionTest::Test4154650() 7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD = 1, BAD = 0; 7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD_ERA = GregorianCalendar::AD, GOOD_YEAR = 1998, GOOD_MONTH = UCAL_AUGUST; 7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t GOOD_DAY = 2, GOOD_DOW = UCAL_SUNDAY, GOOD_TIME = 16*3600000; 7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t DATA []= { 7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GregorianCalendar::BC, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GregorianCalendar::AD, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GregorianCalendar::BC-1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GregorianCalendar::AD+1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, UCAL_DECEMBER, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY-1, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GOOD_ERA, GOOD_YEAR, UCAL_DECEMBER+1, GOOD_DAY, GOOD_DOW, GOOD_TIME, 7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 1, GOOD_DOW, GOOD_TIME, 7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 31, GOOD_DOW, GOOD_TIME, 7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 0, GOOD_DOW, GOOD_TIME, 7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 32, GOOD_DOW, GOOD_TIME, 7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SUNDAY, GOOD_TIME, 7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SATURDAY, GOOD_TIME, 7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SUNDAY-1, GOOD_TIME, 7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SATURDAY+1, GOOD_TIME, 7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 0, 7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000-1, 7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, -1, 7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000, 8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t dataLen = (int32_t)(sizeof(DATA) / sizeof(DATA[0])); 8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *tz = TimeZone::createDefault(); 8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int32_t i = 0; i < dataLen; i += 7) { 8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool good = DATA[i] == GOOD; 8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //IllegalArgumentException e = null; 8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //try { 8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /*int32_t offset = */ 8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tz->getOffset((uint8_t)DATA[i+1], DATA[i+2], DATA[i+3], 8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DATA[i+4], (uint8_t)DATA[i+5], DATA[i+6], status); 8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} catch (IllegalArgumentException ex) { 8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // e = ex; 8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //} 8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(good != U_SUCCESS(status)) { 8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString errMsg; 8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (good) { 8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errMsg = (UnicodeString(") threw ") + u_errorName(status)); 8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errMsg = UnicodeString(") accepts invalid args", ""); 8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln(UnicodeString("Fail: getOffset(") + 8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DATA[i+1] + ", " + DATA[i+2] + ", " + DATA[i+3] + ", " + 8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DATA[i+4] + ", " + DATA[i+5] + ", " + DATA[i+6] + 8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errMsg); 8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; // reset 8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tz; 8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4162593 8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TimeZone broken at midnight. The TimeZone code fails to handle 8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * transitions at midnight correctly. 8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZoneRegressionTest::Test4162593() 8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleDateFormat *fmt = new SimpleDateFormat("z", Locale::getUS(), status); 8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(status)) { 8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Error creating calendar %s", u_errorName(status)); 8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fmt; 8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t ONE_HOUR = 60*60*1000; 8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *asuncion = new SimpleTimeZone(-4*ONE_HOUR, "America/Asuncion" /*PY%sT*/, 8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCAL_OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR, 8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCAL_MARCH, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status); 8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Zone 8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Starting time 8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Transition expected between start+1H and start+2H 8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *DATA_TZ [] = { 8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 0, 0, 0 }; 8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t DATA_INT [] [5] = { 8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // These years must be AFTER the Gregorian cutover 8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {1998, UCAL_SEPTEMBER, 30, 22, 0}, 8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {2000, UCAL_FEBRUARY, 28, 22, 0}, 8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org {2000, UCAL_FEBRUARY, 29, 22, 0}, 8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool DATA_BOOL [] = { 8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TRUE, 8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FALSE, 8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TRUE, 8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString zone [4];// = new String[4]; 8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DATA_TZ[0] = 8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org new SimpleTimeZone(2*ONE_HOUR, "Asia/Damascus" /*EE%sT*/, 8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCAL_APRIL, 1, 0 /*DOM*/, 0*ONE_HOUR, 8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCAL_OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status); 8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DATA_TZ[1] = asuncion; DATA_TZ[2] = asuncion; 8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(int32_t j = 0; j < 3; j++) { 8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *tz = (TimeZone*)DATA_TZ[j]; 8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone::setDefault(*tz); 8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt->setTimeZone(*tz); 8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Must construct the Date object AFTER setting the default zone 8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t *p = (int32_t*)DATA_INT[j]; 8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate d = CalendarRegressionTest::makeDate(p[0], p[1], p[2], p[3], p[4]); 8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool transitionExpected = DATA_BOOL[j]; 8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString temp; 8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(tz->getID(temp) + ":"); 8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t i = 0; i < 4; ++i) { 8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org FieldPosition pos(0); 8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone[i].remove(); 8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone[i] = fmt->format(d+ i*ONE_HOUR, zone[i], pos); 8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(UnicodeString("") + i + ": " + d + " / " + zone[i]); 8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //d += (double) ONE_HOUR; 9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(zone[0] == zone[1] && 9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (zone[1] == zone[2]) != transitionExpected && 9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone[2] == zone[3]) { 9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln(UnicodeString("Ok: transition ") + transitionExpected); 9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org else { 9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: boundary transition incorrect"); 9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fmt; 9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete asuncion; 9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete DATA_TZ[0]; 9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * getDisplayName doesn't work with unusual savings/offsets. 9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest::Test4176686() { 9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Construct a zone that does not observe DST but 9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // that does have a DST savings (which should be ignored). 9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset = 90 * 60000; // 1:30 9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone* z1 = new SimpleTimeZone(offset, "_std_zone_"); 9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z1->setDSTSavings(45 * 60000, status); // 0:45 9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Construct a zone that observes DST for the first 6 months. 9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone* z2 = new SimpleTimeZone(offset, "_dst_zone_"); 9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z2->setDSTSavings(45 * 60000, status); // 0:45 9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z2->setStartRule(UCAL_JANUARY, 1, 0, status); 9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z2->setEndRule(UCAL_JULY, 1, 0, status); 9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Also check DateFormat 9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DateFormat* fmt1 = new SimpleDateFormat(UnicodeString("z"), status); 9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln("Failure trying to construct: %s", u_errorName(status)); 9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt1->setTimeZone(*z1); // Format uses standard zone 9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org DateFormat* fmt2 = new SimpleDateFormat(UnicodeString("z"), status); 9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(!assertSuccess("trying to construct", status))return; 9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt2->setTimeZone(*z2); // Format uses DST zone 9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org Calendar* tempcal = Calendar::createInstance(status); 9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempcal->clear(); 9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempcal->set(1970, UCAL_FEBRUARY, 1); 9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate dst = tempcal->getTime(status); // Time in DST 9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org tempcal->set(1970, UCAL_AUGUST, 1); 9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate std = tempcal->getTime(status); // Time in standard 9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Description, Result, Expected Result 9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString a,b,c,d,e,f,g,h,i,j,k,l; 9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString DATA[] = { 9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "z1->getDisplayName(false, SHORT)/std zone", 9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z1->getDisplayName(FALSE, TimeZone::SHORT, a), "GMT+1:30", 9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "z1->getDisplayName(false, LONG)/std zone", 9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z1->getDisplayName(FALSE, TimeZone::LONG, b), "GMT+01:30", 9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "z1->getDisplayName(true, SHORT)/std zone", 9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z1->getDisplayName(TRUE, TimeZone::SHORT, c), "GMT+1:30", 9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "z1->getDisplayName(true, LONG)/std zone", 9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z1->getDisplayName(TRUE, TimeZone::LONG, d ), "GMT+01:30", 9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "z2->getDisplayName(false, SHORT)/dst zone", 9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z2->getDisplayName(FALSE, TimeZone::SHORT, e), "GMT+1:30", 9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "z2->getDisplayName(false, LONG)/dst zone", 9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z2->getDisplayName(FALSE, TimeZone::LONG, f ), "GMT+01:30", 9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "z2->getDisplayName(true, SHORT)/dst zone", 9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z2->getDisplayName(TRUE, TimeZone::SHORT, g), "GMT+2:15", 9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "z2->getDisplayName(true, LONG)/dst zone", 9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z2->getDisplayName(TRUE, TimeZone::LONG, h ), "GMT+02:15", 9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DateFormat.format(std)/std zone", fmt1->format(std, i), "GMT+1:30", 9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DateFormat.format(dst)/std zone", fmt1->format(dst, j), "GMT+1:30", 9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DateFormat.format(std)/dst zone", fmt2->format(std, k), "GMT+1:30", 9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "DateFormat.format(dst)/dst zone", fmt2->format(dst, l), "GMT+2:15", 9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }; 9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int32_t idx=0; idx<(int32_t)ARRAY_LENGTH(DATA); idx+=3) { 9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (DATA[idx+1]!=(DATA[idx+2])) { 9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("FAIL: " + DATA[idx] + " -> " + DATA[idx+1] + ", exp " + DATA[idx+2]); 9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete z1; 9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete z2; 9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fmt1; 9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete fmt2; 9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete tempcal; 9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Make sure setStartRule and setEndRule set the DST savings to nonzero 9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * if it was zero. 9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest::TestJ186() { 9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // NOTE: Setting the DST savings to zero is illegal, so we 9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // are limited in the testing we can do here. This is why 9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // lines marked //~ are commented out. 9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone z(0, "ID"); 9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //~z.setDSTSavings(0, status); // Must do this! 9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z.setStartRule(UCAL_FEBRUARY, 1, UCAL_SUNDAY, 0, status); 9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "setStartRule()"); 9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (z.useDaylightTime()) { 10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: useDaylightTime true with start rule only"); 10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //~if (z.getDSTSavings() != 0) { 10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //~ errln("Fail: dst savings != 0 with start rule only"); 10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //~} 10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org z.setEndRule(UCAL_MARCH, -1, UCAL_SUNDAY, 0, status); 10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "setStartRule()"); 10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!z.useDaylightTime()) { 10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: useDaylightTime false with rules set"); 10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (z.getDSTSavings() == 0) { 10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: dst savings == 0 with rules set"); 10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test to see if DateFormat understands zone equivalency groups. It 10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * might seem that this should be a DateFormat test, but it's really a 10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TimeZone test -- the changes to DateFormat are minor. 10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * We use two known, stable zones that shouldn't change much over time 10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * -- America/Vancouver and America/Los_Angeles. However, they MAY 10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * change at some point -- if that happens, replace them with any two 10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * zones in an equivalency group where one zone has localized name 10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * data, and the other doesn't, in some locale. 10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest::TestJ449() { 10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString str; 10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Modify the following three as necessary. The two IDs must 10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // specify two zones in the same equivalency group. One must have 10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // locale data in 'loc'; the other must not. 10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* idWithLocaleData = "America/Los_Angeles"; 10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char* idWithoutLocaleData = "US/Pacific"; 10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const Locale loc("en", "", ""); 10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *zoneWith = TimeZone::createTimeZone(idWithLocaleData); 10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *zoneWithout = TimeZone::createTimeZone(idWithoutLocaleData); 10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Make sure we got valid zones 10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (zoneWith->getID(str) != UnicodeString(idWithLocaleData) || 10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zoneWithout->getID(str) != UnicodeString(idWithoutLocaleData)) { 10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dataerrln(UnicodeString("Fail: Unable to create zones - wanted ") + idWithLocaleData + ", got " + zoneWith->getID(str) + ", and wanted " + idWithoutLocaleData + " but got " + zoneWithout->getID(str)); 10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GregorianCalendar calWith(*zoneWith, status); 10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org GregorianCalendar calWithout(*zoneWithout, status); 10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleDateFormat fmt("MMM d yyyy hh:mm a zzz", loc, status); 10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(status)) { 10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Fail: Unable to create GregorianCalendar/SimpleDateFormat"); 10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate date = 0; 10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UnicodeString strWith, strWithout; 10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt.setCalendar(calWith); 10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt.format(date, strWith); 10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt.setCalendar(calWithout); 10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fmt.format(date, strWithout); 10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (strWith == strWithout) { 10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln((UnicodeString)"Ok: " + idWithLocaleData + " -> " + 10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strWith + "; " + idWithoutLocaleData + " -> " + 10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strWithout); 10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln((UnicodeString)"FAIL: " + idWithLocaleData + " -> " + 10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strWith + "; " + idWithoutLocaleData + " -> " + 10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org strWithout); 10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete zoneWith; 10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete zoneWithout; 10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// test new API for JDK 1.2 8/31 putback 10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid 10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTimeZoneRegressionTest::TestJDK12API() 10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // TimeZone *pst = TimeZone::createTimeZone("PST"); 10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // TimeZone *cst1 = TimeZone::createTimeZone("CST"); 10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode ec = U_ZERO_ERROR; 10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //d,-28800,3,1,-1,120,w,9,-1,1,120,w,60 10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *pst = new SimpleTimeZone(-28800*U_MILLIS_PER_SECOND, 10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "PST", 10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3,1,-1,120*U_MILLIS_PER_MINUTE, 10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone::WALL_TIME, 10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9,-1,1,120*U_MILLIS_PER_MINUTE, 10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone::WALL_TIME, 10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 60*U_MILLIS_PER_MINUTE,ec); 10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org //d,-21600,3,1,-1,120,w,9,-1,1,120,w,60 10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TimeZone *cst1 = new SimpleTimeZone(-21600*U_MILLIS_PER_SECOND, 10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org "CST", 10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3,1,-1,120*U_MILLIS_PER_MINUTE, 10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone::WALL_TIME, 10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 9,-1,1,120*U_MILLIS_PER_MINUTE, 10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone::WALL_TIME, 10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 60*U_MILLIS_PER_MINUTE,ec); 10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (U_FAILURE(ec)) { 10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("FAIL: SimpleTimeZone constructor"); 10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone *cst = dynamic_cast<SimpleTimeZone *>(cst1); 11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(pst->hasSameRules(*cst)) { 11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("FAILURE: PST and CST have same rules"); 11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset1 = pst->getOffset(1, 11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), status); 11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "getOffset() failed"); 11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t offset2 = cst->getOffset(1, 11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), 31, status); 11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "getOffset() failed"); 11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(offset1 == offset2) 11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("FAILURE: Sunday Oct. 26 1997 2:00 has same offset for PST and CST"); 11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // verify error checking 11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org pst->getOffset(1, 11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1997, UCAL_FIELD_COUNT+1, 26, UCAL_SUNDAY, (2*60*60*1000), status); 11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)) 11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("FAILURE: getOffset() succeeded with -1 for month"); 11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cst->setDSTSavings(60*60*1000, status); 11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org failure(status, "setDSTSavings() failed"); 11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t savings = cst->getDSTSavings(); 11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(savings != 60*60*1000) { 11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("setDSTSavings() failed"); 11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete pst; 11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete cst; 11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * SimpleTimeZone allows invalid DOM values. 11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TimeZoneRegressionTest::Test4184229() { 11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org SimpleTimeZone* zone = NULL; 11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 0, status); 11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)){ 11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Failed. No exception has been thrown for DOM -1 startDay"); 11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("(a) " + UnicodeString( u_errorName(status))); 11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete zone; 11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, status); 11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)){ 11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Failed. No exception has been thrown for DOM -1 endDay"); 11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("(b) " + UnicodeString(u_errorName(status))); 11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete zone; 11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 1000, status); 11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)){ 11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Failed. No exception has been thrown for DOM -1 startDay+savings"); 11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("(c) " + UnicodeString(u_errorName(status))); 11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete zone; 11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, 1000, status); 11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)){ 11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Failed. No exception has been thrown for DOM -1 endDay+ savings"); 11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org }else{ 11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("(d) " + UnicodeString(u_errorName(status))); 11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete zone; 11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org // Make a valid constructor call for subsequent tests. 11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 0, 1, 0, 0, status); 11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone->setStartRule(0, -1, 0, 0, status); 11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)){ 11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Failed. No exception has been thrown for DOM -1 setStartRule +savings"); 11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else{ 11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("(e) " + UnicodeString(u_errorName(status))); 11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone->setStartRule(0, -1, 0, status); 11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)){ 11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Failed. No exception has been thrown for DOM -1 setStartRule"); 11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else{ 11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("(f) " + UnicodeString(u_errorName(status))); 11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone->setEndRule(0, -1, 0, 0, status); 11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)){ 11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Failed. No exception has been thrown for DOM -1 setEndRule+savings"); 11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else{ 11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("(g) " + UnicodeString(u_errorName(status))); 11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org zone->setEndRule(0, -1, 0, status); 12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_SUCCESS(status)){ 12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errln("Failed. No exception has been thrown for DOM -1 setEndRule"); 12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else{ 12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org logln("(h) " + UnicodeString(u_errorName(status))); 12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org delete zone; 12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 1210