tztest.cpp revision 27f654740f2a26ad62a5c155af9199af9e69b889
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/***********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 1997-2010, International Business Machines Corporation
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * and others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ***********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/timezone.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/simpletz.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/calendar.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/gregocal.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/resbund.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/strenum.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "tztest.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "putilimp.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cstring.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "olsontz.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define CASE(id,test) case id:                               \
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          name = #test;                      \
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          if (exec) {                        \
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              logln(#test "---"); logln(""); \
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              test();                        \
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          }                                  \
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          break
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class TimeZoneTest
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru// TODO: We should probably read following data at runtime, so we can update
3827f654740f2a26ad62a5c155af9199af9e69b889claireho// these values every release with necessary data changes.
39b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst int32_t TimeZoneTest::REFERENCE_YEAR = 2009;
40b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queruconst char * TimeZoneTest::REFERENCE_DATA_VERSION = "2009d";
41b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (exec) logln("TestSuite TestTimeZone");
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (index) {
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(0, TestPRTOffset);
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(1, TestVariousAPI518);
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(2, TestGetAvailableIDs913);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(3, TestGenericAPI);
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(4, TestRuleAPI);
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(5, TestShortZoneIDs);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(6, TestCustomParse);
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(7, TestDisplayName);
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(8, TestDSTSavings);
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(9, TestAlternateRules);
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(10,TestCountries);
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(11,TestHistorical);
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(12,TestEquivalentIDs);
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(13, TestAliasedNames);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(14, TestFractionalDST);
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CASE(15, TestFebruary);
62c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        CASE(16, TestCanonicalID);
63c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        CASE(17, TestDisplayNamesMeta);
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru       default: name = ""; break;
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst int32_t TimeZoneTest::millisPerHour = 3600000;
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ---------------------------------------------------------------------------------
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Generic API testing for API coverage.
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestGenericAPI()
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString id("NewGMT");
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset = 12345;
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *zone = new SimpleTimeZone(offset, id);
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zone->useDaylightTime()) errln("FAIL: useDaylightTime should return FALSE");
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* zoneclone = zone->clone();
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(*zoneclone == *zone)) errln("FAIL: clone or operator== failed");
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zoneclone->setID("abc");
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(*zoneclone != *zone)) errln("FAIL: clone or operator!= failed");
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zoneclone;
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zoneclone = zone->clone();
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(*zoneclone == *zone)) errln("FAIL: clone or operator== failed");
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zoneclone->setRawOffset(45678);
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(*zoneclone != *zone)) errln("FAIL: clone or operator!= failed");
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone copy(*zone);
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(copy == *zone)) errln("FAIL: copy constructor or operator== failed");
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    copy = *(SimpleTimeZone*)zoneclone;
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!(copy == *zoneclone)) errln("FAIL: assignment operator or operator== failed");
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* saveDefault = TimeZone::createDefault();
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln((UnicodeString)"TimeZone::createDefault() => " + saveDefault->getID(id));
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* pstZone = TimeZone::createTimeZone("America/Los_Angeles");
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("call uprv_timezone() which uses the host");
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("to get the difference in seconds between coordinated universal");
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("time and local time. E.g., -28,800 for PST (GMT-8hrs)");
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t tzoffset = uprv_timezone();
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("Value returned from uprv_timezone = ") + tzoffset);
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Invert sign because UNIX semantics are backwards
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tzoffset < 0)
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tzoffset = -tzoffset;
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((*saveDefault == *pstZone) && (tzoffset != 28800)) {
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: t_timezone may be incorrect.  It is not 28800");
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if ((tzoffset % 900) != 0) {
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        /*
11927f654740f2a26ad62a5c155af9199af9e69b889claireho         * Ticket#6364 and #7648
12027f654740f2a26ad62a5c155af9199af9e69b889claireho         * A few time zones are using GMT offests not a multiple of 15 minutes.
12127f654740f2a26ad62a5c155af9199af9e69b889claireho         * Therefore, we should not interpret such case as an error.
12227f654740f2a26ad62a5c155af9199af9e69b889claireho         * We downgrade this from errln to infoln. When we see this message,
12327f654740f2a26ad62a5c155af9199af9e69b889claireho         * we should examine if it is ignorable or not.
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         */
12527f654740f2a26ad62a5c155af9199af9e69b889claireho        infoln("WARNING: t_timezone may be incorrect. It is not a multiple of 15min.", tzoffset);
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone::adoptDefault(zone);
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* defaultzone = TimeZone::createDefault();
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (defaultzone == zone ||
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        !(*defaultzone == *zone))
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: createDefault failed");
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone::adoptDefault(saveDefault);
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete defaultzone;
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zoneclone;
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete pstZone;
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* tzver = TimeZone::getTZDataVersion(status);
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1416d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        errcheckln(status, "FAIL: getTZDataVersion failed - %s", u_errorName(status));
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (uprv_strlen(tzver) != 5 /* 4 digits + 1 letter */) {
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: getTZDataVersion returned " + tzver);
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"tzdata version: " + tzver);
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ---------------------------------------------------------------------------------
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the setStartRule/setEndRule API calls.
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestRuleAPI()
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate offset = 60*60*1000*1.75; // Pick a weird offset
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *zone = new SimpleTimeZone((int32_t)offset, "TestZone");
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zone->useDaylightTime()) errln("FAIL: useDaylightTime should return FALSE");
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Establish our expected transition times.  Do this with a non-DST
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // calendar with the (above) declared local offset.
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar *gc = new GregorianCalendar(*zone, status);
16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "new GregorianCalendar", TRUE)) return;
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->clear();
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set(1990, UCAL_MARCH, 1);
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate marchOneStd = gc->getTime(status); // Local Std time midnight
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->clear();
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->set(1990, UCAL_JULY, 1);
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate julyOneStd = gc->getTime(status); // Local Std time midnight
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "GregorianCalendar::getTime")) return;
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Starting and ending hours, WALL TIME
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t startHour = (int32_t)(2.25 * 3600000);
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t endHour   = (int32_t)(3.5  * 3600000);
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setStartRule(UCAL_MARCH, 1, 0, startHour, status);
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setEndRule  (UCAL_JULY,  1, 0, endHour, status);
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc = new GregorianCalendar(*zone, status);
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "new GregorianCalendar")) return;
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate marchOne = marchOneStd + startHour;
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate julyOne = julyOneStd + endHour - 3600000; // Adjust from wall to Std time
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate expMarchOne = 636251400000.0;
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (marchOne != expMarchOne)
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: Expected start computed as " + marchOne +
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          " = " + dateToString(marchOne));
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"      Should be                  " + expMarchOne +
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          " = " + dateToString(expMarchOne));
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate expJulyOne = 646793100000.0;
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (julyOne != expJulyOne)
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln((UnicodeString)"FAIL: Expected start computed as " + julyOne +
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          " = " + dateToString(julyOne));
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln((UnicodeString)"      Should be                  " + expJulyOne +
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          " = " + dateToString(expJulyOne));
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testUsingBinarySearch(*zone, date(90, UCAL_JANUARY, 1), date(90, UCAL_JUNE, 15), marchOne);
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    testUsingBinarySearch(*zone, date(90, UCAL_JUNE, 1), date(90, UCAL_DECEMBER, 31), julyOne);
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zone->inDaylightTime(marchOne - 1000, status) ||
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        !zone->inDaylightTime(marchOne, status))
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Start rule broken");
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!zone->inDaylightTime(julyOne - 1000, status) ||
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        zone->inDaylightTime(julyOne, status))
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: End rule broken");
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->setStartYear(1991);
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zone->inDaylightTime(marchOne, status) ||
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        zone->inDaylightTime(julyOne - 1000, status))
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: Start year broken");
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    failure(status, "TestRuleAPI");
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::findTransition(const TimeZone& tz,
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             UDate min, UDate max) {
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString id,s;
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool startsInDST = tz.inDaylightTime(min, ec);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(ec, "TimeZone::inDaylightTime")) return;
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz.inDaylightTime(max, ec) == startsInDST) {
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Error: " + tz.getID(id) + ".inDaylightTime(" + dateToString(min) + ") = " + (startsInDST?"TRUE":"FALSE") +
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              ", inDaylightTime(" + dateToString(max) + ") = " + (startsInDST?"TRUE":"FALSE"));
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(ec, "TimeZone::inDaylightTime")) return;
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while ((max - min) > INTERVAL) {
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate mid = (min + max) / 2;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tz.inDaylightTime(mid, ec) == startsInDST) {
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            min = mid;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            max = mid;
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (failure(ec, "TimeZone::inDaylightTime")) return;
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    min = 1000.0 * uprv_floor(min/1000.0);
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    max = 1000.0 * uprv_floor(max/1000.0);
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(tz.getID(id) + " Before: " + min/1000 + " = " +
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          dateToString(min,s,tz));
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(tz.getID(id) + " After:  " + max/1000 + " = " +
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          dateToString(max,s,tz));
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::testUsingBinarySearch(const TimeZone& tz,
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    UDate min, UDate max,
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                    UDate expectedBoundary)
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool startsInDST = tz.inDaylightTime(min, status);
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "TimeZone::inDaylightTime")) return;
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz.inDaylightTime(max, status) == startsInDST) {
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Error: inDaylightTime(" + dateToString(max) + ") != " + ((!startsInDST)?"TRUE":"FALSE"));
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (failure(status, "TimeZone::inDaylightTime")) return;
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while ((max - min) > INTERVAL) {
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UDate mid = (min + max) / 2;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tz.inDaylightTime(mid, status) == startsInDST) {
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            min = mid;
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            max = mid;
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (failure(status, "TimeZone::inDaylightTime")) return;
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("Binary Search Before: ") + uprv_floor(0.5 + min) + " = " + dateToString(min));
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("Binary Search After:  ") + uprv_floor(0.5 + max) + " = " + dateToString(max));
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate mindelta = expectedBoundary - min;
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate maxdelta = max - expectedBoundary;
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (mindelta >= 0 &&
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        mindelta <= INTERVAL &&
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxdelta >= 0 &&
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        maxdelta <= INTERVAL)
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(UnicodeString("PASS: Expected bdry:  ") + expectedBoundary + " = " + dateToString(expectedBoundary));
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("FAIL: Expected bdry:  ") + expectedBoundary + " = " + dateToString(expectedBoundary));
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UDate TimeZoneTest::INTERVAL = 100;
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// ---------------------------------------------------------------------------------
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the offset of the PRT timezone.
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestPRTOffset()
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* tz = TimeZone::createTimeZone("PRT");
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz == 0) {
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: TimeZone(PRT) is null");
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      int32_t expectedHour = -4;
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      double expectedOffset = (((double)expectedHour) * millisPerHour);
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      double foundOffset = tz->getRawOffset();
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      int32_t foundHour = (int32_t)foundOffset / millisPerHour;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (expectedOffset != foundOffset) {
3146d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: Offset for PRT should be %d, found %d", expectedHour, foundHour);
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      } else {
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("PASS: Offset for PRT should be %d, found %d", expectedHour, foundHour);
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz;
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Regress a specific bug with a sequence of API calls.
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestVariousAPI518()
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* time_zone = TimeZone::createTimeZone("PST");
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate d = date(97, UCAL_APRIL, 30);
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("The timezone is " + time_zone->getID(str));
3356d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!time_zone->inDaylightTime(d, status)) dataerrln("FAIL: inDaylightTime returned FALSE");
33650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "TimeZone::inDaylightTime", TRUE)) return;
3376d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (!time_zone->useDaylightTime()) dataerrln("FAIL: useDaylightTime returned FALSE");
3386d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru    if (time_zone->getRawOffset() != - 8 * millisPerHour) dataerrln("FAIL: getRawOffset returned wrong value");
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar *gc = new GregorianCalendar(status);
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("FAIL: Couldn't create GregorianCalendar"); return; }
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    gc->setTime(d, status);
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("FAIL: GregorianCalendar::setTime failed"); return; }
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (time_zone->getOffset(gc->AD, gc->get(UCAL_YEAR, status), gc->get(UCAL_MONTH, status),
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        gc->get(UCAL_DATE, status), (uint8_t)gc->get(UCAL_DAY_OF_WEEK, status), 0, status) != - 7 * millisPerHour)
3456d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: getOffset returned wrong value");
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) { errln("FAIL: GregorianCalendar::set failed"); return; }
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete gc;
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete time_zone;
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the call which retrieves the available IDs.
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestGetAvailableIDs913()
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef U_USE_TIMEZONE_OBSOLETE_2_8
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Test legacy API -- remove these tests when the corresponding API goes away (duh)
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t numIDs = -1;
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UnicodeString** ids = TimeZone::createAvailableIDs(numIDs);
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ids == 0 || numIDs < 1) {
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: createAvailableIDs()");
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString buf("TimeZone::createAvailableIDs() = { ");
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i<numIDs; ++i) {
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (i) buf.append(", ");
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buf.append(*ids[i]);
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buf.append(" } ");
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(buf + numIDs);
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // we own the array; the caller owns the contained strings (yuck)
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_free(ids);
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numIDs = -1;
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ids = TimeZone::createAvailableIDs(-8*U_MILLIS_PER_HOUR, numIDs);
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ids == 0 || numIDs < 1) {
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: createAvailableIDs(-8:00)");
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString buf("TimeZone::createAvailableIDs(-8:00) = { ");
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i<numIDs; ++i) {
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (i) buf.append(", ");
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buf.append(*ids[i]);
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buf.append(" } ");
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(buf + numIDs);
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // we own the array; the caller owns the contained strings (yuck)
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_free(ids);
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    numIDs = -1;
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ids = TimeZone::createAvailableIDs("US", numIDs);
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (ids == 0 || numIDs < 1) {
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      errln("FAIL: createAvailableIDs(US) ids=%d, numIDs=%d", ids, numIDs);
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString buf("TimeZone::createAvailableIDs(US) = { ");
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i<numIDs; ++i) {
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (i) buf.append(", ");
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            buf.append(*ids[i]);
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        buf.append(" } ");
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln(buf + numIDs);
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // we own the array; the caller owns the contained strings (yuck)
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uprv_free(ids);
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString str;
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString *buf = new UnicodeString("TimeZone::createEnumeration() = { ");
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t s_length;
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* s = TimeZone::createEnumeration();
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s_length = s->count(ec);
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < s_length;++i) {
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i > 0) *buf += ", ";
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((i & 1) == 0) {
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *buf += *s->snext(ec);
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            *buf += UnicodeString(s->next(NULL, ec), "");
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if((i % 5) == 4) {
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // replace s with a clone of itself
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            StringEnumeration *s2 = s->clone();
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(s2 == NULL || s_length != s2->count(ec)) {
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("TimezoneEnumeration.clone() failed");
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                delete s;
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                s = s2;
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *buf += " };";
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(*buf);
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Confirm that the following zones can be retrieved: The first
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * zone, the last zone, and one in-between.  This tests the binary
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * search through the system zone data.
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s->reset(ec);
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t middle = s_length/2;
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<s_length; ++i) {
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString* id = s->snext(ec);
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i==0 || i==middle || i==(s_length-1)) {
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone *z = TimeZone::createTimeZone(*id);
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (z == 0) {
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("FAIL: createTimeZone(") +
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  *id + ") -> 0");
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (z->getID(str) != *id) {
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("FAIL: createTimeZone(") +
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  *id + ") -> zone " + str);
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(UnicodeString("OK: createTimeZone(") +
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  *id + ") succeeded");
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete z;
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete s;
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buf->truncate(0);
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *buf += "TimeZone::createEnumeration(GMT+01:00) = { ";
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s = TimeZone::createEnumeration(1 * U_MILLIS_PER_HOUR);
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s_length = s->count(ec);
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < s_length;++i) {
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i > 0) *buf += ", ";
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *buf += *s->snext(ec);
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete s;
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *buf += " };";
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(*buf);
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buf->truncate(0);
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *buf += "TimeZone::createEnumeration(US) = { ";
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s = TimeZone::createEnumeration("US");
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s_length = s->count(ec);
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i = 0; i < s_length;++i) {
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (i > 0) *buf += ", ";
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        *buf += *s->snext(ec);
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *buf += " };";
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(*buf);
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *tz = TimeZone::createTimeZone("PST");
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz != 0) logln("getTimeZone(PST) = " + tz->getID(str));
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else errln("FAIL: getTimeZone(PST) = null");
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz;
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tz = TimeZone::createTimeZone("America/Los_Angeles");
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz != 0) logln("getTimeZone(America/Los_Angeles) = " + tz->getID(str));
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else errln("FAIL: getTimeZone(PST) = null");
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz;
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // @bug 4096694
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tz = TimeZone::createTimeZone("NON_EXISTENT");
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString temp;
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz == 0)
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getTimeZone(NON_EXISTENT) = null");
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else if (tz->getID(temp) != "GMT")
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: getTimeZone(NON_EXISTENT) = " + temp);
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz;
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete buf;
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete s;
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NOTE: As of ICU 2.8, this test confirms that the "tz.alias"
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * file, used to build ICU alias zones, is working.  It also
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * looks at some genuine Olson compatibility IDs. [aliu]
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * This test is problematic. It should really just confirm that
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * the list of compatibility zone IDs exist and are somewhat
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * meaningful (that is, they aren't all aliases of GMT). It goes a
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * bit further -- it hard-codes expectations about zone behavior,
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * when in fact zones are redefined quite frequently. ICU's build
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * process means that it is easy to update ICU to contain the
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * latest Olson zone data, but if a zone tested here changes, then
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * this test will fail.  I have updated the test for 1999j data,
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * but further updates will probably be required. Note that some
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * of the concerts listed below no longer apply -- in particular,
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * we do NOT overwrite real UNIX zones with 3-letter IDs. There
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * are two points of overlap as of 1999j: MET and EET. These are
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * both real UNIX zones, so we just use the official
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * definition. This test has been updated to reflect this.
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 12/3/99 aliu
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Added tests for additional zones and aliases from the icuzones file.
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Markus Scherer 2006-nov-06
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * [srl - from java - 7/5/1998]
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4130885
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Certain short zone IDs, used since 1.1.x, are incorrect.
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The worst of these is:
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * "CAT" (Central African Time) should be GMT+2:00, but instead returns a
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * zone at GMT-1:00. The zone at GMT-1:00 should be called EGT, CVT, EGST,
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * or AZOST, depending on which zone is meant, but in no case is it CAT.
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Other wrong zone IDs:
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ECT (European Central Time) GMT+1:00: ECT is Ecuador Time,
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * GMT-5:00. European Central time is abbreviated CEST.
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * SST (Solomon Island Time) GMT+11:00. SST is actually Samoa Standard Time,
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * GMT-11:00. Solomon Island time is SBT.
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NST (New Zealand Time) GMT+12:00. NST is the abbreviation for
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Newfoundland Standard Time, GMT-3:30. New Zealanders use NZST.
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * AST (Alaska Standard Time) GMT-9:00. [This has already been noted in
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * another bug.] It should be "AKST". AST is Atlantic Standard Time,
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * GMT-4:00.
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * PNT (Phoenix Time) GMT-7:00. PNT usually means Pitcairn Time,
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * GMT-8:30. There is no standard abbreviation for Phoenix time, as distinct
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * from MST with daylight savings.
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * In addition to these problems, a number of zones are FAKE. That is, they
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * don't match what people use in the real world.
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * FAKE zones:
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * EET (should be EEST)
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ART (should be EEST)
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * MET (should be IRST)
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * NET (should be AMST)
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * PLT (should be PKT)
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * BST (should be BDT)
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * VST (should be ICT)
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CTT (should be CST) +
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * ACT (should be CST) +
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * AET (should be EST) +
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * MIT (should be WST) +
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * IET (should be EST) +
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * PRT (should be AST) +
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * CNT (should be NST)
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * AGT (should be ARST)
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * BET (should be EST) +
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * + A zone with the correct name already exists and means something
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * else. E.g., EST usually indicates the US Eastern zone, so it cannot be
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * used for Brazil (BET).
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneTest::TestShortZoneIDs()
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
594b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
595b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
596b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // This test case is tzdata version sensitive.
597b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UBool isNonReferenceTzdataVersion = FALSE;
598b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    const char *tzdataVer = TimeZone::getTZDataVersion(status);
599b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (failure(status, "getTZDataVersion")) return;
600b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (uprv_strcmp(tzdataVer, TimeZoneTest::REFERENCE_DATA_VERSION) != 0) {
601b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // Note: We want to display a warning message here if
602b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // REFERENCE_DATA_VERSION is out of date - so we
603b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        // do not forget to update the value before GA.
604b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        isNonReferenceTzdataVersion = TRUE;
605b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        logln(UnicodeString("Warning: Active tzdata version (") + tzdataVer +
606b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            ") does not match the reference tzdata version ("
607b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            + REFERENCE_DATA_VERSION + ") for this test case data.");
608b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
609b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
610b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // Note: useDaylightTime returns true if DST is observed
611b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // in the time zone in the current calendar year.  The test
612b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // data is valid for the date after the reference year below.
613b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // If system clock is before the year, some test cases may
614b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    // fail.
615b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    GregorianCalendar cal(*TimeZone::getGMT(), status);
616b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (failure(status, "GregorianCalendar")) return;
617b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    cal.set(TimeZoneTest::REFERENCE_YEAR, UCAL_JANUARY, 2); // day 2 in GMT
618b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
619b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UBool isDateBeforeReferenceYear = ucal_getNow() < cal.getTime(status);
620b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (failure(status, "Calendar::getTime")) return;
621b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (isDateBeforeReferenceYear) {
622b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        logln("Warning: Past time is set to the system clock.  Some test cases may not return expected results.");
623b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
624b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Create a small struct to hold the array
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *id;
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t    offset;
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool      daylight;
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    kReferenceList [] =
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"MIT", -660, FALSE},
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"HST", -600, FALSE},
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"AST", -540, TRUE},
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"PST", -480, TRUE},
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"PNT", -420, FALSE},
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"MST", -420, FALSE}, // updated Aug 2003 aliu
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"CST", -360, TRUE},
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"IET", -300, TRUE},  // updated Jan 2006 srl
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"EST", -300, FALSE}, // updated Aug 2003 aliu
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"PRT", -240, FALSE},
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"CNT", -210, TRUE},
646c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"AGT", -180, TRUE}, // updated by tzdata2007k
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"BET", -180, TRUE},
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT", 0, FALSE},
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"UTC", 0, FALSE}, // ** srl: seems broken in C++
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ECT", 60, TRUE},
651b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"MET", 60, TRUE}, // updated 12/3/99 aliu
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ART", 120, TRUE},
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"EET", 120, TRUE},
654b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"CAT", 120, FALSE}, // Africa/Harare
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"EAT", 180, FALSE},
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"NET", 240, TRUE}, // updated 12/3/99 aliu
657b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"PLT", 300, FALSE}, // updated by 2008c - no DST after 2008
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"IST", 330, FALSE},
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"BST", 360, FALSE},
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"VST", 420, FALSE},
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"CTT", 480, FALSE}, // updated Aug 2003 aliu
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"JST", 540, FALSE},
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ACT", 570, FALSE}, // updated Aug 2003 aliu
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"AET", 600, TRUE},
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SST", 660, FALSE},
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"NST", 720, TRUE}, // Pacific/Auckland
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // From icuzones:
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/Unknown", 0, FALSE},
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/AST4ADT", -240, TRUE},
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/EST5EDT", -300, TRUE},
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/CST6CDT", -360, TRUE},
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/MST7MDT", -420, TRUE},
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/PST8PDT", -480, TRUE},
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/YST9YDT", -540, TRUE},
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/AST4", -240, FALSE},
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/EST5", -300, FALSE},
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/CST6", -360, FALSE},
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/MST7", -420, FALSE},
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/PST8", -480, FALSE},
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/YST9", -540, FALSE},
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"SystemV/HST10", -600, FALSE},
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"",0,FALSE}
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;kReferenceList[i].id[0];i++) {
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString itsID(kReferenceList[i].id);
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool ok = TRUE;
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Check existence.
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone *tz = TimeZone::createTimeZone(itsID);
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!tz || (kReferenceList[i].offset != 0 && *tz == *TimeZone::getGMT())) {
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: Time Zone " + itsID + " does not exist!");
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            continue;
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Check daylight usage.
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool usesDaylight = tz->useDaylightTime();
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (usesDaylight != kReferenceList[i].daylight) {
701b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (isNonReferenceTzdataVersion || isDateBeforeReferenceYear) {
702b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                logln("Warning: Time Zone " + itsID + " use daylight is " +
703b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      (usesDaylight?"TRUE":"FALSE") +
704b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      " but it should be " +
705b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      ((kReferenceList[i].daylight)?"TRUE":"FALSE"));
706b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
707b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln("FAIL: Time Zone " + itsID + " use daylight is " +
708b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      (usesDaylight?"TRUE":"FALSE") +
709b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      " but it should be " +
710b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      ((kReferenceList[i].daylight)?"TRUE":"FALSE"));
711b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ok = FALSE;
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Check offset
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t offsetInMinutes = tz->getRawOffset()/60000;
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (offsetInMinutes != kReferenceList[i].offset) {
718b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (isNonReferenceTzdataVersion || isDateBeforeReferenceYear) {
719b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                logln("FAIL: Time Zone " + itsID + " raw offset is " +
720b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      offsetInMinutes +
721b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      " but it should be " + kReferenceList[i].offset);
722b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
723b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                errln("FAIL: Time Zone " + itsID + " raw offset is " +
724b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      offsetInMinutes +
725b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      " but it should be " + kReferenceList[i].offset);
726b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ok = FALSE;
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (ok) {
731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln("OK: " + itsID +
732b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  " useDaylightTime() & getRawOffset() as expected");
733b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
734b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete tz;
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // OK now test compat
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Testing for compatibility zones");
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* compatibilityMap[] = {
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // This list is copied from tz.alias.  If tz.alias
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // changes, this list must be updated.  Current as of Mar 2007
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ACT", "Australia/Darwin",
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "AET", "Australia/Sydney",
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "AGT", "America/Buenos_Aires",
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ART", "Africa/Cairo",
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "AST", "America/Anchorage",
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "BET", "America/Sao_Paulo",
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "BST", "Asia/Dhaka", // # spelling changed in 2000h; was Asia/Dacca
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CAT", "Africa/Harare",
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CNT", "America/St_Johns",
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CST", "America/Chicago",
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "CTT", "Asia/Shanghai",
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "EAT", "Africa/Addis_Ababa",
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "ECT", "Europe/Paris",
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // EET Europe/Istanbul # EET is a standard UNIX zone
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // "EST", "America/New_York", # Defined as -05:00
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // "HST", "Pacific/Honolulu", # Defined as -10:00
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "IET", "America/Indianapolis",
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "IST", "Asia/Calcutta",
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "JST", "Asia/Tokyo",
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // MET Asia/Tehran # MET is a standard UNIX zone
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "MIT", "Pacific/Apia",
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // "MST", "America/Denver", # Defined as -07:00
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "NET", "Asia/Yerevan",
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "NST", "Pacific/Auckland",
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "PLT", "Asia/Karachi",
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "PNT", "America/Phoenix",
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "PRT", "America/Puerto_Rico",
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "PST", "America/Los_Angeles",
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "SST", "Pacific/Guadalcanal",
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "UTC", "Etc/GMT",
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        "VST", "Asia/Saigon",
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         "","",""
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0;*compatibilityMap[i];i+=2) {
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString itsID;
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *zone1 = compatibilityMap[i];
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *zone2 = compatibilityMap[i+1];
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone *tz1 = TimeZone::createTimeZone(zone1);
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone *tz2 = TimeZone::createTimeZone(zone2);
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!tz1) {
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("FAIL: Could not find short ID zone ") + zone1);
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!tz2) {
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln(UnicodeString("FAIL: Could not find long ID zone ") + zone2);
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tz1 && tz2) {
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // make NAME same so comparison will only look at the rest
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            tz2->setID(tz1->getID(itsID));
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (*tz1 != *tz2) {
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("FAIL: " + UnicodeString(zone1) +
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      " != " + UnicodeString(zone2));
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("OK: " + UnicodeString(zone1) +
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      " == " + UnicodeString(zone2));
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete tz1;
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete tz2;
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Utility function for TestCustomParse
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& TimeZoneTest::formatOffset(int32_t offset, UnicodeString &rv) {
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv.remove();
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar sign = 0x002B;
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset < 0) {
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sign = 0x002D;
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        offset = -offset;
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t s = offset % 60;
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset /= 60;
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t m = offset % 60;
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t h = offset / 60;
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv += (UChar)(sign);
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (h >= 10) {
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)(0x0030 + (h/10));
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)0x0030;
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv += (UChar)(0x0030 + (h%10));
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv += (UChar)0x003A; /* ':' */
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (m >= 10) {
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)(0x0030 + (m/10));
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)0x0030;
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv += (UChar)(0x0030 + (m%10));
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (s) {
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)0x003A; /* ':' */
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (s >= 10) {
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rv += (UChar)(0x0030 + (s/10));
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rv += (UChar)0x0030;
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)(0x0030 + (s%10));
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rv;
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Utility function for TestCustomParse, generating time zone ID
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * string for the give offset.
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString& TimeZoneTest::formatTZID(int32_t offset, UnicodeString &rv) {
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv.remove();
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar sign = 0x002B;
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset < 0) {
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        sign = 0x002D;
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        offset = -offset;
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t s = offset % 60;
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset /= 60;
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t m = offset % 60;
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t h = offset / 60;
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv += "GMT";
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv += (UChar)(sign);
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (h >= 10) {
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)(0x0030 + (h/10));
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)0x0030;
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv += (UChar)(0x0030 + (h%10));
882b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    rv += (UChar)0x003A;
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (m >= 10) {
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)(0x0030 + (m/10));
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)0x0030;
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    rv += (UChar)(0x0030 + (m%10));
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (s) {
891b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        rv += (UChar)0x003A;
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (s >= 10) {
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rv += (UChar)(0x0030 + (s/10));
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            rv += (UChar)0x0030;
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        rv += (UChar)(0x0030 + (s%10));
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return rv;
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * As part of the VM fix (see CCC approved RFE 4028006, bug
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4044013), TimeZone.getTimeZone() has been modified to recognize
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * generic IDs of the form GMT[+-]hh:mm, GMT[+-]hhmm, and
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * GMT[+-]hh.  Test this behavior here.
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4044013
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneTest::TestCustomParse()
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t kUnparseable = 604800; // the number of seconds in a week. More than any offset should be.
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *customId;
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t expectedOffset;
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    kData[] =
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // ID        Expected offset in seconds
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT",       kUnparseable},   //Isn't custom. [returns normal GMT]
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-YOUR.AD.HERE", kUnparseable},
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT0",      kUnparseable},
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+0",     (0)},
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+1",     (1*60*60)},
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-0030",  (-30*60)},
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+15:99", kUnparseable},
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+",      kUnparseable},
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-",      kUnparseable},
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+0:",    kUnparseable},
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-:",     kUnparseable},
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-YOUR.AD.HERE",    kUnparseable},
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+0010",  (10*60)}, // Interpret this as 00:10
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-10",    (-10*60*60)},
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+30",    kUnparseable},
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-3:30",  (-(3*60+30)*60)},
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-230",   (-(2*60+30)*60)},
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+05:13:05",    ((5*60+13)*60+5)},
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-71023",       (-((7*60+10)*60+23))},
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+01:23:45:67", kUnparseable},
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+01:234",      kUnparseable},
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-2:31:123",    kUnparseable},
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+3:75",        kUnparseable},
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-01010101",    kUnparseable},
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0,           0}
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; kData[i].customId != 0; i++) {
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString id(kData[i].customId);
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t exp = kData[i].expectedOffset;
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone *zone = TimeZone::createTimeZone(id);
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString   itsID, temp;
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95627f654740f2a26ad62a5c155af9199af9e69b889claireho        if (dynamic_cast<OlsonTimeZone *>(zone) != NULL) {
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(id + " -> Olson time zone");
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            zone->getID(itsID);
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t ioffset = zone->getRawOffset()/1000;
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString offset, expectedID;
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            formatOffset(ioffset, offset);
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            formatTZID(ioffset, expectedID);
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln(id + " -> " + itsID + " " + offset);
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (exp == kUnparseable && itsID != "GMT") {
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Expected parse failure for " + id +
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      ", got offset of " + offset +
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      ", id " + itsID);
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // JDK 1.3 creates custom zones with the ID "Custom"
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // JDK 1.4 creates custom zones with IDs of the form "GMT+02:00"
972b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            // ICU creates custom zones with IDs of the form "GMT+02:00"
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            else if (exp != kUnparseable && (ioffset != exp || itsID != expectedID)) {
9746d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                dataerrln("Expected offset of " + formatOffset(exp, temp) +
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      ", id " + expectedID +
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      ", for " + id +
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      ", got offset of " + offset +
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      ", id " + itsID);
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete zone;
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestAliasedNames()
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct {
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *from;
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *to;
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } kData[] = {
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Generated by org.unicode.cldr.tool.CountItems */
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* zoneID, canonical zoneID */
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Africa/Timbuktu", "Africa/Bamako"},
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Argentina/Buenos_Aires", "America/Buenos_Aires"},
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Argentina/Catamarca", "America/Catamarca"},
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Argentina/ComodRivadavia", "America/Catamarca"},
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Argentina/Cordoba", "America/Cordoba"},
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Argentina/Jujuy", "America/Jujuy"},
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Argentina/Mendoza", "America/Mendoza"},
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Atka", "America/Adak"},
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Ensenada", "America/Tijuana"},
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Fort_Wayne", "America/Indiana/Indianapolis"},
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Indianapolis", "America/Indiana/Indianapolis"},
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Knox_IN", "America/Indiana/Knox"},
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Louisville", "America/Kentucky/Louisville"},
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Porto_Acre", "America/Rio_Branco"},
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Rosario", "America/Cordoba"},
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Virgin", "America/St_Thomas"},
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Ashkhabad", "Asia/Ashgabat"},
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Chungking", "Asia/Chongqing"},
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Dacca", "Asia/Dhaka"},
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Istanbul", "Europe/Istanbul"},
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Macao", "Asia/Macau"},
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Tel_Aviv", "Asia/Jerusalem"},
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Thimbu", "Asia/Thimphu"},
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Ujung_Pandang", "Asia/Makassar"},
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Asia/Ulan_Bator", "Asia/Ulaanbaatar"},
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/ACT", "Australia/Sydney"},
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/Canberra", "Australia/Sydney"},
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/LHI", "Australia/Lord_Howe"},
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/NSW", "Australia/Sydney"},
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/North", "Australia/Darwin"},
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/Queensland", "Australia/Brisbane"},
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/South", "Australia/Adelaide"},
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/Tasmania", "Australia/Hobart"},
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/Victoria", "Australia/Melbourne"},
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/West", "Australia/Perth"},
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Australia/Yancowinna", "Australia/Broken_Hill"},
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Brazil/Acre", "America/Rio_Branco"},
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Brazil/DeNoronha", "America/Noronha"},
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Brazil/East", "America/Sao_Paulo"},
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Brazil/West", "America/Manaus"},
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/Atlantic", "America/Halifax"},
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/Central", "America/Winnipeg"},
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/East-Saskatchewan", "America/Regina"},
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/Eastern", "America/Toronto"},
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/Mountain", "America/Edmonton"},
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/Newfoundland", "America/St_Johns"},
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/Pacific", "America/Vancouver"},
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/Saskatchewan", "America/Regina"},
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Canada/Yukon", "America/Whitehorse"},
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Chile/Continental", "America/Santiago"},
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Chile/EasterIsland", "Pacific/Easter"},
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Cuba", "America/Havana"},
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Egypt", "Africa/Cairo"},
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Eire", "Europe/Dublin"},
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/GMT+0", "Etc/GMT"},
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/GMT-0", "Etc/GMT"},
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/GMT0", "Etc/GMT"},
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/Greenwich", "Etc/GMT"},
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/UCT", "Etc/GMT"},
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/UTC", "Etc/GMT"},
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/Universal", "Etc/GMT"},
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Etc/Zulu", "Etc/GMT"},
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Europe/Belfast", "Europe/London"},
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Europe/Nicosia", "Asia/Nicosia"},
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Europe/Tiraspol", "Europe/Chisinau"},
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GB", "Europe/London"},
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GB-Eire", "Europe/London"},
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT", "Etc/GMT"},
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT+0", "Etc/GMT"},
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT-0", "Etc/GMT"},
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"GMT0", "Etc/GMT"},
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Greenwich", "Etc/GMT"},
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Hongkong", "Asia/Hong_Kong"},
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Iceland", "Atlantic/Reykjavik"},
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Iran", "Asia/Tehran"},
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Israel", "Asia/Jerusalem"},
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Jamaica", "America/Jamaica"},
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Japan", "Asia/Tokyo"},
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Kwajalein", "Pacific/Kwajalein"},
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Libya", "Africa/Tripoli"},
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Mexico/BajaNorte", "America/Tijuana"},
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Mexico/BajaSur", "America/Mazatlan"},
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Mexico/General", "America/Mexico_City"},
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"NZ", "Pacific/Auckland"},
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"NZ-CHAT", "Pacific/Chatham"},
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Navajo", "America/Shiprock"},
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"PRC", "Asia/Shanghai"},
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Pacific/Samoa", "Pacific/Pago_Pago"},
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Pacific/Yap", "Pacific/Truk"},
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Poland", "Europe/Warsaw"},
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Portugal", "Europe/Lisbon"},
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ROC", "Asia/Taipei"},
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"ROK", "Asia/Seoul"},
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Singapore", "Asia/Singapore"},
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Turkey", "Europe/Istanbul"},
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"UCT", "Etc/GMT"},
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Alaska", "America/Anchorage"},
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Aleutian", "America/Adak"},
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Arizona", "America/Phoenix"},
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Central", "America/Chicago"},
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/East-Indiana", "America/Indiana/Indianapolis"},
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Eastern", "America/New_York"},
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Hawaii", "Pacific/Honolulu"},
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Indiana-Starke", "America/Indiana/Knox"},
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Michigan", "America/Detroit"},
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Mountain", "America/Denver"},
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Pacific", "America/Los_Angeles"},
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Pacific-New", "America/Los_Angeles"},
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"US/Samoa", "Pacific/Pago_Pago"},
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"UTC", "Etc/GMT"},
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Universal", "Etc/GMT"},
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"W-SU", "Europe/Moscow"},
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"Zulu", "Etc/GMT"},
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* Total: 113 */
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone::EDisplayType styles[] = { TimeZone::SHORT, TimeZone::LONG };
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool useDst[] = { FALSE, TRUE };
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t noLoc = uloc_countAvailable();
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, j, k, loc;
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString fromName, toName;
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *from = NULL, *to = NULL;
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i = 0; i < (int32_t)(sizeof(kData)/sizeof(kData[0])); i++) {
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        from = TimeZone::createTimeZone(kData[i].from);
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        to = TimeZone::createTimeZone(kData[i].to);
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!from->hasSameRules(*to)) {
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("different at %i\n", i);
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(!quick) {
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for(loc = 0; loc < noLoc; loc++) {
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                const char* locale = uloc_getAvailable(loc);
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                for(j = 0; j < (int32_t)(sizeof(styles)/sizeof(styles[0])); j++) {
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    for(k = 0; k < (int32_t)(sizeof(useDst)/sizeof(useDst[0])); k++) {
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        fromName.remove();
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        toName.remove();
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        from->getDisplayName(useDst[k], styles[j],locale, fromName);
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        to->getDisplayName(useDst[k], styles[j], locale, toName);
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        if(fromName.compare(toName) != 0) {
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            errln("Fail: Expected "+toName+" but got " + prettify(fromName)
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                + " for locale: " + locale + " index: "+ loc
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                + " to id "+ kData[i].to
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                + " from id " + kData[i].from);
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                        }
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    }
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fromName.remove();
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            toName.remove();
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            from->getDisplayName(fromName);
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            to->getDisplayName(toName);
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(fromName.compare(toName) != 0) {
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Fail: Expected "+toName+" but got " + fromName);
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete from;
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete to;
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test the basic functionality of the getDisplayName() API.
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4112869
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4028006
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See also API change request A41.
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 4/21/98 - make smarter, so the test works if the ext resources
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * are present or not.
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestDisplayName()
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *zone = TimeZone::createTimeZone("PST");
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString name;
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone->getDisplayName(Locale::getEnglish(), name);
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("PST->" + name);
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (name.compare("Pacific Standard Time") != 0)
11786d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Fail: Expected \"Pacific Standard Time\" but got " + name);
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //*****************************************************************
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // THE FOLLOWING LINES MUST BE UPDATED IF THE LOCALE DATA CHANGES
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // THE FOLLOWING LINES MUST BE UPDATED IF THE LOCALE DATA CHANGES
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // THE FOLLOWING LINES MUST BE UPDATED IF THE LOCALE DATA CHANGES
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //*****************************************************************
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool useDst;
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone::EDisplayType style;
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char *expect;
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } kData[] = {
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {FALSE, TimeZone::SHORT, "PST"},
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {TRUE,  TimeZone::SHORT, "PDT"},
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {FALSE, TimeZone::LONG,  "Pacific Standard Time"},
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {TRUE,  TimeZone::LONG,  "Pacific Daylight Time"},
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {FALSE, TimeZone::SHORT_GENERIC, "PT"},
119750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {TRUE,  TimeZone::SHORT_GENERIC, "PT"},
119850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {FALSE, TimeZone::LONG_GENERIC,  "Pacific Time"},
119950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {TRUE,  TimeZone::LONG_GENERIC,  "Pacific Time"},
120050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
120150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {FALSE, TimeZone::SHORT_GMT, "-0800"},
120250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {TRUE,  TimeZone::SHORT_GMT, "-0700"},
120350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {FALSE, TimeZone::LONG_GMT,  "GMT-08:00"},
120450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {TRUE,  TimeZone::LONG_GMT,  "GMT-07:00"},
120550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
120650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {FALSE, TimeZone::SHORT_COMMONLY_USED, "PST"},
120750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {TRUE,  TimeZone::SHORT_COMMONLY_USED, "PDT"},
120850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {FALSE, TimeZone::GENERIC_LOCATION,  "United States (Los Angeles)"},
120950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        {TRUE,  TimeZone::GENERIC_LOCATION,  "United States (Los Angeles)"},
121050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {FALSE, TimeZone::LONG, ""}
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; kData[i].expect[0] != '\0'; i++)
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name.remove();
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name = zone->getDisplayName(kData[i].useDst,
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   kData[i].style,
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   Locale::getEnglish(), name);
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name.compare(kData[i].expect) != 0)
12216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Fail: Expected " + UnicodeString(kData[i].expect) + "; got " + name);
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("PST [with options]->" + name);
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; kData[i].expect[0] != '\0'; i++)
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name.remove();
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name = zone->getDisplayName(kData[i].useDst,
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                   kData[i].style, name);
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name.compare(kData[i].expect) != 0)
12306d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Fail: Expected " + UnicodeString(kData[i].expect) + "; got " + name);
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("PST [with options]->" + name);
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure that we don't display the DST name by constructing a fake
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // PST zone that has DST all year long.
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *zone2 = new SimpleTimeZone(0, "PST");
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone2->setStartRule(UCAL_JANUARY, 1, 0, 0, status);
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone2->setEndRule(UCAL_DECEMBER, 31, 0, 0, status);
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString inDaylight;
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (zone2->inDaylightTime(UDate(0), status)) {
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inDaylight = UnicodeString("TRUE");
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        inDaylight = UnicodeString("FALSE");
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln(UnicodeString("Modified PST inDaylightTime->") + inDaylight );
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
125150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln("Some sort of error..." + UnicodeString(u_errorName(status))); // REVISIT
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    name.remove();
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    name = zone2->getDisplayName(Locale::getEnglish(),name);
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("Modified PST->" + name);
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (name.compare("Pacific Standard Time") != 0)
12576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Fail: Expected \"Pacific Standard Time\"");
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure we get the default display format for Locales
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // with no display name data.
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Locale mt_MT("mt_MT");
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    name.remove();
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    name = zone->getDisplayName(mt_MT,name);
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //*****************************************************************
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // THE FOLLOWING LINE MUST BE UPDATED IF THE LOCALE DATA CHANGES
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // THE FOLLOWING LINE MUST BE UPDATED IF THE LOCALE DATA CHANGES
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // THE FOLLOWING LINE MUST BE UPDATED IF THE LOCALE DATA CHANGES
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //*****************************************************************
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("PST(mt_MT)->" + name);
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // *** REVISIT SRL how in the world do I check this? looks java specific.
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Now be smart -- check to see if zh resource is even present.
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // If not, we expect the en fallback behavior.
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ResourceBundle enRB(NULL,
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            Locale::getEnglish(), status);
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
127750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln("Couldn't get ResourceBundle for en - %s", u_errorName(status));
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ResourceBundle mtRB(NULL,
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         mt_MT, status);
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //if(U_FAILURE(status))
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //    errln("Couldn't get ResourceBundle for mt_MT");
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool noZH = U_FAILURE(status);
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (noZH) {
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        logln("Warning: Not testing the mt_MT behavior because resource is absent");
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (name != "Pacific Standard Time")
12896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln("Fail: Expected Pacific Standard Time");
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if      (name.compare("GMT-08:00") &&
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             name.compare("GMT-8:00") &&
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             name.compare("GMT-0800") &&
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru             name.compare("GMT-800")) {
12976d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru      dataerrln(UnicodeString("Fail: Expected GMT-08:00 or something similar for PST in mt_MT but got ") + name );
12986d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("************************************************************");
12996d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("THE ABOVE FAILURE MAY JUST MEAN THE LOCALE DATA HAS CHANGED");
13006d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("************************************************************");
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Now try a non-existent zone
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone2;
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone2 = new SimpleTimeZone(90*60*1000, "xyzzy");
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    name.remove();
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    name = zone2->getDisplayName(Locale::getEnglish(),name);
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("GMT+90min->" + name);
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (name.compare("GMT+01:30") &&
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name.compare("GMT+1:30") &&
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name.compare("GMT+0130") &&
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name.compare("GMT+130"))
13136d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Fail: Expected GMT+01:30 or something similar");
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    name.truncate(0);
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    zone2->getDisplayName(name);
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    logln("GMT+90min->" + name);
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (name.compare("GMT+01:30") &&
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name.compare("GMT+1:30") &&
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name.compare("GMT+0130") &&
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        name.compare("GMT+130"))
13216d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("Fail: Expected GMT+01:30 or something similar");
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // clean up
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone;
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete zone2;
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4107276
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestDSTSavings()
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // It might be better to find a way to integrate this test into the main TimeZone
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // tests above, but I don't have time to figure out how to do this (or if it's
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // even really a good idea).  Let's consider that a future.  --rtg 1/27/98
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone *tz = new SimpleTimeZone(-5 * U_MILLIS_PER_HOUR, "dstSavingsTest",
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           UCAL_MARCH, 1, 0, 0, UCAL_SEPTEMBER, 1, 0, 0,
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           (int32_t)(0.5 * U_MILLIS_PER_HOUR), status);
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("couldn't create TimeZone");
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz->getRawOffset() != -5 * U_MILLIS_PER_HOUR)
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Got back a raw offset of ") + (tz->getRawOffset() / U_MILLIS_PER_HOUR) +
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              " hours instead of -5 hours.");
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!tz->useDaylightTime())
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Test time zone should use DST but claims it doesn't.");
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (tz->getDSTSavings() != 0.5 * U_MILLIS_PER_HOUR)
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("Set DST offset to 0.5 hour, but got back ") + (tz->getDSTSavings() /
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             U_MILLIS_PER_HOUR) + " hours instead.");
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset = tz->getOffset(GregorianCalendar::AD, 1998, UCAL_JANUARY, 1,
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UCAL_THURSDAY, 10 * U_MILLIS_PER_HOUR,status);
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -5 * U_MILLIS_PER_HOUR)
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10 AM, 1/1/98 should have been -5 hours, but we got ")
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz->getOffset(GregorianCalendar::AD, 1998, UCAL_JUNE, 1, UCAL_MONDAY,
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          10 * U_MILLIS_PER_HOUR,status);
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -4.5 * U_MILLIS_PER_HOUR)
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10 AM, 6/1/98 should have been -4.5 hours, but we got ")
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tz->setDSTSavings(U_MILLIS_PER_HOUR, status);
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz->getOffset(GregorianCalendar::AD, 1998, UCAL_JANUARY, 1,
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UCAL_THURSDAY, 10 * U_MILLIS_PER_HOUR,status);
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -5 * U_MILLIS_PER_HOUR)
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10 AM, 1/1/98 should have been -5 hours, but we got ")
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz->getOffset(GregorianCalendar::AD, 1998, UCAL_JUNE, 1, UCAL_MONDAY,
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          10 * U_MILLIS_PER_HOUR,status);
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -4 * U_MILLIS_PER_HOUR)
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10 AM, 6/1/98 (with a 1-hour DST offset) should have been -4 hours, but we got ")
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz;
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @bug 4107570
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTimeZoneTest::TestAlternateRules()
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Like TestDSTSavings, this test should probably be integrated somehow with the main
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test at the top of this class, but I didn't have time to figure out how to do that.
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //                      --rtg 1/28/98
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone tz(-5 * U_MILLIS_PER_HOUR, "alternateRuleTest");
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test the day-of-month API
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tz.setStartRule(UCAL_MARCH, 10, 12 * U_MILLIS_PER_HOUR, status);
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("tz.setStartRule failed");
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tz.setEndRule(UCAL_OCTOBER, 20, 12 * U_MILLIS_PER_HOUR, status);
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("tz.setStartRule failed");
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t offset = tz.getOffset(GregorianCalendar::AD, 1998, UCAL_MARCH, 5,
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              UCAL_THURSDAY, 10 * U_MILLIS_PER_HOUR,status);
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -5 * U_MILLIS_PER_HOUR)
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10AM, 3/5/98 should have been -5 hours, but we got ")
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz.getOffset(GregorianCalendar::AD, 1998, UCAL_MARCH, 15,
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UCAL_SUNDAY, 10 * millisPerHour,status);
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -4 * U_MILLIS_PER_HOUR)
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10AM, 3/15/98 should have been -4 hours, but we got ")
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz.getOffset(GregorianCalendar::AD, 1998, UCAL_OCTOBER, 15,
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UCAL_THURSDAY, 10 * millisPerHour,status);
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -4 * U_MILLIS_PER_HOUR)
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10AM, 10/15/98 should have been -4 hours, but we got ")              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz.getOffset(GregorianCalendar::AD, 1998, UCAL_OCTOBER, 25,
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UCAL_SUNDAY, 10 * millisPerHour,status);
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -5 * U_MILLIS_PER_HOUR)
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10AM, 10/25/98 should have been -5 hours, but we got ")
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // test the day-of-week-after-day-in-month API
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tz.setStartRule(UCAL_MARCH, 10, UCAL_FRIDAY, 12 * millisPerHour, TRUE, status);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("tz.setStartRule failed");
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    tz.setEndRule(UCAL_OCTOBER, 20, UCAL_FRIDAY, 12 * millisPerHour, FALSE, status);
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status))
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("tz.setStartRule failed");
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz.getOffset(GregorianCalendar::AD, 1998, UCAL_MARCH, 11,
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UCAL_WEDNESDAY, 10 * millisPerHour,status);
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -5 * U_MILLIS_PER_HOUR)
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10AM, 3/11/98 should have been -5 hours, but we got ")
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz.getOffset(GregorianCalendar::AD, 1998, UCAL_MARCH, 14,
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UCAL_SATURDAY, 10 * millisPerHour,status);
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -4 * U_MILLIS_PER_HOUR)
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10AM, 3/14/98 should have been -4 hours, but we got ")
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz.getOffset(GregorianCalendar::AD, 1998, UCAL_OCTOBER, 15,
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UCAL_THURSDAY, 10 * millisPerHour,status);
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -4 * U_MILLIS_PER_HOUR)
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10AM, 10/15/98 should have been -4 hours, but we got ")
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    offset = tz.getOffset(GregorianCalendar::AD, 1998, UCAL_OCTOBER, 17,
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          UCAL_SATURDAY, 10 * millisPerHour,status);
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (offset != -5 * U_MILLIS_PER_HOUR)
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln(UnicodeString("The offset for 10AM, 10/17/98 should have been -5 hours, but we got ")
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru              + (offset / U_MILLIS_PER_HOUR) + " hours.");
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneTest::TestFractionalDST() {
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const char* tzName = "Australia/Lord_Howe"; // 30 min offset
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone* tz_icu = TimeZone::createTimeZone(tzName);
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	int dst_icu = tz_icu->getDSTSavings();
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString id;
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t expected = 1800000;
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	if (expected != dst_icu) {
14646d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru	    dataerrln(UnicodeString("java reports dst savings of ") + expected +
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	        " but icu reports " + dst_icu +
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	        " for tz " + tz_icu->getID(id));
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	} else {
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	    logln(UnicodeString("both java and icu report dst savings of ") + expected + " for tz " + tz_icu->getID(id));
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru	}
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete tz_icu;
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Test country code support.  Jitterbug 776.
1475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
1476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneTest::TestCountries() {
1477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Make sure America/Los_Angeles is in the "US" group, and
1478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Asia/Tokyo isn't.  Vice versa for the "JP" group.
1479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
1480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t n;
1481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* s = TimeZone::createEnumeration("US");
1482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    n = s->count(ec);
1483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool la = FALSE, tokyo = FALSE;
1484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString laZone("America/Los_Angeles", "");
1485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString tokyoZone("Asia/Tokyo", "");
1486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
1487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (s == NULL || n <= 0) {
14896d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("FAIL: TimeZone::createEnumeration() returned nothing");
1490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<n; ++i) {
1493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString* id = s->snext(ec);
1494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*id == (laZone)) {
1495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            la = TRUE;
1496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*id == (tokyoZone)) {
1498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            tokyo = TRUE;
1499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (!la || tokyo) {
1502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: " + laZone + " in US = " + la);
1503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: " + tokyoZone + " in US = " + tokyo);
1504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete s;
1506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    s = TimeZone::createEnumeration("JP");
1508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    n = s->count(ec);
1509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    la = FALSE; tokyo = FALSE;
1510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (i=0; i<n; ++i) {
1512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString* id = s->snext(ec);
1513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*id == (laZone)) {
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            la = TRUE;
1515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (*id == (tokyoZone)) {
1517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            tokyo = TRUE;
1518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (la || !tokyo) {
1521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: " + laZone + " in JP = " + la);
1522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("FAIL: " + tokyoZone + " in JP = " + tokyo);
1523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* s1 = TimeZone::createEnumeration("US");
1525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    StringEnumeration* s2 = TimeZone::createEnumeration("US");
1526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<n;++i){
1527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UnicodeString* id1 = s1->snext(ec);
1528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(id1==NULL || U_FAILURE(ec)){
1529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("Failed to fetch next from TimeZone enumeration. Length returned : %i Current Index: %i", n,i);
1530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone* tz1 = TimeZone::createTimeZone(*id1);
1532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(int j=0; j<n;++j){
1533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const UnicodeString* id2 = s2->snext(ec);
1534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(id2==NULL || U_FAILURE(ec)){
1535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("Failed to fetch next from TimeZone enumeration. Length returned : %i Current Index: %i", n,i);
1536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            TimeZone* tz2 = TimeZone::createTimeZone(*id2);
1538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(tz1->hasSameRules(*tz2)){
1539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln("ID1 : " + *id1+" == ID2 : " +*id2);
1540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            delete tz2;
1542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete tz1;
1544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete s1;
1546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete s2;
1547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    delete s;
1548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneTest::TestHistorical() {
1551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const int32_t H = U_MILLIS_PER_HOUR;
1552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct {
1553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* id;
1554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t time; // epoch seconds
1555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t offset; // total offset (millis)
1556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } DATA[] = {
1557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Add transition points (before/after) as desired to test historical
1558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // behavior.
1559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Los_Angeles", 638963999, -8*H}, // Sun Apr 01 01:59:59 GMT-08:00 1990
1560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Los_Angeles", 638964000, -7*H}, // Sun Apr 01 03:00:00 GMT-07:00 1990
1561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Los_Angeles", 657104399, -7*H}, // Sun Oct 28 01:59:59 GMT-07:00 1990
1562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Los_Angeles", 657104400, -8*H}, // Sun Oct 28 01:00:00 GMT-08:00 1990
1563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Goose_Bay", -116445601, -4*H}, // Sun Apr 24 01:59:59 GMT-04:00 1966
1564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Goose_Bay", -116445600, -3*H}, // Sun Apr 24 03:00:00 GMT-03:00 1966
1565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Goose_Bay", -100119601, -3*H}, // Sun Oct 30 01:59:59 GMT-03:00 1966
1566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Goose_Bay", -100119600, -4*H}, // Sun Oct 30 01:00:00 GMT-04:00 1966
1567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Goose_Bay", -84391201, -4*H}, // Sun Apr 30 01:59:59 GMT-04:00 1967
1568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Goose_Bay", -84391200, -3*H}, // Sun Apr 30 03:00:00 GMT-03:00 1967
1569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Goose_Bay", -68670001, -3*H}, // Sun Oct 29 01:59:59 GMT-03:00 1967
1570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {"America/Goose_Bay", -68670000, -4*H}, // Sun Oct 29 01:00:00 GMT-04:00 1967
1571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {0, 0, 0}
1572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (int32_t i=0; DATA[i].id!=0; ++i) {
1575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const char* id = DATA[i].id;
1576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        TimeZone *tz = TimeZone::createTimeZone(id);
1577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UnicodeString s;
1578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (tz == 0) {
1579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: Cannot create %s", id);
1580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (tz->getID(s) != UnicodeString(id)) {
15816d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"FAIL: createTimeZone(" + id + ") => " + s);
1582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UErrorCode ec = U_ZERO_ERROR;
1584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t raw, dst;
1585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UDate when = (double) DATA[i].time * U_MILLIS_PER_SECOND;
1586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            tz->getOffset(when, FALSE, raw, dst, ec);
1587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(ec)) {
1588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("FAIL: getOffset");
1589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if ((raw+dst) != DATA[i].offset) {
1590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln((UnicodeString)"FAIL: " + DATA[i].id + ".getOffset(" +
1591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      //when + " = " +
1592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      dateToString(when) + ") => " +
1593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      raw + ", " + dst);
1594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                logln((UnicodeString)"Ok: " + DATA[i].id + ".getOffset(" +
1596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      //when + " = " +
1597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      dateToString(when) + ") => " +
1598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      raw + ", " + dst);
1599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete tz;
1602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneTest::TestEquivalentIDs() {
1606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t n = TimeZone::countEquivalentIDs("PST");
1607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (n < 2) {
16086d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln((UnicodeString)"FAIL: countEquivalentIDs(PST) = " + n);
1609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UBool sawLA = FALSE;
1611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (int32_t i=0; i<n; ++i) {
1612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            UnicodeString id = TimeZone::getEquivalentID("PST", i);
1613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            logln((UnicodeString)"" + i + " : " + id);
1614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (id == UnicodeString("America/Los_Angeles")) {
1615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                sawLA = TRUE;
1616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (!sawLA) {
1619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            errln("FAIL: America/Los_Angeles should be in the list");
1620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Test that a transition at the end of February is handled correctly.
1625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TimeZoneTest::TestFebruary() {
1626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Time zone with daylight savings time from the first Sunday in November
1629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // to the last Sunday in February.
1630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Similar to the new rule for Brazil (Sao Paulo) in tzdata2006n.
1631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    //
1632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Note: In tzdata2007h, the rule had changed, so no actual zones uses
1633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // lastSun in Feb anymore.
1634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone tz1(-3 * U_MILLIS_PER_HOUR,          // raw offset: 3h before (west of) GMT
1635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UNICODE_STRING("nov-feb", 7),
1636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UCAL_NOVEMBER, 1, UCAL_SUNDAY,   // start: November, first, Sunday
1637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       0,                               //        midnight wall time
1638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UCAL_FEBRUARY, -1, UCAL_SUNDAY,  // end:   February, last, Sunday
1639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       0,                               //        midnight wall time
1640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       status);
1641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Unable to create the SimpleTimeZone(nov-feb): %s", u_errorName(status));
1643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Now hardcode the same rules as for Brazil in tzdata 2006n, so that
1647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // we cover the intended code even when in the future zoneinfo hardcodes
1648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // these transition dates.
1649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    SimpleTimeZone tz2(-3 * U_MILLIS_PER_HOUR,          // raw offset: 3h before (west of) GMT
1650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UNICODE_STRING("nov-feb2", 8),
1651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UCAL_NOVEMBER, 1, -UCAL_SUNDAY,  // start: November, 1 or after, Sunday
1652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       0,                               //        midnight wall time
1653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       UCAL_FEBRUARY, -29, -UCAL_SUNDAY,// end:   February, 29 or before, Sunday
1654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       0,                               //        midnight wall time
1655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                       status);
1656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
1657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errln("Unable to create the SimpleTimeZone(nov-feb2): %s", u_errorName(status));
1658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Gregorian calendar with the UTC time zone for getting sample test date/times.
1662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GregorianCalendar gc(*TimeZone::getGMT(), status);
1663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
166450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        dataerrln("Unable to create the UTC calendar: %s", u_errorName(status));
1665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    struct {
1669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // UTC time.
1670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t year, month, day, hour, minute, second;
1671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Expected time zone offset in hours after GMT (negative=before GMT).
1672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        int32_t offsetHours;
1673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } data[] = {
1674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2006, UCAL_NOVEMBER,  5, 02, 59, 59, -3 },
1675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2006, UCAL_NOVEMBER,  5, 03, 00, 00, -2 },
1676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2007, UCAL_FEBRUARY, 25, 01, 59, 59, -2 },
1677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2007, UCAL_FEBRUARY, 25, 02, 00, 00, -3 },
1678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2007, UCAL_NOVEMBER,  4, 02, 59, 59, -3 },
1680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2007, UCAL_NOVEMBER,  4, 03, 00, 00, -2 },
1681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2008, UCAL_FEBRUARY, 24, 01, 59, 59, -2 },
1682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2008, UCAL_FEBRUARY, 24, 02, 00, 00, -3 },
1683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2008, UCAL_NOVEMBER,  2, 02, 59, 59, -3 },
1685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2008, UCAL_NOVEMBER,  2, 03, 00, 00, -2 },
1686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2009, UCAL_FEBRUARY, 22, 01, 59, 59, -2 },
1687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2009, UCAL_FEBRUARY, 22, 02, 00, 00, -3 },
1688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2009, UCAL_NOVEMBER,  1, 02, 59, 59, -3 },
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2009, UCAL_NOVEMBER,  1, 03, 00, 00, -2 },
1691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2010, UCAL_FEBRUARY, 28, 01, 59, 59, -2 },
1692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 2010, UCAL_FEBRUARY, 28, 02, 00, 00, -3 }
1693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *timezones[] = { &tz1, &tz2 };
1696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TimeZone *tz;
1698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UDate dt;
1699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t t, i, raw, dst;
1700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (t = 0; t < LENGTHOF(timezones); ++t) {
1701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tz = timezones[t];
1702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i = 0; i < LENGTHOF(data); ++i) {
1703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            gc.set(data[i].year, data[i].month, data[i].day,
1704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   data[i].hour, data[i].minute, data[i].second);
1705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            dt = gc.getTime(status);
1706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("test case %d.%d: bad date/time %04d-%02d-%02d %02d:%02d:%02d",
1708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      t, i,
1709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      data[i].year, data[i].month + 1, data[i].day,
1710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      data[i].hour, data[i].minute, data[i].second);
1711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                status = U_ZERO_ERROR;
1712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                continue;
1713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            tz->getOffset(dt, FALSE, raw, dst, status);
1715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (U_FAILURE(status)) {
1716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("test case %d.%d: tz.getOffset(%04d-%02d-%02d %02d:%02d:%02d) fails: %s",
1717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      t, i,
1718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      data[i].year, data[i].month + 1, data[i].day,
1719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      data[i].hour, data[i].minute, data[i].second,
1720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      u_errorName(status));
1721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                status = U_ZERO_ERROR;
1722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else if ((raw + dst) != data[i].offsetHours * U_MILLIS_PER_HOUR) {
1723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                errln("test case %d.%d: tz.getOffset(%04d-%02d-%02d %02d:%02d:%02d) returns %d+%d != %d",
1724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      t, i,
1725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      data[i].year, data[i].month + 1, data[i].day,
1726b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      data[i].hour, data[i].minute, data[i].second,
1727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      raw, dst, data[i].offsetHours * U_MILLIS_PER_HOUR);
1728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1729b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1730b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1731b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1732c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid TimeZoneTest::TestCanonicalID() {
1733c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1734c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Some canonical IDs in CLDR are defined as "Link"
1735c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // in Olson tzdata.
1736c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const struct {
1737c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char *alias;
1738c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char *zone;
1739c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    } excluded1[] = {
1740c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"America/Shiprock", "America/Denver"}, // America/Shiprock is defined as a Link to America/Denver in tzdata
1741c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"America/Marigot", "America/Guadeloupe"},
1742c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"America/St_Barthelemy", "America/Guadeloupe"},
1743c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Antarctica/South_Pole", "Antarctica/McMurdo"},
1744c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Atlantic/Jan_Mayen", "Europe/Oslo"},
1745c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Arctic/Longyearbyen", "Europe/Oslo"},
1746c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Guernsey", "Europe/London"},
1747c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Isle_of_Man", "Europe/London"},
1748c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Jersey", "Europe/London"},
1749c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Ljubljana", "Europe/Belgrade"},
1750c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Podgorica", "Europe/Belgrade"},
1751c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Sarajevo", "Europe/Belgrade"},
1752c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Skopje", "Europe/Belgrade"},
1753c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Zagreb", "Europe/Belgrade"},
1754c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Bratislava", "Europe/Prague"},
1755c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Mariehamn", "Europe/Helsinki"},
1756c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/San_Marino", "Europe/Rome"},
1757c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"Europe/Vatican", "Europe/Rome"},
1758c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {0, 0}
1759c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
1760c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1761c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Following IDs are aliases of Etc/GMT in CLDR,
1762c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // but Olson tzdata has 3 independent definitions
1763c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // for Etc/GMT, Etc/UTC, Etc/UCT.
1764c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Until we merge them into one equivalent group
1765c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // in zoneinfo.res, we exclude them in the test
1766c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // below.
1767c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const char* excluded2[] = {
1768c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "Etc/UCT", "UCT",
1769c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "Etc/UTC", "UTC",
1770c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "Etc/Universal", "Universal",
1771c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        "Etc/Zulu", "Zulu", 0
1772c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
1773c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1774c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Walk through equivalency groups
1775c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UErrorCode ec = U_ZERO_ERROR;
1776c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    int32_t s_length, i, j, k;
1777c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    StringEnumeration* s = TimeZone::createEnumeration();
1778c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UnicodeString canonicalID, tmpCanonical;
1779c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    s_length = s->count(ec);
1780c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (i = 0; i < s_length;++i) {
1781c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const UnicodeString *tzid = s->snext(ec);
1782c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        int32_t nEquiv = TimeZone::countEquivalentIDs(*tzid);
1783c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (nEquiv == 0) {
1784c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            continue;
1785c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1786c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UBool bFoundCanonical = FALSE;
1787c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // Make sure getCanonicalID returns the exact same result
1788c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // for all entries within a same equivalency group with some
1789c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // exceptions listed in exluded1.
1790c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // Also, one of them must be canonical id.
1791c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        for (j = 0; j < nEquiv; j++) {
1792c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            UnicodeString tmp = TimeZone::getEquivalentID(*tzid, j);
1793c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            TimeZone::getCanonicalID(tmp, tmpCanonical, ec);
1794c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (U_FAILURE(ec)) {
1795c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                errln((UnicodeString)"FAIL: getCanonicalID(" + tmp + ") failed.");
1796c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                ec = U_ZERO_ERROR;
1797c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                continue;
1798c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
1799c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            // Some exceptional cases
1800c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            for (k = 0; excluded1[k].alias != 0; k++) {
1801c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                if (tmpCanonical == excluded1[k].alias) {
1802c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    tmpCanonical = excluded1[k].zone;
1803c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    break;
1804c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                }
1805c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
1806c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (j == 0) {
1807c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                canonicalID = tmpCanonical;
1808c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            } else if (canonicalID != tmpCanonical) {
1809c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                errln("FAIL: getCanonicalID(" + tmp + ") returned " + tmpCanonical + " expected:" + canonicalID);
1810c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
1811c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1812c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (canonicalID == tmp) {
1813c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                bFoundCanonical = TRUE;
1814c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
1815c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1816c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // At least one ID in an equvalency group must match the
1817c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        // canonicalID
1818c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (bFoundCanonical == FALSE) {
1819c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            // test exclusion because of differences between Olson tzdata and CLDR
1820c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            UBool isExcluded = FALSE;
1821c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            for (k = 0; excluded2[k] != 0; k++) {
1822c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                if (*tzid == UnicodeString(excluded2[k])) {
1823c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    isExcluded = TRUE;
1824c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    break;
1825c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                }
1826c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
1827c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (isExcluded) {
1828c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                continue;
1829c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
1830c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            errln((UnicodeString)"FAIL: No timezone ids match the canonical ID " + canonicalID);
1831c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1832c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1833c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    delete s;
1834c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1835c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    // Testing some special cases
1836c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    static const struct {
1837c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char *id;
1838c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        const char *expected;
1839c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UBool isSystem;
1840c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    } data[] = {
1841b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"GMT-03", "GMT-03:00", FALSE},
1842b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"GMT+4", "GMT+04:00", FALSE},
1843b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"GMT-055", "GMT-00:55", FALSE},
1844b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"GMT+430", "GMT+04:30", FALSE},
1845b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"GMT-12:15", "GMT-12:15", FALSE},
1846b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        {"GMT-091015", "GMT-09:10:15", FALSE},
1847c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"GMT+1:90", 0, FALSE},
1848c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"America/Argentina/Buenos_Aires", "America/Buenos_Aires", TRUE},
1849c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"bogus", 0, FALSE},
1850c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {"", 0, FALSE},
1851c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        {0, 0, FALSE}
1852c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
1853c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1854c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UBool isSystemID;
1855c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (i = 0; data[i].id != 0; i++) {
1856c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TimeZone::getCanonicalID(UnicodeString(data[i].id), canonicalID, isSystemID, ec);
1857c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (U_FAILURE(ec)) {
1858c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            if (ec != U_ILLEGAL_ARGUMENT_ERROR || data[i].expected != 0) {
1859c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                errln((UnicodeString)"FAIL: getCanonicalID(\"" + data[i].id
1860c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                    + "\") returned status U_ILLEGAL_ARGUMENT_ERROR");
1861c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            }
1862c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            ec = U_ZERO_ERROR;
1863c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            continue;
1864c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1865c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (canonicalID != data[i].expected) {
18666d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"FAIL: getCanonicalID(\"" + data[i].id
1867c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                + "\") returned " + canonicalID + " - expected: " + data[i].expected);
1868c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1869c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (isSystemID != data[i].isSystem) {
18706d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru            dataerrln((UnicodeString)"FAIL: getCanonicalID(\"" + data[i].id
1871c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                + "\") set " + isSystemID + " to isSystemID");
1872c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1873c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1874c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
1875c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1876c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//
1877c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//  Test Display Names, choosing zones and lcoales where there are multiple
1878c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//                      meta-zones defined.
1879c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru//
1880c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Querustatic struct   {
1881c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char            *zoneName;
1882c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char            *localeName;
1883c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UBool                  summerTime;
1884c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    TimeZone::EDisplayType style;
1885c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    const char            *expectedDisplayName; }
1886c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru zoneDisplayTestData [] =  {
1887c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru     //  zone id         locale   summer   format          expected display name
1888c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Europe/London",     "en", FALSE, TimeZone::SHORT, "GMT"},
1889c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Europe/London",     "en", FALSE, TimeZone::LONG,  "Greenwich Mean Time"},
1890c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Europe/London",     "en", TRUE,  TimeZone::SHORT, "GMT+01:00" /*"BST"*/},
1891c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Europe/London",     "en", TRUE,  TimeZone::LONG,  "British Summer Time"},
1892c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1893c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"America/Anchorage", "en", FALSE, TimeZone::SHORT, "AKST"},
1894c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"America/Anchorage", "en", FALSE, TimeZone::LONG,  "Alaska Standard Time"},
1895c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"America/Anchorage", "en", TRUE,  TimeZone::SHORT, "AKDT"},
1896c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"America/Anchorage", "en", TRUE,  TimeZone::LONG,  "Alaska Daylight Time"},
1897c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1898c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      // Southern Hemisphere, all data from meta:Australia_Western
1899c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Australia/Perth",   "en", FALSE, TimeZone::SHORT, "GMT+08:00"/*"AWST"*/},
1900c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Australia/Perth",   "en", FALSE, TimeZone::LONG,  "Australian Western Standard Time"},
1901c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Australia/Perth",   "en", TRUE,  TimeZone::SHORT, "GMT+09:00"/*"AWDT"*/},
1902c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Australia/Perth",   "en", TRUE,  TimeZone::LONG,  "Australian Western Daylight Time"},
1903c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1904c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"America/Sao_Paulo",  "en", FALSE, TimeZone::SHORT, "GMT-03:00"/*"BRT"*/},
1905c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"America/Sao_Paulo",  "en", FALSE, TimeZone::LONG,  "Brasilia Time"},
1906c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"America/Sao_Paulo",  "en", TRUE,  TimeZone::SHORT, "GMT-02:00"/*"BRST"*/},
1907c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"America/Sao_Paulo",  "en", TRUE,  TimeZone::LONG,  "Brasilia Summer Time"},
1908c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1909c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      // No Summer Time, but had it before 1983.
1910c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Pacific/Honolulu",   "en", FALSE, TimeZone::SHORT, "HST"},
1911c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Pacific/Honolulu",   "en", FALSE, TimeZone::LONG,  "Hawaii-Aleutian Standard Time"},
1912c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Pacific/Honolulu",   "en", TRUE,  TimeZone::SHORT, "HST"},
1913c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Pacific/Honolulu",   "en", TRUE,  TimeZone::LONG,  "Hawaii-Aleutian Standard Time"},
1914c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1915c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      // Northern, has Summer, not commonly used.
1916c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Europe/Helsinki",    "en", FALSE, TimeZone::SHORT, "GMT+02:00"/*"EET"*/},
1917c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Europe/Helsinki",    "en", FALSE, TimeZone::LONG,  "Eastern European Time"},
1918c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Europe/Helsinki",    "en", TRUE,  TimeZone::SHORT, "GMT+03:00"/*"EEST"*/},
1919c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {"Europe/Helsinki",    "en", true,  TimeZone::LONG,  "Eastern European Summer Time"},
1920c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru      {NULL, NULL, FALSE, TimeZone::SHORT, NULL}   // NULL values terminate list
1921c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    };
1922c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru
1923c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queruvoid TimeZoneTest::TestDisplayNamesMeta() {
1924b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
1925b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    GregorianCalendar cal(*TimeZone::getGMT(), status);
192650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (failure(status, "GregorianCalendar", TRUE)) return;
1927b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1928b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    UBool isReferenceYear = TRUE;
1929b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    if (cal.get(UCAL_YEAR, status) != TimeZoneTest::REFERENCE_YEAR) {
1930b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru        isReferenceYear = FALSE;
1931b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru    }
1932b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru
1933c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    UBool sawAnError = FALSE;
1934c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    for (int testNum   = 0; zoneDisplayTestData[testNum].zoneName != NULL; testNum++) {
1935c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        Locale locale  = Locale::createFromName(zoneDisplayTestData[testNum].localeName);
1936c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        TimeZone *zone = TimeZone::createTimeZone(zoneDisplayTestData[testNum].zoneName);
1937c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        UnicodeString displayName;
1938c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        zone->getDisplayName(zoneDisplayTestData[testNum].summerTime,
1939c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                             zoneDisplayTestData[testNum].style,
1940c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                             locale,
1941c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru                             displayName);
1942c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (displayName != zoneDisplayTestData[testNum].expectedDisplayName) {
1943c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            char  name[100];
1944c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            UErrorCode status = U_ZERO_ERROR;
1945c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            displayName.extract(name, 100, NULL, status);
1946b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            if (isReferenceYear) {
1947b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                sawAnError = TRUE;
19486d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                dataerrln("Incorrect time zone display name.  zone = \"%s\",\n"
1949b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      "   locale = \"%s\",   style = %s,  Summertime = %d\n"
1950b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      "   Expected \"%s\", "
19516d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                      "   Got \"%s\"\n   Error: %s", zoneDisplayTestData[testNum].zoneName,
1952b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         zoneDisplayTestData[testNum].localeName,
1953b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         zoneDisplayTestData[testNum].style==TimeZone::SHORT ?
1954b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                            "SHORT" : "LONG",
1955b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         zoneDisplayTestData[testNum].summerTime,
1956b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         zoneDisplayTestData[testNum].expectedDisplayName,
19576d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                         name,
19586d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru                                         u_errorName(status));
1959b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            } else {
1960b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                logln("Incorrect time zone display name.  zone = \"%s\",\n"
1961b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      "   locale = \"%s\",   style = %s,  Summertime = %d\n"
1962b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      "   Expected \"%s\", "
1963b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                      "   Got \"%s\"\n", zoneDisplayTestData[testNum].zoneName,
1964b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         zoneDisplayTestData[testNum].localeName,
1965b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         zoneDisplayTestData[testNum].style==TimeZone::SHORT ?
1966b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                            "SHORT" : "LONG",
1967b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         zoneDisplayTestData[testNum].summerTime,
1968b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         zoneDisplayTestData[testNum].expectedDisplayName,
1969b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru                                         name);
1970b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru            }
1971c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
1972c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        delete zone;
1973c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1974c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (sawAnError) {
19756d5deb12725f146643d443090dfa11b206df528aJean-Baptiste Queru        dataerrln("***Note: Errors could be the result of changes to zoneStrings locale data");
1976c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
1977c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru}
1978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
1980