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