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