1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
28393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * Copyright (c) 1997-2013, 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)) {
150103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      dataerrln("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)
485b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        dataerrln("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);
509b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            if (ids == NULL) {
510b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                dataerrln("Fail: TimeZone::createEnumeration(rawoffset)");
511b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                continue;
512b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho            }
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            count = ids->count(ec);
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (count> max)
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                max = count;
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (count > 0) {
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln(hname + ' ' + (UnicodeString)count + (UnicodeString)" e.g. " + *ids->snext(ec));
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln(hname + ' ' + count);
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // weiv 11/27/2002: why uprv_free? This should be a delete
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete ids;
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //delete [] ids;
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //uprv_free(ids);
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*} catch (Exception e) {
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(hname + ' ' + "Fail: " + e);
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }*/
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Maximum zones per offset = %d", max);
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4151429
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4151429() {
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // {sfb} silly test in C++, since we are using an enum and not an int
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //try {
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*TimeZone *tz = TimeZone::createTimeZone("GMT");
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString name;
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tz->getDisplayName(TRUE, TimeZone::LONG,
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        Locale.getDefault(), name);
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("IllegalArgumentException not thrown by TimeZone::getDisplayName()");*/
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //} catch(IllegalArgumentException e) {}
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4154537
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZone::hasSameRules() doesn't work for zones with no DST
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and different DST parameters.
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4154537() {
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // tz1 and tz2 have no DST and different rule parameters
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tz1 = new SimpleTimeZone(0, "1", 0, 0, 0, 0, 2, 0, 0, 0, status);
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tz2 = new SimpleTimeZone(0, "2", 1, 0, 0, 0, 3, 0, 0, 0, status);
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // tza and tzA have the same rule params
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tza = new SimpleTimeZone(0, "a", 0, 1, 0, 0, 3, 2, 0, 0, status);
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tzA = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 3, 2, 0, 0, status);
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // tzb differs from tza
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tzb = new SimpleTimeZone(0, "b", 0, 1, 0, 0, 3, 1, 0, 0, status);
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Couldn't create TimeZones");
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz1->useDaylightTime() || tz2->useDaylightTime() ||
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        !tza->useDaylightTime() || !tzA->useDaylightTime() ||
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        !tzb->useDaylightTime()) {
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test is broken -- rewrite it");
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!tza->hasSameRules(*tzA) || tza->hasSameRules(*tzb)) {
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: hasSameRules() broken for zones with rules");
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!tz1->hasSameRules(*tz2)) {
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: hasSameRules() returns false for zones without rules");
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //errln("zone 1 = " + tz1);
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //errln("zone 2 = " + tz2);
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz1;
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz2;
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tza;
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tzA;
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tzb;
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4154542
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZOne constructors, setStartRule(), and setEndRule() don't
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * check for out-of-range arguments.
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest:: Test4154542()
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD = 1;
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t BAD  = 0;
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_MONTH       = UCAL_JANUARY;
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_DAY         = 1;
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_DAY_OF_WEEK = UCAL_SUNDAY;
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_TIME        = 0;
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA [] = {
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, INT32_MIN,    0,  INT32_MAX,   INT32_MIN,
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_JANUARY,    -5,  UCAL_SUNDAY,     0,
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,    5,  UCAL_SATURDAY,   24*60*60*1000,
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,    5,  UCAL_SATURDAY,   24*60*60*1000+1,
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,    5,  UCAL_SATURDAY,  -1,
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_JANUARY,    -6,  UCAL_SUNDAY,     0,
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,    6,  UCAL_SATURDAY,   24*60*60*1000,
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,    1,  0,                   0,
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,   31,  0,                   0,
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_APRIL,      31,  0,                   0,
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,   32,  0,                   0,
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_JANUARY-1,   1,  UCAL_SUNDAY,     0,
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER+1,  1,  UCAL_SUNDAY,     0,
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,   31, -UCAL_SUNDAY,     0,
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, UCAL_DECEMBER,   31, -UCAL_SATURDAY,   0,
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,   32, -UCAL_SATURDAY,   0,
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,  -32, -UCAL_SATURDAY,   0,
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  UCAL_DECEMBER,   31, -UCAL_SATURDAY-1, 0,
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *zone = new SimpleTimeZone(0, "Z");
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; i < 18*5; i+=5) {
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool shouldBeGood = (DATA[i] == GOOD);
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t month     = DATA[i+1];
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t day       = DATA[i+2];
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t dayOfWeek = DATA[i+3];
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t time      = DATA[i+4];
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UErrorCode status = U_ZERO_ERROR;
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //Exception ex = null;
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone->setStartRule(month, day, dayOfWeek, time, status);
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException e) {
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //    ex = e;
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) != shouldBeGood) {
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("setStartRule(month=") + month + ", day=" + day +
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  (shouldBeGood ? (") should work")
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   : ") should fail but doesn't"));
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //ex = null;
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone->setEndRule(month, day, dayOfWeek, time, status);
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException e) {
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //   ex = e;
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) != shouldBeGood) {
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("setEndRule(month=") + month + ", day=" + day +
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  (shouldBeGood ? (") should work")
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   : ") should fail but doesn't"));
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //ex = null;
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // {sfb} need to look into ctor problems! (UErrorCode vs. dst signature confusion)
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleTimeZone *temp = new SimpleTimeZone(0, "Z",
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK,
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    GOOD_TIME,status);
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException e) {
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //    ex = e;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) != shouldBeGood) {
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("SimpleTimeZone(month=") + month + ", day=" + day +
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  (shouldBeGood ? (", <end>) should work")// + ex)
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   : ", <end>) should fail but doesn't"));
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete temp;
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //ex = null;
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR;
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            temp = new SimpleTimeZone(0, "Z",
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (int8_t)GOOD_MONTH, (int8_t)GOOD_DAY, (int8_t)GOOD_DAY_OF_WEEK,
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    GOOD_TIME,
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    (int8_t)month, (int8_t)day, (int8_t)dayOfWeek, time,status);
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException e) {
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //    ex = e;
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_SUCCESS(status) != shouldBeGood) {
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("SimpleTimeZone(<start>, month=") + month + ", day=" + day +
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  ", dayOfWeek=" + dayOfWeek + ", time=" + time +
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  (shouldBeGood ? (") should work")// + ex)
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   : ") should fail but doesn't"));
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete temp;
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4154525
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZone accepts illegal DST savings values.  These values
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * must be non-zero.  There is no upper limit at this time.
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::Test4154525()
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD = 1, BAD = 0;
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA [] = {
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1, GOOD,
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, BAD,
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        -1, BAD,
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        60*60*1000, GOOD,
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        INT32_MIN, BAD,
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t i = 0; i < 10; i+=2) {
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t savings = DATA[i];
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool valid = DATA[i+1] == GOOD;
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString method;
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(int32_t j=0; j < 2; ++j) {
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            SimpleTimeZone *z=NULL;
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            switch (j) {
726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                case 0:
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    method = "constructor";
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    z = new SimpleTimeZone(0, "id",
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UCAL_JANUARY, 1, 0, 0,
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        UCAL_MARCH, 1, 0, 0,
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        savings, status); // <- what we're interested in
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                case 1:
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    method = "setDSTSavings()";
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    z = new SimpleTimeZone(0, "GMT");
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    z->setDSTSavings(savings, status);
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    break;
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(U_FAILURE(status)) {
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(valid) {
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(UnicodeString("Fail: DST savings of ") + savings + " to " + method + " gave " + u_errorName(status));
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                else {
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln(UnicodeString("Pass: DST savings of ") + savings + " to " + method + " gave " + u_errorName(status));
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                if(valid) {
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    logln(UnicodeString("Pass: DST savings of ") + savings + " accepted by " + method);
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                else {
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    errln(UnicodeString("Fail: DST savings of ") + savings + " accepted by " + method);
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_ZERO_ERROR;
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete z;
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4154650
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZone.getOffset accepts illegal arguments.
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::Test4154650()
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD = 1, BAD = 0;
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_ERA = GregorianCalendar::AD, GOOD_YEAR = 1998, GOOD_MONTH = UCAL_AUGUST;
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t GOOD_DAY = 2, GOOD_DOW = UCAL_SUNDAY, GOOD_TIME = 16*3600000;
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA []= {
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GregorianCalendar::BC, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GregorianCalendar::AD, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GregorianCalendar::BC-1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GregorianCalendar::AD+1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, GOOD_DAY, GOOD_DOW, GOOD_TIME,
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_DECEMBER, GOOD_DAY, GOOD_DOW, GOOD_TIME,
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY-1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_DECEMBER+1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 1, GOOD_DOW, GOOD_TIME,
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 31, GOOD_DOW, GOOD_TIME,
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 0, GOOD_DOW, GOOD_TIME,
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, UCAL_JANUARY, 32, GOOD_DOW, GOOD_TIME,
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SUNDAY, GOOD_TIME,
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SATURDAY, GOOD_TIME,
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SUNDAY-1, GOOD_TIME,
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, UCAL_SATURDAY+1, GOOD_TIME,
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 0,
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000-1,
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, -1,
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        BAD,  GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000,
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t dataLen = (int32_t)(sizeof(DATA) / sizeof(DATA[0]));
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *tz = TimeZone::createDefault();
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t i = 0; i < dataLen; i += 7) {
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool good = DATA[i] == GOOD;
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //IllegalArgumentException e = null;
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //try {
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            /*int32_t offset = */
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tz->getOffset((uint8_t)DATA[i+1], DATA[i+2], DATA[i+3],
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      DATA[i+4], (uint8_t)DATA[i+5], DATA[i+6], status);
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //} catch (IllegalArgumentException ex) {
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //   e = ex;
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        //}
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(good != U_SUCCESS(status)) {
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString errMsg;
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (good) {
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errMsg = (UnicodeString(") threw ") + u_errorName(status));
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else {
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errMsg = UnicodeString(") accepts invalid args", "");
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("Fail: getOffset(") +
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  DATA[i+1] + ", " + DATA[i+2] + ", " + DATA[i+3] + ", " +
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  DATA[i+4] + ", " + DATA[i+5] + ", " + DATA[i+6] +
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  errMsg);
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_ZERO_ERROR; // reset
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz;
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4162593
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TimeZone broken at midnight.  The TimeZone code fails to handle
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * transitions at midnight correctly.
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::Test4162593()
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleDateFormat *fmt = new SimpleDateFormat("z", Locale::getUS(), status);
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
84550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      dataerrln("Error creating calendar %s", u_errorName(status));
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      delete fmt;
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t ONE_HOUR = 60*60*1000;
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *asuncion = new SimpleTimeZone(-4*ONE_HOUR, "America/Asuncion" /*PY%sT*/,
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR,
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UCAL_MARCH, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status);
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Zone
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Starting time
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Transition expected between start+1H and start+2H
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *DATA_TZ [] = {
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      0, 0, 0 };
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t DATA_INT [] [5] = {
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // These years must be AFTER the Gregorian cutover
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {1998, UCAL_SEPTEMBER, 30, 22, 0},
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {2000, UCAL_FEBRUARY, 28, 22, 0},
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {2000, UCAL_FEBRUARY, 29, 22, 0},
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     };
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool DATA_BOOL [] = {
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TRUE,
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        FALSE,
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TRUE,
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString zone [4];// = new String[4];
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DATA_TZ[0] =
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        new SimpleTimeZone(2*ONE_HOUR, "Asia/Damascus" /*EE%sT*/,
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UCAL_APRIL, 1, 0 /*DOM*/, 0*ONE_HOUR,
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UCAL_OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR, status);
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DATA_TZ[1] = asuncion;  DATA_TZ[2] = asuncion;
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(int32_t j = 0; j < 3; j++) {
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone *tz = (TimeZone*)DATA_TZ[j];
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone::setDefault(*tz);
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fmt->setTimeZone(*tz);
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Must construct the Date object AFTER setting the default zone
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t *p = (int32_t*)DATA_INT[j];
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate d = CalendarRegressionTest::makeDate(p[0], p[1], p[2], p[3], p[4]);
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       UBool transitionExpected = DATA_BOOL[j];
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString temp;
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(tz->getID(temp) + ":");
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i = 0; i < 4; ++i) {
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            FieldPosition pos(0);
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone[i].remove();
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone[i] = fmt->format(d+ i*ONE_HOUR, zone[i], pos);
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString("") + i + ": " + d + " / " + zone[i]);
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            //d += (double) ONE_HOUR;
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(zone[0] == zone[1] &&
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            (zone[1] == zone[2]) != transitionExpected &&
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone[2] == zone[3]) {
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString("Ok: transition ") + transitionExpected);
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        else {
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail: boundary transition incorrect");
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt;
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete asuncion;
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete DATA_TZ[0];
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /**
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    * getDisplayName doesn't work with unusual savings/offsets.
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    */
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest::Test4176686() {
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Construct a zone that does not observe DST but
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // that does have a DST savings (which should be ignored).
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset = 90 * 60000; // 1:30
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone* z1 = new SimpleTimeZone(offset, "_std_zone_");
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z1->setDSTSavings(45 * 60000, status); // 0:45
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Construct a zone that observes DST for the first 6 months.
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone* z2 = new SimpleTimeZone(offset, "_dst_zone_");
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z2->setDSTSavings(45 * 60000, status); // 0:45
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z2->setStartRule(UCAL_JANUARY, 1, 0, status);
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z2->setEndRule(UCAL_JULY, 1, 0, status);
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Also check DateFormat
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormat* fmt1 = new SimpleDateFormat(UnicodeString("z"), status);
93450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
93550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln("Failure trying to construct: %s", u_errorName(status));
93650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
93750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt1->setTimeZone(*z1); // Format uses standard zone
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DateFormat* fmt2 = new SimpleDateFormat(UnicodeString("z"), status);
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!assertSuccess("trying to construct", status))return;
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fmt2->setTimeZone(*z2); // Format uses DST zone
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Calendar* tempcal = Calendar::createInstance(status);
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempcal->clear();
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempcal->set(1970, UCAL_FEBRUARY, 1);
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate dst = tempcal->getTime(status); // Time in DST
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tempcal->set(1970, UCAL_AUGUST, 1);
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate std = tempcal->getTime(status); // Time in standard
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Description, Result, Expected Result
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString a,b,c,d,e,f,g,h,i,j,k,l;
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString DATA[] = {
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z1->getDisplayName(false, SHORT)/std zone",
9538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        z1->getDisplayName(FALSE, TimeZone::SHORT, a), "GMT+1:30",
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z1->getDisplayName(false, LONG)/std zone",
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z1->getDisplayName(FALSE, TimeZone::LONG, b), "GMT+01:30",
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z1->getDisplayName(true, SHORT)/std zone",
9578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        z1->getDisplayName(TRUE, TimeZone::SHORT, c), "GMT+1:30",
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z1->getDisplayName(true, LONG)/std zone",
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z1->getDisplayName(TRUE, TimeZone::LONG, d ), "GMT+01:30",
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z2->getDisplayName(false, SHORT)/dst zone",
9618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        z2->getDisplayName(FALSE, TimeZone::SHORT, e), "GMT+1:30",
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z2->getDisplayName(false, LONG)/dst zone",
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z2->getDisplayName(FALSE, TimeZone::LONG, f ), "GMT+01:30",
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z2->getDisplayName(true, SHORT)/dst zone",
9658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        z2->getDisplayName(TRUE, TimeZone::SHORT, g), "GMT+2:15",
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "z2->getDisplayName(true, LONG)/dst zone",
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        z2->getDisplayName(TRUE, TimeZone::LONG, h ), "GMT+02:15",
9688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        "DateFormat.format(std)/std zone", fmt1->format(std, i), "GMT+1:30",
9698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        "DateFormat.format(dst)/std zone", fmt1->format(dst, j), "GMT+1:30",
9708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        "DateFormat.format(std)/dst zone", fmt2->format(std, k), "GMT+1:30",
9718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        "DateFormat.format(dst)/dst zone", fmt2->format(dst, l), "GMT+2:15",
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t idx=0; idx<(int32_t)ARRAY_LENGTH(DATA); idx+=3) {
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (DATA[idx+1]!=(DATA[idx+2])) {
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: " + DATA[idx] + " -> " + DATA[idx+1] + ", exp " + DATA[idx+2]);
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete z1;
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete z2;
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt1;
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete fmt2;
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tempcal;
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Make sure setStartRule and setEndRule set the DST savings to nonzero
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * if it was zero.
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest::TestJ186() {
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // NOTE: Setting the DST savings to zero is illegal, so we
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // are limited in the testing we can do here.  This is why
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // lines marked //~ are commented out.
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone z(0, "ID");
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //~z.setDSTSavings(0, status); // Must do this!
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z.setStartRule(UCAL_FEBRUARY, 1, UCAL_SUNDAY, 0, status);
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "setStartRule()");
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (z.useDaylightTime()) {
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: useDaylightTime true with start rule only");
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //~if (z.getDSTSavings() != 0) {
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //~    errln("Fail: dst savings != 0 with start rule only");
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //~}
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    z.setEndRule(UCAL_MARCH, -1, UCAL_SUNDAY, 0, status);
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "setStartRule()");
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!z.useDaylightTime()) {
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: useDaylightTime false with rules set");
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (z.getDSTSavings() == 0) {
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Fail: dst savings == 0 with rules set");
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test to see if DateFormat understands zone equivalency groups.  It
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * might seem that this should be a DateFormat test, but it's really a
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * TimeZone test -- the changes to DateFormat are minor.
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * We use two known, stable zones that shouldn't change much over time
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * -- America/Vancouver and America/Los_Angeles.  However, they MAY
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * change at some point -- if that happens, replace them with any two
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * zones in an equivalency group where one zone has localized name
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * data, and the other doesn't, in some locale.
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest::TestJ449() {
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Modify the following three as necessary.  The two IDs must
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // specify two zones in the same equivalency group.  One must have
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // locale data in 'loc'; the other must not.
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* idWithLocaleData = "America/Los_Angeles";
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* idWithoutLocaleData = "US/Pacific";
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const Locale loc("en", "", "");
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *zoneWith = TimeZone::createTimeZone(idWithLocaleData);
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *zoneWithout = TimeZone::createTimeZone(idWithoutLocaleData);
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure we got valid zones
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zoneWith->getID(str) != UnicodeString(idWithLocaleData) ||
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        zoneWithout->getID(str) != UnicodeString(idWithoutLocaleData)) {
10426d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      dataerrln(UnicodeString("Fail: Unable to create zones - wanted ") + idWithLocaleData + ", got " + zoneWith->getID(str) + ", and wanted " + idWithoutLocaleData + " but got " + zoneWithout->getID(str));
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar calWith(*zoneWith, status);
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        GregorianCalendar calWithout(*zoneWithout, status);
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        SimpleDateFormat fmt("MMM d yyyy hh:mm a zzz", loc, status);
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (U_FAILURE(status)) {
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Fail: Unable to create GregorianCalendar/SimpleDateFormat");
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UDate date = 0;
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString strWith, strWithout;
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.setCalendar(calWith);
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(date, strWith);
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.setCalendar(calWithout);
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fmt.format(date, strWithout);
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (strWith == strWithout) {
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln((UnicodeString)"Ok: " + idWithLocaleData + " -> " +
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strWith + "; " + idWithoutLocaleData + " -> " +
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strWithout);
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL: " + idWithLocaleData + " -> " +
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strWith + "; " + idWithoutLocaleData + " -> " +
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      strWithout);
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zoneWith;
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zoneWithout;
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// test new API for JDK 1.2 8/31 putback
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneRegressionTest::TestJDK12API()
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // TimeZone *pst = TimeZone::createTimeZone("PST");
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // TimeZone *cst1 = TimeZone::createTimeZone("CST");
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //d,-28800,3,1,-1,120,w,9,-1,1,120,w,60
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *pst = new SimpleTimeZone(-28800*U_MILLIS_PER_SECOND,
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       "PST",
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       3,1,-1,120*U_MILLIS_PER_MINUTE,
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       SimpleTimeZone::WALL_TIME,
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       9,-1,1,120*U_MILLIS_PER_MINUTE,
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       SimpleTimeZone::WALL_TIME,
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       60*U_MILLIS_PER_MINUTE,ec);
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //d,-21600,3,1,-1,120,w,9,-1,1,120,w,60
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *cst1 = new SimpleTimeZone(-21600*U_MILLIS_PER_SECOND,
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       "CST",
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       3,1,-1,120*U_MILLIS_PER_MINUTE,
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       SimpleTimeZone::WALL_TIME,
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       9,-1,1,120*U_MILLIS_PER_MINUTE,
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       SimpleTimeZone::WALL_TIME,
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                       60*U_MILLIS_PER_MINUTE,ec);
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(ec)) {
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: SimpleTimeZone constructor");
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
110027f654740f2a26ad62a5c155af9199af9e69b889claireho    SimpleTimeZone *cst = dynamic_cast<SimpleTimeZone *>(cst1);
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(pst->hasSameRules(*cst)) {
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAILURE: PST and CST have same rules");
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset1 = pst->getOffset(1,
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), status);
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "getOffset() failed");
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset2 = cst->getOffset(1,
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_OCTOBER, 26, UCAL_SUNDAY, (2*60*60*1000), 31, status);
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "getOffset() failed");
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(offset1 == offset2)
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAILURE: Sunday Oct. 26 1997 2:00 has same offset for PST and CST");
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // verify error checking
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    pst->getOffset(1,
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        1997, UCAL_FIELD_COUNT+1, 26, UCAL_SUNDAY, (2*60*60*1000), status);
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status))
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAILURE: getOffset() succeeded with -1 for month");
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cst->setDSTSavings(60*60*1000, status);
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "setDSTSavings() failed");
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t savings = cst->getDSTSavings();
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(savings != 60*60*1000) {
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("setDSTSavings() failed");
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete pst;
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete cst;
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SimpleTimeZone allows invalid DOM values.
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneRegressionTest::Test4184229() {
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone* zone = NULL;
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 0, status);
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 startDay");
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       logln("(a) " + UnicodeString( u_errorName(status)));
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, status);
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 endDay");
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       logln("(b) " + UnicodeString(u_errorName(status)));
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 1000, status);
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 startDay+savings");
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       logln("(c) " + UnicodeString(u_errorName(status)));
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, 1000, status);
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 endDay+ savings");
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }else{
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       logln("(d) " + UnicodeString(u_errorName(status)));
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make a valid constructor call for subsequent tests.
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 0, 1, 0, 0, status);
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setStartRule(0, -1, 0, 0, status);
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 setStartRule +savings");
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else{
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("(e) " + UnicodeString(u_errorName(status)));
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setStartRule(0, -1, 0, status);
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 setStartRule");
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else{
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("(f) " + UnicodeString(u_errorName(status)));
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setEndRule(0, -1, 0, 0, status);
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 setEndRule+savings");
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else{
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("(g) " + UnicodeString(u_errorName(status)));
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setEndRule(0, -1, 0, status);
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_SUCCESS(status)){
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Failed. No exception has been thrown for DOM -1 setEndRule");
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else{
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("(h) " + UnicodeString(u_errorName(status)));
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
1210