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