tzregts.cpp revision 50294ead5e5d23f5bbfed76e00e6b510bd41eee1
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 1997-2010, International Business Machines
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Corporation and others. All Rights Reserved.
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/simpletz.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/smpdtfmt.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/strenum.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tzregts.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "calregts.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class TimeZoneRegressionTest
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* length of an array */
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // if (exec) logln((UnicodeString)"TestSuite NumberFormatRegressionTest");
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(0, Test4052967);
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(1, Test4073209);
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(2, Test4073215);
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(3, Test4084933);
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(4, Test4096952);
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(5, Test4109314);
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(6, Test4126678);
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(7, Test4151406);
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(8, Test4151429);
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(9, Test4154537);
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(10, Test4154542);
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(11, Test4154650);
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(12, Test4154525);
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(13, Test4162593);
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(14, TestJ186);
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(15, TestJ449);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(16, TestJDK12API);
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(17, Test4176686);
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(18, Test4184229);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default: name = ""; break;
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::failure(UErrorCode status, const char* msg)
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4052967
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4052967() {
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} not applicable in C++ ?
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*logln("*** CHECK TIMEZONE AGAINST HOST OS SETTING ***");
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("user.timezone:" + System.getProperty("user.timezone", "<not set>"));
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(new Date().toString());
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");*/
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4073209
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4073209() {
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *z1 = TimeZone::createTimeZone("PST");
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *z2 = TimeZone::createTimeZone("PST");
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (z1 == z2)
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: TimeZone should return clones");
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete z1;
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete z2;
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate TimeZoneRegressionTest::findTransitionBinary(const SimpleTimeZone& tz, UDate min, UDate max) {
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool startsInDST = tz.inDaylightTime(min, status);
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz.inDaylightTime(max, status) == startsInDST) {
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"Error: inDaylightTime() != " + ((!startsInDST)?"TRUE":"FALSE"));
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while ((max - min) > 100) { // Min accuracy in ms
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate mid = (min + max) / 2;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tz.inDaylightTime(mid, status) == startsInDST) {
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            min = mid;
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            max = mid;
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (min + max) / 2;
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUDate TimeZoneRegressionTest::findTransitionStepwise(const SimpleTimeZone& tz, UDate min, UDate max) {
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool startsInDST = tz.inDaylightTime(min, status);
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (min < max) {
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tz.inDaylightTime(min, status) != startsInDST) {
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return min;
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (failure(status, "SimpleTimeZone::inDaylightTime")) return 0;
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        min += (UDate)24*60*60*1000; // one day
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return 0;
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4073215
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// {sfb} will this work using a Calendar?
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4073215()
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str, str2;
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *z = new SimpleTimeZone(0, "GMT");
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (z->useDaylightTime())
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: Fix test to start with non-DST zone");
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z->setStartRule(UCAL_FEBRUARY, 1, UCAL_SUNDAY, 0, status);
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "z->setStartRule()");
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z->setEndRule(UCAL_MARCH, -1, UCAL_SUNDAY, 0, status);
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "z->setStartRule()");
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!z->useDaylightTime())
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: DST not active");
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar cal(1997, UCAL_JANUARY, 31, status);
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      dataerrln("Error creating calendar %s", u_errorName(status));
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new GregorianCalendar");
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.adoptTimeZone(z);
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat sdf((UnicodeString)"E d MMM yyyy G HH:mm", status);
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
1506d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      errcheckln(status, "Error creating date format %s", u_errorName(status));
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sdf.setCalendar(cal);
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "new SimpleDateFormat");
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate jan31, mar1, mar31;
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool indt = z->inDaylightTime(jan31=cal.getTime(status), status);
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "inDaylightTime or getTime call on Jan 31");
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (indt) {
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: Jan 31 inDaylightTime=TRUE, exp FALSE");
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.set(1997, UCAL_MARCH, 1);
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    indt = z->inDaylightTime(mar1=cal.getTime(status), status);
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "inDaylightTime or getTime call on Mar 1");
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!indt) {
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString str;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sdf.format(cal.getTime(status), str);
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        failure(status, "getTime");
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"Fail: " + str + " inDaylightTime=FALSE, exp TRUE");
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.set(1997, UCAL_MARCH, 31);
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    indt = z->inDaylightTime(mar31=cal.getTime(status), status);
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "inDaylightTime or getTime call on Mar 31");
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (indt) {
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: Mar 31 inDaylightTime=TRUE, exp FALSE");
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal.set(1997, Calendar::DECEMBER, 31);
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate dec31 = cal.getTime(status);
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "getTime");
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate trans = findTransitionStepwise(*z, jan31, dec31);
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Stepwise from " +
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          sdf.format(jan31, str.remove()) + "; transition at " +
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE"));
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    trans = findTransitionStepwise(*z, mar1, dec31);
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Stepwise from " +
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          sdf.format(mar1, str.remove()) + "; transition at " +
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE"));
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    trans = findTransitionStepwise(*z, mar31, dec31);
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"Stepwise from " +
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          sdf.format(mar31, str.remove()) + "; transition at " +
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          (trans?sdf.format(trans, str2.remove()):(UnicodeString)"NONE"));
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4084933
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The expected behavior of TimeZone around the boundaries is:
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (Assume transition time of 2:00 AM)
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *    day of onset 1:59 AM STD  = display name 1:59 AM ST
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                 2:00 AM STD  = display name 3:00 AM DT
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *    day of end   0:59 AM STD  = display name 1:59 AM DT
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *                 1:00 AM STD  = display name 1:00 AM ST
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4084933() {
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *tz = TimeZone::createTimeZone("PST");
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset1 = tz->getOffset(1,
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), status);
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset2 = tz->getOffset(1,
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000)-1, status);
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset3 = tz->getOffset(1,
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (1*60*60*1000), status);
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset4 = tz->getOffset(1,
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (1*60*60*1000)-1, status);
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  The following was added just for consistency.  It shows that going *to* Daylight
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *  Savings Time (PDT) does work at 2am.
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset5 = tz->getOffset(1,
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (2*60*60*1000), status);
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset6 = tz->getOffset(1,
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (2*60*60*1000)-1, status);
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset5a = tz->getOffset(1,
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (3*60*60*1000), status);
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset6a = tz->getOffset(1,
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (3*60*60*1000)-1, status);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset7 = tz->getOffset(1,
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (1*60*60*1000), status);
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset8 = tz->getOffset(1,
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_APRIL, 6, UCAL_SUNDAY, (1*60*60*1000)-1, status);
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t SToffset = (int32_t)(-8 * 60*60*1000L);
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DToffset = (int32_t)(-7 * 60*60*1000L);
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2406d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru#define ERR_IF_FAIL(x) if(x) { dataerrln("FAIL: TimeZone misbehaving - %s", #x); }
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(U_FAILURE(status))
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset1 != SToffset)
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset2 != SToffset)
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset3 != SToffset)
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset4 != DToffset)
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset5 != DToffset)
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset6 != SToffset)
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset5a != DToffset)
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset6a != DToffset)
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset7 != SToffset)
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ERR_IF_FAIL(offset8 != SToffset)
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#undef ERR_IF_FAIL
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz;
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4096952
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4096952() {
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} serialization not applicable
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString ZONES [] = { UnicodeString("GMT"), UnicodeString("MET"), UnicodeString("IST") };
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool pass = TRUE;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i=0; i < ZONES.length; ++i) {
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TimeZone *zone = TimeZone::createTimeZone(ZONES[i]);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString id;
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (zone->getID(id) != ZONES[i])
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Fail: Test broken; zones not instantiating");
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ByteArrayOutputStream baos;
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ObjectOutputStream ostream =
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                new ObjectOutputStream(baos = new
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       ByteArrayOutputStream());
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ostream.writeObject(zone);
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ostream.close();
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            baos.close();
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ObjectInputStream istream =
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                new ObjectInputStream(new
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                      ByteArrayInputStream(baos.toByteArray()));
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TimeZone frankenZone = (TimeZone) istream.readObject();
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //logln("Zone:        " + zone);
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //logln("FrankenZone: " + frankenZone);
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (!zone.equals(frankenZone)) {
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("TimeZone " + zone.getID() +
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      " not equal to serialized/deserialized one");
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pass = false;
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!pass) errln("Fail: TimeZone serialization/equality bug");
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    catch (IOException e) {
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: " + e);
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        e.print32_tStackTrace();
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    catch (ClassNotFoundException e) {
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: " + e);
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        e.print32_tStackTrace();
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4109314
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4109314() {
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar *testCal = (GregorianCalendar*)Calendar::createInstance(status);
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
31350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      dataerrln("Error creating calendar %s", u_errorName(status));
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete testCal;
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "Calendar::createInstance");
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *PST = TimeZone::createTimeZone("PST");
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*Object[] testData = {
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        PST, new Date(98,Calendar.APRIL,4,22,0), new Date(98, Calendar.APRIL, 5,6,0),
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        PST, new Date(98,Calendar.OCTOBER,24,22,0), new Date(98,Calendar.OCTOBER,25,6,0),
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };*/
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate testData [] = {
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CalendarRegressionTest::makeDate(98,UCAL_APRIL,4,22,0),
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CalendarRegressionTest::makeDate(98, UCAL_APRIL,5,6,0),
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CalendarRegressionTest::makeDate(98,UCAL_OCTOBER,24,22,0),
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CalendarRegressionTest::makeDate(98,UCAL_OCTOBER,25,6,0)
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool pass = TRUE;
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i = 0; i < 4; i+=2) {
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //testCal->setTimeZone((TimeZone) testData[i]);
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testCal->setTimeZone(*PST);
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate t        = testData[i];
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate end    = testData[i+1];
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        while(testCal->getTime(status) < end) {
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            testCal->setTime(t, status);
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if ( ! checkCalendar314(testCal, PST))
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                pass = FALSE;
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            t += 60*60*1000.0;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ( ! pass)
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: TZ API inconsistent");
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete testCal;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete PST;
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::checkCalendar314(GregorianCalendar *testCal, TimeZone *testTZ)
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // GregorianCalendar testCal = (GregorianCalendar)aCal.clone();
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t tzOffset, tzRawOffset;
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    float tzOffsetFloat,tzRawOffsetFloat;
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Here is where the user made an error.  They were passing in the value of
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // the MILLSECOND field; you need to pass in the millis in the day in STANDARD
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // time.
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate millis = testCal->get(UCAL_MILLISECOND, status) +
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1000.0 * (testCal->get(UCAL_SECOND, status) +
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        60.0 * (testCal->get(UCAL_MINUTE, status) +
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        60.0 * (testCal->get(UCAL_HOUR_OF_DAY, status)))) -
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        testCal->get(UCAL_DST_OFFSET, status);
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Fix up millis to be in range.  ASSUME THAT WE ARE NOT AT THE
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * BEGINNING OR END OF A MONTH.  We must add this code because
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * getOffset() has been changed to be more strict about the parameters
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * it receives -- it turns out that this test was passing in illegal
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * values. */
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t date = testCal->get(UCAL_DATE, status);
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dow  = testCal->get(UCAL_DAY_OF_WEEK, status);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(millis < 0) {
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        millis += U_MILLIS_PER_DAY;
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        --date;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dow = UCAL_SUNDAY + ((dow - UCAL_SUNDAY + 6) % 7);
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (millis >= U_MILLIS_PER_DAY) {
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        millis -= U_MILLIS_PER_DAY;
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ++date;
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dow = UCAL_SUNDAY + ((dow - UCAL_SUNDAY + 1) % 7);
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tzOffset = testTZ->getOffset((uint8_t)testCal->get(UCAL_ERA, status),
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                testCal->get(UCAL_YEAR, status),
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                testCal->get(UCAL_MONTH, status),
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                date,
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                (uint8_t)dow,
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                (int32_t)millis,
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                status);
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tzRawOffset = testTZ->getRawOffset();
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tzOffsetFloat = (float)tzOffset/(float)3600000;
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tzRawOffsetFloat = (float)tzRawOffset/(float)3600000;
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate testDate = testCal->getTime(status);
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool inDaylightTime = testTZ->inDaylightTime(testDate, status);
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *sdf = new SimpleDateFormat((UnicodeString)"MM/dd/yyyy HH:mm", status);
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    sdf->setCalendar(*testCal);
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString inDaylightTimeString;
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool passed;
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(inDaylightTime)
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inDaylightTimeString = " DST ";
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        passed = (tzOffset == (tzRawOffset + 3600000));
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inDaylightTimeString = "     ";
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        passed = (tzOffset == tzRawOffset);
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString output;
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FieldPosition pos(0);
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    output = testTZ->getID(output) + " " + sdf->format(testDate, output, pos) +
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " Offset(" + tzOffsetFloat + ")" +
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " RawOffset(" + tzRawOffsetFloat + ")" +
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        " " + millis/(float)3600000 + " " +
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inDaylightTimeString;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (passed)
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        output += "     ";
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        output += "ERROR";
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (passed)
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(output);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(output);
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete sdf;
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return passed;
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4126678
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CANNOT REPRODUDE
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Yet another _alleged_ bug in TimeZone::getOffset(), a method that never
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * should have been made public.  It's simply too hard to use correctly.
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The original test code failed to do the following:
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (1) Call Calendar::setTime() before getting the fields!
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * (2) Use the right millis (as usual) for getOffset(); they were passing
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *     in the MILLIS field, instead of the STANDARD MILLIS IN DAY.
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * When you fix these two problems, the test passes, as expected.
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4126678()
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar *cal = Calendar::createInstance(status);
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
45550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      dataerrln("Error creating calendar %s", u_errorName(status));
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete cal;
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "Calendar::createInstance");
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *tz = TimeZone::createTimeZone("PST");
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cal->adoptTimeZone(tz);
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
46350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    cal->set(1998, UCAL_APRIL, 5, 10, 0);
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (! tz->useDaylightTime() || U_FAILURE(status))
4666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("We're not in Daylight Savings Time and we should be. - %s", u_errorName(status));
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //cal.setTime(dt);
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t era = cal->get(UCAL_ERA, status);
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t year = cal->get(UCAL_YEAR, status);
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t month = cal->get(UCAL_MONTH, status);
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t day = cal->get(UCAL_DATE, status);
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dayOfWeek = cal->get(UCAL_DAY_OF_WEEK, status);
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t millis = cal->get(UCAL_MILLISECOND, status) +
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        (cal->get(UCAL_SECOND, status) +
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         (cal->get(UCAL_MINUTE, status) +
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          (cal->get(UCAL_HOUR, status) * 60) * 60) * 1000) -
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cal->get(UCAL_DST_OFFSET, status);
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "cal->get");
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset = tz->getOffset((uint8_t)era, year, month, day, (uint8_t)dayOfWeek, millis, status);
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t raw_offset = tz->getRawOffset();
48350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset == raw_offset)
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Offsets should match");
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cal;
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4151406
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TimeZone::getAvailableIDs(int32_t) throws exception for certain values,
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * due to a faulty constant in TimeZone::java.
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4151406() {
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t max = 0;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t h=-28; h<=30; ++h) {
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // h is in half-hours from GMT; rawoffset is in millis
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t rawoffset = h * 1800000;
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t hh = (h<0) ? -h : h;
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString hname = UnicodeString((h<0) ? "GMT-" : "GMT+") +
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ((hh/2 < 10) ? "0" : "") +
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (hh/2) + ':' +
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ((hh%2==0) ? "00" : "30");
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode ec = U_ZERO_ERROR;
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t count;
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            StringEnumeration* ids = TimeZone::createEnumeration(rawoffset);
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count = ids->count(ec);
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (count> max)
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                max = count;
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (count > 0) {
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln(hname + ' ' + (UnicodeString)count + (UnicodeString)" e.g. " + *ids->snext(ec));
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln(hname + ' ' + count);
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // weiv 11/27/2002: why uprv_free? This should be a delete
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete ids;
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //delete [] ids;
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //uprv_free(ids);
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*} catch (Exception e) {
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(hname + ' ' + "Fail: " + e);
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }*/
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Maximum zones per offset = %d", max);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4151429
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4151429() {
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} silly test in C++, since we are using an enum and not an int
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*TimeZone *tz = TimeZone::createTimeZone("GMT");
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tz->getDisplayName(TRUE, TimeZone::LONG,
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        Locale.getDefault(), name);
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("IllegalArgumentException not thrown by TimeZone::getDisplayName()");*/
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //} catch(IllegalArgumentException e) {}
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4154537
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZone::hasSameRules() doesn't work for zones with no DST
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and different DST parameters.
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4154537() {
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // tz1 and tz2 have no DST and different rule parameters
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tz1 = new SimpleTimeZone(0, "1", 0, 0, 0, 0, 2, 0, 0, 0, status);
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tz2 = new SimpleTimeZone(0, "2", 1, 0, 0, 0, 3, 0, 0, 0, status);
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // tza and tzA have the same rule params
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tza = new SimpleTimeZone(0, "a", 0, 1, 0, 0, 3, 2, 0, 0, status);
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tzA = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 3, 2, 0, 0, status);
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // tzb differs from tza
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tzb = new SimpleTimeZone(0, "b", 0, 1, 0, 0, 3, 1, 0, 0, status);
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Couldn't create TimeZones");
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz1->useDaylightTime() || tz2->useDaylightTime() ||
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        !tza->useDaylightTime() || !tzA->useDaylightTime() ||
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        !tzb->useDaylightTime()) {
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test is broken -- rewrite it");
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!tza->hasSameRules(*tzA) || tza->hasSameRules(*tzb)) {
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: hasSameRules() broken for zones with rules");
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!tz1->hasSameRules(*tz2)) {
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: hasSameRules() returns false for zones without rules");
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //errln("zone 1 = " + tz1);
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //errln("zone 2 = " + tz2);
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz1;
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz2;
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tza;
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tzA;
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tzb;
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4154542
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZOne constructors, setStartRule(), and setEndRule() don't
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * check for out-of-range arguments.
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4154542()
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD = 1;
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t BAD  = 0;
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_MONTH       = UCAL_JANUARY;
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_DAY         = 1;
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_DAY_OF_WEEK = UCAL_SUNDAY;
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_TIME        = 0;
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA [] = {
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, INT32_MIN,    0,  INT32_MAX,   INT32_MIN,
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_JANUARY,    -5,  UCAL_SUNDAY,     0,
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,    5,  UCAL_SATURDAY,   24*60*60*1000,
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,    5,  UCAL_SATURDAY,   24*60*60*1000+1,
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,    5,  UCAL_SATURDAY,  -1,
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_JANUARY,    -6,  UCAL_SUNDAY,     0,
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,    6,  UCAL_SATURDAY,   24*60*60*1000,
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,    1,  0,                   0,
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,   31,  0,                   0,
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_APRIL,      31,  0,                   0,
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,   32,  0,                   0,
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_JANUARY-1,   1,  UCAL_SUNDAY,     0,
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER+1,  1,  UCAL_SUNDAY,     0,
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,   31, -UCAL_SUNDAY,     0,
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,   31, -UCAL_SATURDAY,   0,
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,   32, -UCAL_SATURDAY,   0,
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,  -32, -UCAL_SATURDAY,   0,
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,   31, -UCAL_SATURDAY-1, 0,
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *zone = new SimpleTimeZone(0, "Z");
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i < 18*5; i+=5) {
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool shouldBeGood = (DATA[i] == GOOD);
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t month     = DATA[i+1];
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t day       = DATA[i+2];
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t dayOfWeek = DATA[i+3];
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t time      = DATA[i+4];
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //Exception ex = null;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone->setStartRule(month, day, dayOfWeek, time, status);
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException e) {
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //    ex = e;
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) != shouldBeGood) {
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("setStartRule(month=") + month + ", day=" + day +
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  (shouldBeGood ? (") should work")
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   : ") should fail but doesn't"));
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //ex = null;
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone->setEndRule(month, day, dayOfWeek, time, status);
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException e) {
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //   ex = e;
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) != shouldBeGood) {
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("setEndRule(month=") + month + ", day=" + day +
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  (shouldBeGood ? (") should work")
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   : ") should fail but doesn't"));
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //ex = null;
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // {sfb} need to look into ctor problems! (UErrorCode vs. dst signature confusion)
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleTimeZone *temp = new SimpleTimeZone(0, "Z",
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK,
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    GOOD_TIME,status);
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException e) {
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //    ex = e;
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) != shouldBeGood) {
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("SimpleTimeZone(month=") + month + ", day=" + day +
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  (shouldBeGood ? (", <end>) should work")// + ex)
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   : ", <end>) should fail but doesn't"));
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete temp;
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //ex = null;
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp = new SimpleTimeZone(0, "Z",
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK,
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    GOOD_TIME,
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,status);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException e) {
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //    ex = e;
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) != shouldBeGood) {
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("SimpleTimeZone(<start>, month=") + month + ", day=" + day +
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  (shouldBeGood ? (") should work")// + ex)
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   : ") should fail but doesn't"));
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete temp;
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4154525
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZone accepts illegal DST savings values.  These values
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * must be non-zero.  There is no upper limit at this time.
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::Test4154525()
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD = 1, BAD = 0;
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA [] = {
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1, GOOD,
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, BAD,
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -1, BAD,
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        60*60*1000, GOOD,
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        INT32_MIN, BAD,
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t i = 0; i < 10; i+=2) {
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t savings = DATA[i];
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool valid = DATA[i+1] == GOOD;
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString method;
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(int32_t j=0; j < 2; ++j) {
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleTimeZone *z=NULL;
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            switch (j) {
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                case 0:
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    method = "constructor";
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    z = new SimpleTimeZone(0, "id",
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UCAL_JANUARY, 1, 0, 0,
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UCAL_MARCH, 1, 0, 0,
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        savings, status); // <- what we're interested in
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                case 1:
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    method = "setDSTSavings()";
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    z = new SimpleTimeZone(0, "GMT");
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    z->setDSTSavings(savings, status);
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(status)) {
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(valid) {
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(UnicodeString("Fail: DST savings of ") + savings + " to " + method + " gave " + u_errorName(status));
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                else {
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln(UnicodeString("Pass: DST savings of ") + savings + " to " + method + " gave " + u_errorName(status));
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(valid) {
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln(UnicodeString("Pass: DST savings of ") + savings + " accepted by " + method);
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                else {
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(UnicodeString("Fail: DST savings of ") + savings + " accepted by " + method);
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete z;
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4154650
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZone.getOffset accepts illegal arguments.
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::Test4154650()
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD = 1, BAD = 0;
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_ERA = GregorianCalendar::AD, GOOD_YEAR = 1998, GOOD_MONTH = UCAL_AUGUST;
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_DAY = 2, GOOD_DOW = UCAL_SUNDAY, GOOD_TIME = 16*3600000;
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA []= {
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GregorianCalendar::BC, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GregorianCalendar::AD, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GregorianCalendar::BC-1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GregorianCalendar::AD+1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, GOOD_DAY, GOOD_DOW, GOOD_TIME,
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_DECEMBER, GOOD_DAY, GOOD_DOW, GOOD_TIME,
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY-1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_DECEMBER+1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 1, GOOD_DOW, GOOD_TIME,
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 31, GOOD_DOW, GOOD_TIME,
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 0, GOOD_DOW, GOOD_TIME,
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 32, GOOD_DOW, GOOD_TIME,
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SUNDAY, GOOD_TIME,
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SATURDAY, GOOD_TIME,
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SUNDAY-1, GOOD_TIME,
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SATURDAY+1, GOOD_TIME,
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 0,
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000-1,
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, -1,
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000,
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dataLen = (int32_t)(sizeof(DATA) / sizeof(DATA[0]));
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *tz = TimeZone::createDefault();
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t i = 0; i < dataLen; i += 7) {
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool good = DATA[i] == GOOD;
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //IllegalArgumentException e = null;
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /*int32_t offset = */
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tz->getOffset((uint8_t)DATA[i+1], DATA[i+2], DATA[i+3],
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      DATA[i+4], (uint8_t)DATA[i+5], DATA[i+6], status);
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException ex) {
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //   e = ex;
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(good != U_SUCCESS(status)) {
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString errMsg;
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (good) {
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errMsg = (UnicodeString(") threw ") + u_errorName(status));
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errMsg = UnicodeString(") accepts invalid args", "");
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Fail: getOffset(") +
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  DATA[i+1] + ", " + DATA[i+2] + ", " + DATA[i+3] + ", " +
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  DATA[i+4] + ", " + DATA[i+5] + ", " + DATA[i+6] +
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  errMsg);
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR; // reset
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz;
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4162593
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TimeZone broken at midnight.  The TimeZone code fails to handle
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * transitions at midnight correctly.
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::Test4162593()
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt = new SimpleDateFormat("z", Locale::getUS(), status);
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
84150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      dataerrln("Error creating calendar %s", u_errorName(status));
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete fmt;
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t ONE_HOUR = 60*60*1000;
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *asuncion = new SimpleTimeZone(-4*ONE_HOUR, "America/Asuncion" /*PY%sT*/,
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR,
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_MARCH, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status);
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Zone
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Starting time
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Transition expected between start+1H and start+2H
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *DATA_TZ [] = {
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      0, 0, 0 };
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA_INT [] [5] = {
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // These years must be AFTER the Gregorian cutover
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {1998, UCAL_SEPTEMBER, 30, 22, 0},
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {2000, UCAL_FEBRUARY, 28, 22, 0},
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {2000, UCAL_FEBRUARY, 29, 22, 0},
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     };
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool DATA_BOOL [] = {
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TRUE,
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FALSE,
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TRUE,
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString zone [4];// = new String[4];
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DATA_TZ[0] =
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        new SimpleTimeZone(2*ONE_HOUR, "Asia/Damascus" /*EE%sT*/,
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UCAL_APRIL, 1, 0 /*DOM*/, 0*ONE_HOUR,
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UCAL_OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status);
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DATA_TZ[1] = asuncion;  DATA_TZ[2] = asuncion;
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t j = 0; j < 3; j++) {
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone *tz = (TimeZone*)DATA_TZ[j];
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone::setDefault(*tz);
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->setTimeZone(*tz);
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Must construct the Date object AFTER setting the default zone
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t *p = (int32_t*)DATA_INT[j];
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate d = CalendarRegressionTest::makeDate(p[0], p[1], p[2], p[3], p[4]);
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       UBool transitionExpected = DATA_BOOL[j];
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(tz->getID(temp) + ":");
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i = 0; i < 4; ++i) {
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            FieldPosition pos(0);
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone[i].remove();
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone[i] = fmt->format(d+ i*ONE_HOUR, zone[i], pos);
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString("") + i + ": " + d + " / " + zone[i]);
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //d += (double) ONE_HOUR;
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(zone[0] == zone[1] &&
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (zone[1] == zone[2]) != transitionExpected &&
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone[2] == zone[3]) {
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString("Ok: transition ") + transitionExpected);
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail: boundary transition incorrect");
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete asuncion;
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete DATA_TZ[0];
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /**
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    * getDisplayName doesn't work with unusual savings/offsets.
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest::Test4176686() {
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Construct a zone that does not observe DST but
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // that does have a DST savings (which should be ignored).
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset = 90 * 60000; // 1:30
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone* z1 = new SimpleTimeZone(offset, "_std_zone_");
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z1->setDSTSavings(45 * 60000, status); // 0:45
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Construct a zone that observes DST for the first 6 months.
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone* z2 = new SimpleTimeZone(offset, "_dst_zone_");
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z2->setDSTSavings(45 * 60000, status); // 0:45
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z2->setStartRule(UCAL_JANUARY, 1, 0, status);
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z2->setEndRule(UCAL_JULY, 1, 0, status);
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Also check DateFormat
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormat* fmt1 = new SimpleDateFormat(UnicodeString("z"), status);
93050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
93150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln("Failure trying to construct: %s", u_errorName(status));
93250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
93350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt1->setTimeZone(*z1); // Format uses standard zone
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormat* fmt2 = new SimpleDateFormat(UnicodeString("z"), status);
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!assertSuccess("trying to construct", status))return;
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt2->setTimeZone(*z2); // Format uses DST zone
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar* tempcal = Calendar::createInstance(status);
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempcal->clear();
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempcal->set(1970, UCAL_FEBRUARY, 1);
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate dst = tempcal->getTime(status); // Time in DST
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempcal->set(1970, UCAL_AUGUST, 1);
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate std = tempcal->getTime(status); // Time in standard
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Description, Result, Expected Result
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString a,b,c,d,e,f,g,h,i,j,k,l;
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString DATA[] = {
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z1->getDisplayName(false, SHORT)/std zone",
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z1->getDisplayName(FALSE, TimeZone::SHORT, a), "GMT+01:30",
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z1->getDisplayName(false, LONG)/std zone",
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z1->getDisplayName(FALSE, TimeZone::LONG, b), "GMT+01:30",
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z1->getDisplayName(true, SHORT)/std zone",
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z1->getDisplayName(TRUE, TimeZone::SHORT, c), "GMT+01:30",
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z1->getDisplayName(true, LONG)/std zone",
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z1->getDisplayName(TRUE, TimeZone::LONG, d ), "GMT+01:30",
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z2->getDisplayName(false, SHORT)/dst zone",
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z2->getDisplayName(FALSE, TimeZone::SHORT, e), "GMT+01:30",
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z2->getDisplayName(false, LONG)/dst zone",
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z2->getDisplayName(FALSE, TimeZone::LONG, f ), "GMT+01:30",
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z2->getDisplayName(true, SHORT)/dst zone",
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z2->getDisplayName(TRUE, TimeZone::SHORT, g), "GMT+02:15",
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z2->getDisplayName(true, LONG)/dst zone",
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z2->getDisplayName(TRUE, TimeZone::LONG, h ), "GMT+02:15",
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "DateFormat.format(std)/std zone", fmt1->format(std, i), "GMT+01:30",
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "DateFormat.format(dst)/std zone", fmt1->format(dst, j), "GMT+01:30",
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "DateFormat.format(std)/dst zone", fmt2->format(std, k), "GMT+01:30",
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "DateFormat.format(dst)/dst zone", fmt2->format(dst, l), "GMT+02:15",
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t idx=0; idx<(int32_t)ARRAY_LENGTH(DATA); idx+=3) {
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (DATA[idx+1]!=(DATA[idx+2])) {
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: " + DATA[idx] + " -> " + DATA[idx+1] + ", exp " + DATA[idx+2]);
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete z1;
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete z2;
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt1;
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt2;
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tempcal;
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Make sure setStartRule and setEndRule set the DST savings to nonzero
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * if it was zero.
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest::TestJ186() {
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // NOTE: Setting the DST savings to zero is illegal, so we
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // are limited in the testing we can do here.  This is why
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // lines marked //~ are commented out.
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone z(0, "ID");
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //~z.setDSTSavings(0, status); // Must do this!
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z.setStartRule(UCAL_FEBRUARY, 1, UCAL_SUNDAY, 0, status);
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "setStartRule()");
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (z.useDaylightTime()) {
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: useDaylightTime true with start rule only");
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //~if (z.getDSTSavings() != 0) {
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //~    errln("Fail: dst savings != 0 with start rule only");
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //~}
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z.setEndRule(UCAL_MARCH, -1, UCAL_SUNDAY, 0, status);
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "setStartRule()");
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!z.useDaylightTime()) {
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: useDaylightTime false with rules set");
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (z.getDSTSavings() == 0) {
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: dst savings == 0 with rules set");
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test to see if DateFormat understands zone equivalency groups.  It
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * might seem that this should be a DateFormat test, but it's really a
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TimeZone test -- the changes to DateFormat are minor.
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * We use two known, stable zones that shouldn't change much over time
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * -- America/Vancouver and America/Los_Angeles.  However, they MAY
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * change at some point -- if that happens, replace them with any two
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * zones in an equivalency group where one zone has localized name
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * data, and the other doesn't, in some locale.
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest::TestJ449() {
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Modify the following three as necessary.  The two IDs must
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // specify two zones in the same equivalency group.  One must have
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // locale data in 'loc'; the other must not.
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* idWithLocaleData = "America/Los_Angeles";
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* idWithoutLocaleData = "US/Pacific";
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale loc("en", "", "");
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *zoneWith = TimeZone::createTimeZone(idWithLocaleData);
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *zoneWithout = TimeZone::createTimeZone(idWithoutLocaleData);
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure we got valid zones
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zoneWith->getID(str) != UnicodeString(idWithLocaleData) ||
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        zoneWithout->getID(str) != UnicodeString(idWithoutLocaleData)) {
10386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      dataerrln(UnicodeString("Fail: Unable to create zones - wanted ") + idWithLocaleData + ", got " + zoneWith->getID(str) + ", and wanted " + idWithoutLocaleData + " but got " + zoneWithout->getID(str));
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar calWith(*zoneWith, status);
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar calWithout(*zoneWithout, status);
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SimpleDateFormat fmt("MMM d yyyy hh:mm a zzz", loc, status);
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail: Unable to create GregorianCalendar/SimpleDateFormat");
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UDate date = 0;
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString strWith, strWithout;
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.setCalendar(calWith);
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(date, strWith);
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.setCalendar(calWithout);
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(date, strWithout);
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strWith == strWithout) {
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln((UnicodeString)"Ok: " + idWithLocaleData + " -> " +
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strWith + "; " + idWithoutLocaleData + " -> " +
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strWithout);
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL: " + idWithLocaleData + " -> " +
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strWith + "; " + idWithoutLocaleData + " -> " +
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strWithout);
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zoneWith;
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zoneWithout;
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// test new API for JDK 1.2 8/31 putback
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::TestJDK12API()
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // TimeZone *pst = TimeZone::createTimeZone("PST");
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // TimeZone *cst1 = TimeZone::createTimeZone("CST");
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //d,-28800,3,1,-1,120,w,9,-1,1,120,w,60
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *pst = new SimpleTimeZone(-28800*U_MILLIS_PER_SECOND,
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       "PST",
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       3,1,-1,120*U_MILLIS_PER_MINUTE,
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       SimpleTimeZone::WALL_TIME,
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       9,-1,1,120*U_MILLIS_PER_MINUTE,
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       SimpleTimeZone::WALL_TIME,
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       60*U_MILLIS_PER_MINUTE,ec);
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //d,-21600,3,1,-1,120,w,9,-1,1,120,w,60
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *cst1 = new SimpleTimeZone(-21600*U_MILLIS_PER_SECOND,
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       "CST",
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       3,1,-1,120*U_MILLIS_PER_MINUTE,
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       SimpleTimeZone::WALL_TIME,
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       9,-1,1,120*U_MILLIS_PER_MINUTE,
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       SimpleTimeZone::WALL_TIME,
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       60*U_MILLIS_PER_MINUTE,ec);
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: SimpleTimeZone constructor");
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *cst = 0;
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(cst1->getDynamicClassID() == SimpleTimeZone::getStaticClassID())
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        cst = (SimpleTimeZone*) cst1;
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pst->hasSameRules(*cst)) {
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAILURE: PST and CST have same rules");
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset1 = pst->getOffset(1,
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), status);
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "getOffset() failed");
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset2 = cst->getOffset(1,
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), 31, status);
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "getOffset() failed");
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(offset1 == offset2)
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAILURE: Sunday Oct. 26 1997 2:00 has same offset for PST and CST");
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // verify error checking
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pst->getOffset(1,
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_FIELD_COUNT+1, 26, UCAL_SUNDAY, (2*60*60*1000), status);
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status))
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAILURE: getOffset() succeeded with -1 for month");
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cst->setDSTSavings(60*60*1000, status);
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "setDSTSavings() failed");
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t savings = cst->getDSTSavings();
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(savings != 60*60*1000) {
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("setDSTSavings() failed");
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete pst;
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cst;
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZone allows invalid DOM values.
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest::Test4184229() {
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone* zone = NULL;
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 0, status);
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 startDay");
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       logln("(a) " + UnicodeString( u_errorName(status)));
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, status);
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 endDay");
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       logln("(b) " + UnicodeString(u_errorName(status)));
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 1000, status);
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 startDay+savings");
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       logln("(c) " + UnicodeString(u_errorName(status)));
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, 1000, status);
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 endDay+ savings");
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       logln("(d) " + UnicodeString(u_errorName(status)));
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make a valid constructor call for subsequent tests.
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 0, 1, 0, 0, status);
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setStartRule(0, -1, 0, 0, status);
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 setStartRule +savings");
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else{
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("(e) " + UnicodeString(u_errorName(status)));
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setStartRule(0, -1, 0, status);
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 setStartRule");
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else{
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("(f) " + UnicodeString(u_errorName(status)));
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setEndRule(0, -1, 0, 0, status);
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 setEndRule+savings");
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else{
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("(g) " + UnicodeString(u_errorName(status)));
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setEndRule(0, -1, 0, status);
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 setEndRule");
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else{
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("(h) " + UnicodeString(u_errorName(status)));
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
1209