-//##header\r
-/**\r
- *******************************************************************************\r
- * Copyright (C) 2000-2009, International Business Machines Corporation and *\r
- * others. All Rights Reserved. *\r
- *******************************************************************************\r
- */\r
-\r
-/**\r
- * @test 1.18 99/09/21\r
- * @bug 4052967 4073209 4073215 4084933 4096952 4109314 4126678 4151406 4151429\r
- * @bug 4154525 4154537 4154542 4154650 4159922 4162593 4173604 4176686 4184229 4208960\r
- */\r
-\r
-package com.ibm.icu.dev.test.timezone;\r
-import com.ibm.icu.util.*;\r
-import java.io.*;\r
-import com.ibm.icu.text.*;\r
-import com.ibm.icu.dev.test.*;\r
-import java.util.Date;\r
-import java.util.Locale;\r
-\r
-public class TimeZoneRegression extends TestFmwk {\r
-\r
- public static void main(String[] args) throws Exception {\r
- new TimeZoneRegression().run(args);\r
- }\r
-\r
- public void Test4052967() {\r
- logln("*** CHECK TIMEZONE AGAINST HOST OS SETTING ***");\r
- String id = TimeZone.getDefault().getID();\r
- try {\r
- // user.timezone is a protected system property\r
- logln("user.timezone: " + System.getProperty("user.timezone", "<not set>"));\r
- logln("TimeZone.getDefault().getID(): " + id);\r
- logln(new Date().toString());\r
- logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");\r
- }\r
- catch (SecurityException e) {\r
- warnln("security exception: " + e.toString());\r
- }\r
- }\r
-\r
- public void Test4073209() {\r
- TimeZone z1 = TimeZone.getTimeZone("PST");\r
- TimeZone z2 = TimeZone.getTimeZone("PST");\r
- if (z1 == z2) errln("Fail: TimeZone should return clones");\r
- }\r
-\r
- public void Test4073215() {\r
- SimpleTimeZone z = new SimpleTimeZone(0, "GMT");\r
- if (z.useDaylightTime())\r
- errln("Fail: Fix test to start with non-DST zone");\r
- z.setStartRule(Calendar.FEBRUARY, 1, Calendar.SUNDAY, 0);\r
- z.setEndRule(Calendar.MARCH, -1, Calendar.SUNDAY, 0);\r
- if (!z.useDaylightTime())\r
- errln("Fail: DST not active");\r
- Calendar tempcal = Calendar.getInstance();\r
- tempcal.clear();\r
- tempcal.setTimeZone(z);\r
- tempcal.set(1997, Calendar.JANUARY, 31);\r
- Date d1 = tempcal.getTime();\r
- if (z.inDaylightTime(d1)) {\r
- errln("Fail: DST not working as expected");\r
- } \r
-\r
- tempcal.set(1997, Calendar.MARCH, 1);\r
- Date d2 = tempcal.getTime();\r
- if (!z.inDaylightTime(d2)) {\r
- errln("Fail: DST not working as expected");\r
- }\r
- tempcal.clear();\r
- tempcal.set(1997, Calendar.MARCH, 31);\r
- Date d3 = tempcal.getTime();\r
- if (z.inDaylightTime(d3)) {\r
- errln("Fail: DST not working as expected");\r
- } \r
- }\r
-\r
- /**\r
- * The expected behavior of TimeZone around the boundaries is:\r
- * (Assume transition time of 2:00 AM)\r
- * day of onset 1:59 AM STD = display name 1:59 AM ST\r
- * 2:00 AM STD = display name 3:00 AM DT\r
- * day of end 0:59 AM STD = display name 1:59 AM DT\r
- * 1:00 AM STD = display name 1:00 AM ST\r
- */\r
- public void Test4084933() {\r
- TimeZone tz = TimeZone.getTimeZone("PST");\r
-\r
- long offset1 = tz.getOffset(1,\r
- 1997, Calendar.OCTOBER, 26, Calendar.SUNDAY, (2*60*60*1000));\r
- long offset2 = tz.getOffset(1,\r
- 1997, Calendar.OCTOBER, 26, Calendar.SUNDAY, (2*60*60*1000)-1);\r
-\r
- long offset3 = tz.getOffset(1,\r
- 1997, Calendar.OCTOBER, 26, Calendar.SUNDAY, (1*60*60*1000));\r
- long offset4 = tz.getOffset(1,\r
- 1997, Calendar.OCTOBER, 26, Calendar.SUNDAY, (1*60*60*1000)-1);\r
-\r
- /*\r
- * The following was added just for consistency. It shows that going *to* Daylight\r
- * Savings Time (PDT) does work at 2am.\r
- */\r
-\r
- long offset5 = tz.getOffset(1,\r
- 1997, Calendar.APRIL, 6, Calendar.SUNDAY, (2*60*60*1000));\r
- long offset6 = tz.getOffset(1,\r
- 1997, Calendar.APRIL, 6, Calendar.SUNDAY, (2*60*60*1000)-1);\r
-\r
- long offset7 = tz.getOffset(1,\r
- 1997, Calendar.APRIL, 6, Calendar.SUNDAY, (1*60*60*1000));\r
- long offset8 = tz.getOffset(1,\r
- 1997, Calendar.APRIL, 6, Calendar.SUNDAY, (1*60*60*1000)-1);\r
-\r
- long SToffset = -8 * 60*60*1000L;\r
- long DToffset = -7 * 60*60*1000L;\r
- if (offset1 != SToffset || offset2 != SToffset ||\r
- offset3 != SToffset || offset4 != DToffset ||\r
- offset5 != DToffset || offset6 != SToffset ||\r
- offset7 != SToffset || offset8 != SToffset)\r
- warnln("Fail: TimeZone misbehaving");\r
- }\r
-\r
- public void Test4096952() {\r
- String[] ZONES = { "GMT", "MET", "IST" };\r
- boolean pass = true;\r
- try {\r
- for (int i=0; i<ZONES.length; ++i) {\r
- TimeZone zone = TimeZone.getTimeZone(ZONES[i]);\r
- if (!zone.getID().equals(ZONES[i]))\r
- warnln("Fail: Test broken; zones not instantiating");\r
-\r
- ByteArrayOutputStream baos;\r
- ObjectOutputStream ostream =\r
- new ObjectOutputStream(baos = new\r
- ByteArrayOutputStream());\r
- ostream.writeObject(zone);\r
- ostream.close();\r
- baos.close();\r
- ObjectInputStream istream =\r
- new ObjectInputStream(new\r
- ByteArrayInputStream(baos.toByteArray()));\r
- TimeZone frankenZone = (TimeZone) istream.readObject();\r
- //logln("Zone: " + zone);\r
- //logln("FrankenZone: " + frankenZone);\r
- if (!zone.equals(frankenZone)) {\r
- logln("TimeZone " + zone.getID() +\r
- " not equal to serialized/deserialized one");\r
- pass = false;\r
- }\r
- }\r
- if (!pass) errln("Fail: TimeZone serialization/equality bug");\r
- }\r
- catch (IOException e) {\r
- errln("Fail: " + e);\r
- e.printStackTrace();\r
- }\r
- catch (ClassNotFoundException e) {\r
- errln("Fail: " + e);\r
- e.printStackTrace();\r
- }\r
- }\r
-\r
- public void Test4109314() {\r
- GregorianCalendar testCal = (GregorianCalendar)Calendar.getInstance();\r
- TimeZone PST = TimeZone.getTimeZone("PST");\r
- java.util.Calendar tempcal = java.util.Calendar.getInstance();\r
- tempcal.clear();\r
- tempcal.set(1998,Calendar.APRIL,4,22,0);\r
- Date d1 = tempcal.getTime();\r
- tempcal.set(1998,Calendar.APRIL,5,6,0);\r
- Date d2 = tempcal.getTime();\r
- tempcal.set(1998,Calendar.OCTOBER,24,22,0);\r
- Date d3 = tempcal.getTime();\r
- tempcal.set(1998,Calendar.OCTOBER,25,6,0);\r
- Date d4 = tempcal.getTime();\r
- Object[] testData = {\r
- PST, d1, d2,\r
- PST, d3, d4,\r
- };\r
- boolean pass=true;\r
- for (int i=0; i<testData.length; i+=3) {\r
- testCal.setTimeZone((TimeZone) testData[i]);\r
- long t = ((Date)testData[i+1]).getTime();\r
- Date end = (Date) testData[i+2];\r
- while (t < end.getTime()) {\r
- testCal.setTime(new Date(t));\r
- if (!checkCalendar314(testCal, (TimeZone) testData[i]))\r
- pass = false;\r
- t += 60*60*1000L;\r
- }\r
- }\r
- if (!pass) errln("Fail: TZ API inconsistent");\r
- }\r
-\r
- boolean checkCalendar314(GregorianCalendar testCal, TimeZone testTZ) {\r
- // GregorianCalendar testCal = (GregorianCalendar)aCal.clone();\r
-\r
- final int ONE_DAY = 24*60*60*1000;\r
-\r
- int tzOffset, tzRawOffset;\r
- Float tzOffsetFloat,tzRawOffsetFloat;\r
- // Here is where the user made an error. They were passing in the value of\r
- // the MILLSECOND field; you need to pass in the millis in the day in STANDARD\r
- // time.\r
- int millis = testCal.get(Calendar.MILLISECOND) +\r
- 1000 * (testCal.get(Calendar.SECOND) +\r
- 60 * (testCal.get(Calendar.MINUTE) +\r
- 60 * (testCal.get(Calendar.HOUR_OF_DAY)))) -\r
- testCal.get(Calendar.DST_OFFSET);\r
-\r
- /* Fix up millis to be in range. ASSUME THAT WE ARE NOT AT THE\r
- * BEGINNING OR END OF A MONTH. We must add this code because\r
- * getOffset() has been changed to be more strict about the parameters\r
- * it receives -- it turns out that this test was passing in illegal\r
- * values. */\r
- int date = testCal.get(Calendar.DATE);\r
- int dow = testCal.get(Calendar.DAY_OF_WEEK);\r
- while (millis < 0) {\r
- millis += ONE_DAY;\r
- --date;\r
- dow = Calendar.SUNDAY + ((dow - Calendar.SUNDAY + 6) % 7);\r
- }\r
- while (millis >= ONE_DAY) {\r
- millis -= ONE_DAY;\r
- ++date;\r
- dow = Calendar.SUNDAY + ((dow - Calendar.SUNDAY + 1) % 7);\r
- }\r
-\r
- tzOffset = testTZ.getOffset(testCal.get(Calendar.ERA),\r
- testCal.get(Calendar.YEAR),\r
- testCal.get(Calendar.MONTH),\r
- date,\r
- dow,\r
- millis);\r
- tzRawOffset = testTZ.getRawOffset();\r
- tzOffsetFloat = new Float((float)tzOffset/(float)3600000);\r
- tzRawOffsetFloat = new Float((float)tzRawOffset/(float)3600000);\r
-\r
- Date testDate = testCal.getTime();\r
-\r
- boolean inDaylightTime = testTZ.inDaylightTime(testDate);\r
- SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm");\r
- sdf.setCalendar(testCal);\r
- String inDaylightTimeString;\r
-\r
- boolean passed;\r
-\r
- if (inDaylightTime)\r
- {\r
- inDaylightTimeString = " DST ";\r
- passed = (tzOffset == (tzRawOffset + 3600000));\r
- }\r
- else\r
- {\r
- inDaylightTimeString = " ";\r
- passed = (tzOffset == tzRawOffset);\r
- }\r
-\r
- String output = testTZ.getID() + " " + sdf.format(testDate) +\r
- " Offset(" + tzOffsetFloat + ")" +\r
- " RawOffset(" + tzRawOffsetFloat + ")" +\r
- " " + millis/(float)3600000 + " " +\r
- inDaylightTimeString;\r
-\r
- if (passed)\r
- output += " ";\r
- else\r
- output += "ERROR";\r
-\r
- if (passed) logln(output); else errln(output);\r
- return passed;\r
- }\r
-\r
- /**\r
- * CANNOT REPRODUDE\r
- *\r
- * Yet another _alleged_ bug in TimeZone.getOffset(), a method that never\r
- * should have been made public. It's simply too hard to use correctly.\r
- *\r
- * The original test code failed to do the following:\r
- * (1) Call Calendar.setTime() before getting the fields!\r
- * (2) Use the right millis (as usual) for getOffset(); they were passing\r
- * in the MILLIS field, instead of the STANDARD MILLIS IN DAY.\r
- * When you fix these two problems, the test passes, as expected.\r
- */\r
- public void Test4126678() {\r
- // Note: this test depends on the PST time zone.\r
- TimeZone initialZone = TimeZone.getDefault();\r
- Calendar cal = Calendar.getInstance();\r
- TimeZone tz = TimeZone.getTimeZone("PST");\r
- TimeZone.setDefault(tz);\r
- cal.setTimeZone(tz);\r
-\r
- java.util.Calendar tempcal = java.util.Calendar.getInstance();\r
- tempcal.clear();\r
- tempcal.set(1998, Calendar.APRIL, 5, 10, 0);\r
- Date dt = tempcal.getTime();\r
- // the dt value is local time in PST.\r
- if (!tz.inDaylightTime(dt))\r
- errln("We're not in Daylight Savings Time and we should be.\n");\r
-\r
- cal.setTime(dt);\r
- int era = cal.get(Calendar.ERA);\r
- int year = cal.get(Calendar.YEAR);\r
- int month = cal.get(Calendar.MONTH);\r
- int day = cal.get(Calendar.DATE);\r
- int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);\r
- int millis = cal.get(Calendar.MILLISECOND) +\r
- (cal.get(Calendar.SECOND) +\r
- (cal.get(Calendar.MINUTE) +\r
- (cal.get(Calendar.HOUR) * 60) * 60) * 1000) -\r
- cal.get(Calendar.DST_OFFSET);\r
-\r
- long offset = tz.getOffset(era, year, month, day, dayOfWeek, millis);\r
- long raw_offset = tz.getRawOffset();\r
- if (offset == raw_offset)\r
- errln("Offsets should not match when in DST");\r
-\r
- // restore the initial time zone so that this test case\r
- // doesn't affect the others.\r
- TimeZone.setDefault(initialZone);\r
- }\r
-\r
- /**\r
- * TimeZone.getAvailableIDs(int) throws exception for certain values,\r
- * due to a faulty constant in TimeZone.java.\r
- */\r
- public void Test4151406() {\r
- int max = 0;\r
- for (int h=-28; h<=30; ++h) {\r
- // h is in half-hours from GMT; rawoffset is in millis\r
- int rawoffset = h * 1800000;\r
- int hh = (h<0) ? -h : h;\r
- String hname = ((h<0) ? "GMT-" : "GMT+") +\r
- ((hh/2 < 10) ? "0" : "") +\r
- (hh/2) + ':' +\r
- ((hh%2==0) ? "00" : "30");\r
- try {\r
- String[] ids = TimeZone.getAvailableIDs(rawoffset);\r
- if (ids.length > max) max = ids.length;\r
- logln(hname + ' ' + ids.length +\r
- ((ids.length > 0) ? (" e.g. " + ids[0]) : ""));\r
- } catch (Exception e) {\r
- errln(hname + ' ' + "Fail: " + e);\r
- }\r
- }\r
- logln("Maximum zones per offset = " + max);\r
- }\r
-\r
- public void Test4151429() {\r
- try {\r
- TimeZone tz = TimeZone.getTimeZone("GMT");\r
- /*String name =*/ tz.getDisplayName(true, Integer.MAX_VALUE,\r
- Locale.getDefault());\r
- errln("IllegalArgumentException not thrown by TimeZone.getDisplayName()");\r
- } catch(IllegalArgumentException e) {\r
- System.out.print("");\r
- }\r
- }\r
-\r
- /**\r
- * SimpleTimeZone accepts illegal DST savings values. These values\r
- * must be non-zero. There is no upper limit at this time.\r
- */\r
- public void Test4154525() {\r
- final int GOOD = 1, BAD = 0;\r
- int[] DATA = {\r
- 1, GOOD,\r
- 0, BAD,\r
- -1, BAD,\r
- 60*60*1000, GOOD,\r
- Integer.MIN_VALUE, BAD,\r
- // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time\r
- };\r
- for (int i=0; i<DATA.length; i+=2) {\r
- int savings = DATA[i];\r
- boolean valid = DATA[i+1] == GOOD;\r
- String method = null;\r
- for (int j=0; j<2; ++j) {\r
- try {\r
- switch (j) {\r
- case 0:\r
- method = "constructor";\r
- SimpleTimeZone z = new SimpleTimeZone(0, "id",\r
- Calendar.JANUARY, 1, 0, 0,\r
- Calendar.MARCH, 1, 0, 0,\r
- savings); // <- what we're interested in\r
- break;\r
- case 1:\r
- method = "setDSTSavings()";\r
- z = new SimpleTimeZone(0, "GMT");\r
- z.setDSTSavings(savings);\r
- break;\r
- }\r
- if (valid) {\r
- logln("Pass: DST savings of " + savings + " accepted by " + method);\r
- } else {\r
- errln("Fail: DST savings of " + savings + " accepted by " + method);\r
- }\r
- } catch (IllegalArgumentException e) {\r
- if (valid) {\r
- errln("Fail: DST savings of " + savings + " to " + method + " gave " + e);\r
- } else {\r
- logln("Pass: DST savings of " + savings + " to " + method + " gave " + e);\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * SimpleTimeZone.hasSameRules() doesn't work for zones with no DST\r
- * and different DST parameters.\r
- */\r
- public void Test4154537() {\r
- // tz1 and tz2 have no DST and different rule parameters\r
- SimpleTimeZone tz1 = new SimpleTimeZone(0, "1", 0, 0, 0, 0, 2, 0, 0, 0);\r
- SimpleTimeZone tz2 = new SimpleTimeZone(0, "2", 1, 0, 0, 0, 3, 0, 0, 0);\r
- // tza and tzA have the same rule params\r
- SimpleTimeZone tza = new SimpleTimeZone(0, "a", 0, 1, 0, 0, 3, 2, 0, 0);\r
- SimpleTimeZone tzA = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 3, 2, 0, 0);\r
- // tzb differs from tza\r
- SimpleTimeZone tzb = new SimpleTimeZone(0, "b", 0, 1, 0, 0, 3, 1, 0, 0);\r
- if (tz1.useDaylightTime() || tz2.useDaylightTime() ||\r
- !tza.useDaylightTime() || !tzA.useDaylightTime() ||\r
- !tzb.useDaylightTime()) {\r
- errln("Test is broken -- rewrite it");\r
- }\r
- if (!tza.hasSameRules(tzA) || tza.hasSameRules(tzb)) {\r
- errln("Fail: hasSameRules() broken for zones with rules");\r
- }\r
- if (!tz1.hasSameRules(tz2)) {\r
- errln("Fail: hasSameRules() returns false for zones without rules");\r
- errln("zone 1 = " + tz1);\r
- errln("zone 2 = " + tz2);\r
- }\r
- }\r
-\r
- /**\r
- * SimpleTimeZone constructors, setStartRule(), and setEndRule() don't\r
- * check for out-of-range arguments.\r
- */\r
- public void Test4154542() {\r
- final int GOOD = 1;\r
- final int BAD = 0;\r
-\r
- final int GOOD_MONTH = Calendar.JANUARY;\r
- final int GOOD_DAY = 1;\r
- final int GOOD_DAY_OF_WEEK = Calendar.SUNDAY;\r
- final int GOOD_TIME = 0;\r
-\r
- int[] DATA = {\r
- GOOD, Integer.MIN_VALUE, 0, Integer.MAX_VALUE, Integer.MIN_VALUE,\r
- GOOD, Calendar.JANUARY, -5, Calendar.SUNDAY, 0,\r
- GOOD, Calendar.DECEMBER, 5, Calendar.SATURDAY, 24*60*60*1000-1,\r
- BAD, Calendar.DECEMBER, 5, Calendar.SATURDAY, 24*60*60*1000+1,\r
- BAD, Calendar.DECEMBER, 5, Calendar.SATURDAY, -1,\r
- BAD, Calendar.JANUARY, -6, Calendar.SUNDAY, 0,\r
- BAD, Calendar.DECEMBER, 6, Calendar.SATURDAY, 24*60*60*1000,\r
- GOOD, Calendar.DECEMBER, 1, 0, 0,\r
- GOOD, Calendar.DECEMBER, 31, 0, 0,\r
- BAD, Calendar.APRIL, 31, 0, 0,\r
- BAD, Calendar.DECEMBER, 32, 0, 0,\r
- BAD, Calendar.JANUARY-1, 1, Calendar.SUNDAY, 0,\r
- BAD, Calendar.DECEMBER+1, 1, Calendar.SUNDAY, 0,\r
- GOOD, Calendar.DECEMBER, 31, -Calendar.SUNDAY, 0,\r
- GOOD, Calendar.DECEMBER, 31, -Calendar.SATURDAY, 0,\r
- BAD, Calendar.DECEMBER, 32, -Calendar.SATURDAY, 0,\r
- BAD, Calendar.DECEMBER, -32, -Calendar.SATURDAY, 0,\r
- BAD, Calendar.DECEMBER, 31, -Calendar.SATURDAY-1, 0,\r
- };\r
- SimpleTimeZone zone = new SimpleTimeZone(0, "Z");\r
- for (int i=0; i<DATA.length; i+=5) {\r
- boolean shouldBeGood = (DATA[i] == GOOD);\r
- int month = DATA[i+1];\r
- int day = DATA[i+2];\r
- int dayOfWeek = DATA[i+3];\r
- int time = DATA[i+4];\r
-\r
- Exception ex = null;\r
- try {\r
- zone.setStartRule(month, day, dayOfWeek, time);\r
- } catch (IllegalArgumentException e) {\r
- ex = e;\r
- }\r
- if ((ex == null) != shouldBeGood) {\r
- errln("setStartRule(month=" + month + ", day=" + day +\r
- ", dayOfWeek=" + dayOfWeek + ", time=" + time +\r
- (shouldBeGood ? (") should work but throws " + ex)\r
- : ") should fail but doesn't"));\r
- }\r
-\r
- ex = null;\r
- try {\r
- zone.setEndRule(month, day, dayOfWeek, time);\r
- } catch (IllegalArgumentException e) {\r
- ex = e;\r
- }\r
- if ((ex == null) != shouldBeGood) {\r
- errln("setEndRule(month=" + month + ", day=" + day +\r
- ", dayOfWeek=" + dayOfWeek + ", time=" + time +\r
- (shouldBeGood ? (") should work but throws " + ex)\r
- : ") should fail but doesn't"));\r
- }\r
-\r
- ex = null;\r
- try {\r
- /*SimpleTimeZone temp =*/ new SimpleTimeZone(0, "Z",\r
- month, day, dayOfWeek, time,\r
- GOOD_MONTH, GOOD_DAY, GOOD_DAY_OF_WEEK, GOOD_TIME);\r
- } catch (IllegalArgumentException e) {\r
- ex = e;\r
- }\r
- if ((ex == null) != shouldBeGood) {\r
- errln("SimpleTimeZone(month=" + month + ", day=" + day +\r
- ", dayOfWeek=" + dayOfWeek + ", time=" + time +\r
- (shouldBeGood ? (", <end>) should work but throws " + ex)\r
- : ", <end>) should fail but doesn't"));\r
- }\r
-\r
- ex = null;\r
- try {\r
- /*SimpleTimeZone temp = */new SimpleTimeZone(0, "Z",\r
- GOOD_MONTH, GOOD_DAY, GOOD_DAY_OF_WEEK, GOOD_TIME,\r
- month, day, dayOfWeek, time);\r
- // temp = null;\r
- } catch (IllegalArgumentException e) {\r
- ex = e;\r
- }\r
- if ((ex == null) != shouldBeGood) {\r
- errln("SimpleTimeZone(<start>, month=" + month + ", day=" + day +\r
- ", dayOfWeek=" + dayOfWeek + ", time=" + time +\r
- (shouldBeGood ? (") should work but throws " + ex)\r
- : ") should fail but doesn't"));\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * SimpleTimeZone.getOffset accepts illegal arguments.\r
- */\r
- public void Test4154650() {\r
- final int GOOD=1, BAD=0;\r
- final int GOOD_ERA=GregorianCalendar.AD, GOOD_YEAR=1998, GOOD_MONTH=Calendar.AUGUST;\r
- final int GOOD_DAY=2, GOOD_DOW=Calendar.SUNDAY, GOOD_TIME=16*3600000;\r
- int[] DATA = {\r
- GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
-\r
- GOOD, GregorianCalendar.BC, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
- GOOD, GregorianCalendar.AD, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
- BAD, GregorianCalendar.BC-1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
- BAD, GregorianCalendar.AD+1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
-\r
- GOOD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
- GOOD, GOOD_ERA, GOOD_YEAR, Calendar.DECEMBER, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
- BAD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY-1, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
- BAD, GOOD_ERA, GOOD_YEAR, Calendar.DECEMBER+1, GOOD_DAY, GOOD_DOW, GOOD_TIME,\r
-\r
- GOOD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, 1, GOOD_DOW, GOOD_TIME,\r
- GOOD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, 31, GOOD_DOW, GOOD_TIME,\r
- BAD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, 0, GOOD_DOW, GOOD_TIME,\r
- BAD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, 32, GOOD_DOW, GOOD_TIME,\r
-\r
- GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar.SUNDAY, GOOD_TIME,\r
- GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar.SATURDAY, GOOD_TIME,\r
- BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar.SUNDAY-1, GOOD_TIME,\r
- BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar.SATURDAY+1, GOOD_TIME,\r
-\r
- GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 0,\r
- GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000-1,\r
- BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, -1,\r
- BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000,\r
- };\r
-\r
- TimeZone tz = TimeZone.getDefault();\r
- for (int i=0; i<DATA.length; i+=7) {\r
- boolean good = DATA[i] == GOOD;\r
- IllegalArgumentException e = null;\r
- try {\r
- /*int offset =*/ tz.getOffset(DATA[i+1], DATA[i+2], DATA[i+3],\r
- DATA[i+4], DATA[i+5], DATA[i+6]);\r
- //offset = 0;\r
- } catch (IllegalArgumentException ex) {\r
- e = ex;\r
- }\r
- if (good != (e == null)) {\r
- errln("Fail: getOffset(" +\r
- DATA[i+1] + ", " + DATA[i+2] + ", " + DATA[i+3] + ", " +\r
- DATA[i+4] + ", " + DATA[i+5] + ", " + DATA[i+6] +\r
- (good ? (") threw " + e) : ") accepts invalid args"));\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * TimeZone constructors allow null IDs.\r
- */\r
- public void Test4159922() {\r
- TimeZone z = null;\r
-\r
- // TimeZone API. Only hasSameRules() and setDefault() should\r
- // allow null.\r
- try {\r
- z = TimeZone.getTimeZone(null);\r
- errln("FAIL: Null allowed in getTimeZone");\r
- } catch (NullPointerException e) {\r
- System.out.print("");\r
- }\r
- z = TimeZone.getTimeZone("GMT");\r
- try {\r
- // {dlf} requiring cast for disambiguation is ok for compatibility since null\r
- // is not a valid argument to this API\r
- z.getDisplayName(false, TimeZone.SHORT, (ULocale)null);\r
- errln("FAIL: Null allowed in getDisplayName(3)");\r
- } catch (NullPointerException e) {\r
- System.out.print("");\r
- }\r
- try {\r
- // {dlf} see above\r
- z.getDisplayName((ULocale)null);\r
- errln("FAIL: Null allowed in getDisplayName(1)");\r
- } catch (NullPointerException e) {\r
- System.out.print("");\r
- }\r
- try {\r
- if (z.hasSameRules(null)) {\r
- errln("FAIL: hasSameRules returned true");\r
- }\r
- } catch (NullPointerException e) {\r
- errln("FAIL: Null NOT allowed in hasSameRules");\r
- }\r
- try {\r
- z.inDaylightTime(null);\r
- errln("FAIL: Null allowed in inDaylightTime");\r
- } catch (NullPointerException e) {\r
- System.out.print("");\r
- }\r
- try {\r
- z.setID(null);\r
- errln("FAIL: Null allowed in setID");\r
- } catch (NullPointerException e) {\r
- System.out.print("");\r
- }\r
-\r
- TimeZone save = TimeZone.getDefault();\r
- try {\r
- TimeZone.setDefault(null);\r
- } catch (NullPointerException e) {\r
- errln("FAIL: Null NOT allowed in setDefault");\r
- } finally {\r
- TimeZone.setDefault(save);\r
- }\r
-\r
- // SimpleTimeZone API\r
- SimpleTimeZone s = null;\r
- try {\r
- s = new SimpleTimeZone(0, null);\r
- errln("FAIL: Null allowed in SimpleTimeZone(2)");\r
- } catch (NullPointerException e) {\r
- System.out.print("");\r
- }\r
- try {\r
- s = new SimpleTimeZone(0, null, 0, 1, 0, 0, 0, 1, 0, 0);\r
- errln("FAIL: Null allowed in SimpleTimeZone(10)");\r
- } catch (NullPointerException e) {\r
- System.out.print("");\r
- }\r
- try {\r
- s = new SimpleTimeZone(0, null, 0, 1, 0, 0, 0, 1, 0, 0, 1000);\r
- errln("FAIL: Null allowed in SimpleTimeZone(11)");\r
- } catch (NullPointerException e) {\r
- System.out.print("");\r
- }\r
- if(s!=null){\r
- errln("FAIL: Did not get the expected Exception");\r
- }\r
- }\r
-\r
- /**\r
- * TimeZone broken at midnight. The TimeZone code fails to handle\r
- * transitions at midnight correctly.\r
- */\r
- public void Test4162593() {\r
- SimpleDateFormat fmt = new SimpleDateFormat("z", Locale.US);\r
- final int ONE_HOUR = 60*60*1000;\r
- final float H = (float) ONE_HOUR;\r
- TimeZone initialZone = TimeZone.getDefault();\r
- SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy HH:mm z");\r
-\r
- SimpleTimeZone asuncion = new SimpleTimeZone(-4*ONE_HOUR, "America/Asuncion" /*PY%sT*/,\r
- Calendar.OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR,\r
- Calendar.MARCH, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR);\r
-\r
- /* Zone\r
- * Starting time\r
- * Transition expected between start+1H and start+2H\r
- */\r
- Object[] DATA = {\r
- new SimpleTimeZone(2*ONE_HOUR, "Asia/Damascus" /*EE%sT*/,\r
- Calendar.APRIL, 1, 0 /*DOM*/, 0*ONE_HOUR,\r
- Calendar.OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR),\r
- new int[] {1998, Calendar.SEPTEMBER, 30, 22, 0},\r
- Boolean.TRUE,\r
-\r
- asuncion,\r
- new int[] {2000, Calendar.FEBRUARY, 28, 22, 0},\r
- Boolean.FALSE,\r
-\r
- asuncion,\r
- new int[] {2000, Calendar.FEBRUARY, 29, 22, 0},\r
- Boolean.TRUE,\r
- };\r
-\r
- String[] zone = new String[4];\r
-\r
- for (int j=0; j<DATA.length; j+=3) {\r
- TimeZone tz = (TimeZone)DATA[j];\r
- TimeZone.setDefault(tz);\r
- fmt.setTimeZone(tz);\r
- sdf.setTimeZone(tz);\r
-\r
- // Must construct the Date object AFTER setting the default zone\r
- int[] p = (int[])DATA[j+1];\r
- Calendar cal = Calendar.getInstance();\r
- cal.clear();\r
- cal.set(p[0], p[1], p[2], p[3], p[4]);\r
- long start = cal.getTime().getTime();\r
- boolean transitionExpected = ((Boolean)DATA[j+2]).booleanValue();\r
-\r
- logln(tz.getID() + ":");\r
- for (int i=0; i<4; ++i) {\r
- Date d = new Date(start + i*ONE_HOUR);\r
- zone[i] = fmt.format(d);\r
- logln("" + i + ": " + sdf.format(d) + " => " + zone[i] +\r
- " (" + d.getTime()/H + ")");\r
- }\r
- cal.set(p[0], p[1], p[2], 0, 0);\r
- for (int i=0; i<4; ++i) {\r
- int h = 22+i;\r
- int dom = p[2]+(h>=24?1:0);\r
- h %= 24;\r
- int ms = h*ONE_HOUR;\r
- cal.clear();\r
- cal.set(p[0], p[1], dom, 0, 0);\r
- int off = tz.getOffset(GregorianCalendar.AD,\r
- cal.get(Calendar.YEAR),\r
- cal.get(Calendar.MONTH),\r
- cal.get(Calendar.DATE),\r
- cal.get(Calendar.DAY_OF_WEEK),\r
- ms);\r
- cal.add(Calendar.HOUR, h);\r
- int dstOffset = cal.get(Calendar.DST_OFFSET);\r
- logln("h=" + h + "; dom=" + dom +\r
- "; ZONE_OFFSET=" + cal.get(Calendar.ZONE_OFFSET)/H +\r
- "; DST_OFFSET=" + dstOffset/H +\r
- "; getOffset()=" + off/H +\r
- " (" + cal.getTime().getTime()/H + ")");\r
- }\r
- if (zone[0].equals(zone[1]) &&\r
- (zone[1].equals(zone[2]) != transitionExpected) &&\r
- zone[2].equals(zone[3])) {\r
- logln("Ok: transition " + transitionExpected);\r
- } else {\r
- errln("FAIL: expected " +\r
- (transitionExpected?"transition":"no transition"));\r
- }\r
- }\r
-\r
- // restore the initial time zone so that this test case\r
- // doesn't affect the others.\r
- TimeZone.setDefault(initialZone);\r
- }\r
-\r
- /**\r
- * TimeZone broken in last hour of year\r
- */\r
- public void Test4173604() {\r
- TimeZone pst = TimeZone.getTimeZone("PST");\r
- int o22 = pst.getOffset(1, 1998, 11, 31, Calendar.THURSDAY, 22*60*60*1000);\r
- int o23 = pst.getOffset(1, 1998, 11, 31, Calendar.THURSDAY, 23*60*60*1000);\r
- int o00 = pst.getOffset(1, 1999, 0, 1, Calendar.FRIDAY, 0);\r
- if (o22 != o23 || o22 != o00) {\r
- errln("Offsets should be the same (for PST), but got: " +\r
- "12/31 22:00 " + o22 +\r
- ", 12/31 23:00 " + o23 +\r
- ", 01/01 00:00 " + o00);\r
- }\r
-\r
- GregorianCalendar cal = new GregorianCalendar();\r
- cal.setTimeZone(pst);\r
- cal.clear();\r
- cal.set(1998, Calendar.JANUARY, 1);\r
- int lastDST = cal.get(Calendar.DST_OFFSET);\r
- int transitions = 0;\r
- int delta = 5;\r
- while (cal.get(Calendar.YEAR) < 2000) {\r
- cal.add(Calendar.MINUTE, delta);\r
- if (cal.get(Calendar.DST_OFFSET) != lastDST) {\r
- ++transitions;\r
- Calendar t = (Calendar)cal.clone();\r
- t.add(Calendar.MINUTE, -delta);\r
- logln(t.getTime() + " " + t.get(Calendar.DST_OFFSET));\r
- logln(cal.getTime() + " " + (lastDST=cal.get(Calendar.DST_OFFSET)));\r
- }\r
- }\r
- if (transitions != 4) {\r
- errln("Saw " + transitions + " transitions; should have seen 4");\r
- }\r
- }\r
-\r
- /**\r
- * getDisplayName doesn't work with unusual savings/offsets.\r
- */\r
- public void Test4176686() {\r
- // Construct a zone that does not observe DST but\r
- // that does have a DST savings (which should be ignored).\r
- int offset = 90 * 60000; // 1:30\r
- SimpleTimeZone z1 = new SimpleTimeZone(offset, "_std_zone_");\r
- z1.setDSTSavings(45 * 60000); // 0:45\r
-\r
- // Construct a zone that observes DST for the first 6 months.\r
- SimpleTimeZone z2 = new SimpleTimeZone(offset, "_dst_zone_");\r
- z2.setDSTSavings(45 * 60000); // 0:45\r
- z2.setStartRule(Calendar.JANUARY, 1, 0);\r
- z2.setEndRule(Calendar.JULY, 1, 0);\r
-\r
- // Also check DateFormat\r
- DateFormat fmt1 = new SimpleDateFormat("z");\r
- fmt1.setTimeZone(z1); // Format uses standard zone\r
- DateFormat fmt2 = new SimpleDateFormat("z");\r
- fmt2.setTimeZone(z2); // Format uses DST zone\r
- java.util.Calendar tempcal = java.util.Calendar.getInstance();\r
- tempcal.clear();\r
- tempcal.set(1970, Calendar.FEBRUARY, 1);\r
- Date dst = tempcal.getTime(); // Time in DST\r
- tempcal.set(1970, Calendar.AUGUST, 1);\r
- Date std = tempcal.getTime(); // Time in standard\r
-\r
- // Description, Result, Expected Result\r
- String[] DATA = {\r
- "getDisplayName(false, SHORT)/std zone",\r
- z1.getDisplayName(false, TimeZone.SHORT), "GMT+01:30",\r
- "getDisplayName(false, LONG)/std zone",\r
- z1.getDisplayName(false, TimeZone.LONG ), "GMT+01:30",\r
- "getDisplayName(true, SHORT)/std zone",\r
- z1.getDisplayName(true, TimeZone.SHORT), "GMT+01:30",\r
- "getDisplayName(true, LONG)/std zone",\r
- z1.getDisplayName(true, TimeZone.LONG ), "GMT+01:30",\r
- "getDisplayName(false, SHORT)/dst zone",\r
- z2.getDisplayName(false, TimeZone.SHORT), "GMT+01:30",\r
- "getDisplayName(false, LONG)/dst zone",\r
- z2.getDisplayName(false, TimeZone.LONG ), "GMT+01:30",\r
- "getDisplayName(true, SHORT)/dst zone",\r
- z2.getDisplayName(true, TimeZone.SHORT), "GMT+02:15",\r
- "getDisplayName(true, LONG)/dst zone",\r
- z2.getDisplayName(true, TimeZone.LONG ), "GMT+02:15",\r
- "DateFormat.format(std)/std zone", fmt1.format(std), "GMT+01:30",\r
- "DateFormat.format(dst)/std zone", fmt1.format(dst), "GMT+01:30",\r
- "DateFormat.format(std)/dst zone", fmt2.format(std), "GMT+01:30",\r
- "DateFormat.format(dst)/dst zone", fmt2.format(dst), "GMT+02:15",\r
- };\r
-\r
- for (int i=0; i<DATA.length; i+=3) {\r
- if (!DATA[i+1].equals(DATA[i+2])) {\r
- errln("FAIL: " + DATA[i] + " -> " + DATA[i+1] + ", exp " + DATA[i+2]);\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * SimpleTimeZone allows invalid DOM values.\r
- */\r
- // Current orgnaization of data in zoneinfor.res allows negative\r
- // values from DOM so comment these tests out\r
- \r
- public void Test4184229() {\r
- SimpleTimeZone zone = null;\r
- try {\r
- zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 0);\r
- errln("Failed. No exception has been thrown for DOM -1 startDay");\r
- } catch(IllegalArgumentException e) {\r
- logln("(a) " + e.getMessage());\r
- }\r
- try {\r
- zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0);\r
- errln("Failed. No exception has been thrown for DOM -1 endDay");\r
- } catch(IllegalArgumentException e) {\r
- logln("(b) " + e.getMessage());\r
- }\r
- try {\r
- zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 0, 1000);\r
- errln("Failed. No exception has been thrown for DOM -1 startDay +savings");\r
- } catch(IllegalArgumentException e) {\r
- logln("(c) " + e.getMessage());\r
- }\r
- try {\r
- zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, 1000);\r
- errln("Failed. No exception has been thrown for DOM -1 endDay +savings");\r
- } catch(IllegalArgumentException e) {\r
- logln("(d) " + e.getMessage());\r
- }\r
- // Make a valid constructor call for subsequent tests.\r
-\r
- zone = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 0, 1, 0, 0);\r
- \r
- try {\r
- zone.setStartRule(0, -1, 0, 0);\r
- errln("Failed. No exception has been thrown for DOM -1 setStartRule +savings");\r
- } catch(IllegalArgumentException e) {\r
- logln("(e) " + e.getMessage());\r
- }\r
- try {\r
- zone.setStartRule(0, -1, 0);\r
- errln("Failed. No exception has been thrown for DOM -1 setStartRule");\r
- } catch(IllegalArgumentException e) {\r
- logln("(f) " + e.getMessage());\r
- }\r
- try {\r
- zone.setEndRule(0, -1, 0, 0);\r
- errln("Failed. No exception has been thrown for DOM -1 setEndRule +savings");\r
- } catch(IllegalArgumentException e) {\r
- logln("(g) " + e.getMessage());\r
- }\r
- try {\r
- zone.setEndRule(0, -1, 0);\r
- errln("Failed. No exception has been thrown for DOM -1 setEndRule");\r
- } catch(IllegalArgumentException e) {\r
- logln("(h) " + e.getMessage());\r
- }\r
- \r
- }\r
-\r
- /**\r
- * SimpleTimeZone.getOffset() throws IllegalArgumentException when to get\r
- * of 2/29/1996 (leap day).\r
- */\r
- public void Test4208960 () {\r
- TimeZone tz = TimeZone.getTimeZone("PST");\r
- try {\r
- /*int offset =*/ tz.getOffset(GregorianCalendar.AD, 1996, Calendar.FEBRUARY, 29,\r
- Calendar.THURSDAY, 0);\r
- //offset = 0;\r
- } catch (IllegalArgumentException e) {\r
- errln("FAILED: to get TimeZone.getOffset(2/29/96)");\r
- }\r
- try {\r
- /*int offset =*/ tz.getOffset(GregorianCalendar.AD, 1997, Calendar.FEBRUARY, 29,\r
- Calendar.THURSDAY, 0);\r
- //offset = 0;\r
- warnln("FAILED: TimeZone.getOffset(2/29/97) expected to throw Exception.");\r
- } catch (IllegalArgumentException e) {\r
- logln("got IllegalArgumentException");\r
- }\r
- }\r
-\r
- /**\r
- * Test to see if DateFormat understands zone equivalency groups. It\r
- * might seem that this should be a DateFormat test, but it's really a\r
- * TimeZone test -- the changes to DateFormat are minor.\r
- *\r
- * We use two known, zones that are equivalent, where one zone has\r
- * localized name data, and the other doesn't, in some locale.\r
- */\r
- public void TestJ449() {\r
- // not used String str;\r
-\r
- // Modify the following three as necessary. The two IDs must\r
- // specify two zones in the same equivalency group. One must have\r
- // locale data in 'loc'; the other must not.\r
- String idWithLocaleData = "America/Los_Angeles";\r
- String idWithoutLocaleData = "PST"; // "US/Pacific";\r
- Locale loc = new Locale("en", "", "");\r
-\r
- TimeZone zoneWith = TimeZone.getTimeZone(idWithLocaleData);\r
- TimeZone zoneWithout = TimeZone.getTimeZone(idWithoutLocaleData);\r
- // Make sure we got valid zones\r
- if (!(zoneWith.getID().equals(idWithLocaleData) &&\r
- zoneWithout.getID().equals(idWithoutLocaleData))) {\r
- warnln("Fail: Unable to create zones");\r
- } else {\r
- GregorianCalendar calWith = new GregorianCalendar(zoneWith);\r
- GregorianCalendar calWithout = new GregorianCalendar(zoneWithout);\r
- SimpleDateFormat fmt =\r
- new SimpleDateFormat("MMM d yyyy hh:mm a zzz", loc);\r
- Date date = new Date(0L);\r
- fmt.setCalendar(calWith);\r
- String strWith = fmt.format(date);\r
- fmt.setCalendar(calWithout);\r
- String strWithout = fmt.format(date);\r
- if (strWith.equals(strWithout)) {\r
- logln("Ok: " + idWithLocaleData + " -> " +\r
- strWith + "; " + idWithoutLocaleData + " -> " +\r
- strWithout);\r
- } else {\r
- errln("FAIL: " + idWithLocaleData + " -> " +\r
- strWith + "; " + idWithoutLocaleData + " -> " +\r
- strWithout);\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * getOffset returns wrong offset for days in early 20th century\r
- */\r
- public void TestJ5134() {\r
- GregorianCalendar testCal = (GregorianCalendar)Calendar.getInstance();\r
- TimeZone icuEastern = TimeZone.getTimeZone("America/New_York"); \r
- testCal.setTimeZone(icuEastern);\r
- testCal.set(1900, Calendar.JANUARY, 1, 0, 0, 0);\r
- long time = testCal.getTimeInMillis();\r
-\r
- int offset = icuEastern.getOffset(time);\r
- if (offset != -18000000) {\r
- errln("FAIL: UTC offset in time zone America/New_York on Jan 1, 1900 -> " + offset);\r
- }\r
- boolean isDst = icuEastern.inDaylightTime(new Date(time));\r
- if (isDst) {\r
- errln("FAIL: DST is observed in time zone America/New_York on Jan 1, 1900");\r
- }\r
-\r
-//#if defined(FOUNDATION10) || defined(J2SE13)\r
-//#else\r
- if (System.getProperty("java.vendor", "").startsWith("IBM") &&\r
- System.getProperty("java.version", "").equals("1.4.1")) {\r
- // IBM JDK 1.4.1 has a bug and fails to run this test case.\r
- return;\r
- }\r
- java.util.TimeZone jdkEastern = java.util.TimeZone.getTimeZone("America/New_York");\r
- // Compare offset and DST observation with JDK and ICU for 50 years since 1900\r
- testCal.add(Calendar.YEAR, 50);\r
- long endTime = testCal.getTimeInMillis();\r
- int jdkOffset;\r
- boolean isDstJdk;\r
- while (time < endTime) {\r
- offset = icuEastern.getOffset(time);\r
- jdkOffset = jdkEastern.getOffset(time);\r
- if (offset != jdkOffset) {\r
- errln("FAIL: Incompatible UTC offset -> JDK:" + jdkOffset + "/ICU:" + offset + " [" + time + "]");\r
- }\r
- Date d = new Date(time);\r
- isDst = icuEastern.inDaylightTime(d);\r
- isDstJdk = jdkEastern.inDaylightTime(d);\r
- if (isDst != isDstJdk) {\r
- errln("FAIL: Incompatible DST -> JDK:" + isDstJdk + "/ICU:" + isDst + " [" + time + "]");\r
- }\r
- time += 24*60*60*1000L; // increment 1 day\r
- }\r
-//#endif\r
- }\r
-\r
- /**\r
- * Test setRawOffset works OK with system timezone\r
- */\r
- public void TestT5280() {\r
- String[] tzids = TimeZone.getAvailableIDs();\r
- for (int i = 0; i < tzids.length; i++) {\r
- TimeZone tz = TimeZone.getTimeZone(tzids[i]);\r
- boolean useDst = tz.useDaylightTime();\r
-\r
- // Increase offset for 30 minutes\r
- int newRawOffset = tz.getRawOffset() + 30*60*1000;\r
- try {\r
- tz.setRawOffset(newRawOffset);\r
- } catch (Exception e) {\r
- errln("FAIL: setRawOffset throws an exception");\r
- }\r
- int offset = tz.getRawOffset();\r
- if (offset != newRawOffset) {\r
- errln("FAIL: Modified zone(" + tz.getID() + ") - getRawOffset returns " + offset + "/ Expected: " + newRawOffset);\r
- }\r
- // Ticket#5917\r
- // Check if DST observation status is not unexpectedly changed.\r
- boolean newDst = tz.useDaylightTime();\r
- if (useDst != newDst) {\r
- errln("FAIL: Modified zone(" + tz.getID() + ") - useDaylightTime has changed from " + useDst + " to " + newDst);\r
- }\r
- // Make sure the offset is preserved in a clone\r
- TimeZone tzClone = (TimeZone)tz.clone();\r
- offset = tzClone.getRawOffset();\r
- if (offset != newRawOffset) {\r
- errln("FAIL: Cloned modified zone(" + tz.getID() + ") - getRawOffset returns " + offset + "/ Expected: " + newRawOffset);\r
- }\r
- }\r
- }\r
-\r
- /*\r
- * Zone ID is not set by a SimpleTimeZone constructor\r
- */\r
- public void TestT5432() {\r
- String tzid = "MyZone";\r
- SimpleTimeZone stz;\r
-\r
- // 2-arg constructor\r
- stz = new SimpleTimeZone(0, tzid);\r
- if (!tzid.equals(stz.getID())) {\r
- errln("FAIL: Bad zone id (" + stz.getID() + ") is returned - expected ("\r
- + tzid + ") [2-arg constructor]");\r
- }\r
-\r
- // 10-arg constructor\r
- stz = new SimpleTimeZone(0, tzid, 3, -1, 1, 3600000, 9, -1, 1, 3600000);\r
- if (!tzid.equals(stz.getID())) {\r
- errln("FAIL: Bad zone id (" + stz.getID() + ") is returned - expected ("\r
- + tzid + ") [10-arg constructor]");\r
- }\r
-\r
- // 11-arg constructor\r
- stz = new SimpleTimeZone(0, tzid, 3, -1, 1, 3600000, 9, -1, 1, 3600000, 3600000);\r
- if (!tzid.equals(stz.getID())) {\r
- errln("FAIL: Bad zone id (" + stz.getID() + ") is returned - expected ("\r
- + tzid + ") [11-arg constructor]");\r
- }\r
-\r
- // 13-arg constructor - this version had a problem reported by trac#5432\r
- stz = new SimpleTimeZone(0, tzid, 3, -1, 1, 3600000, SimpleTimeZone.WALL_TIME,\r
- 9, -1, 1, 3600000, SimpleTimeZone.WALL_TIME, 3600000);\r
- if (!tzid.equals(stz.getID())) {\r
- errln("FAIL: Bad zone id (" + stz.getID() + ") is returned - expected ("\r
- + tzid + ") [13-arg constructor]");\r
- }\r
- }\r
- \r
- // test bug #4265\r
- public void TestJohannesburg() {\r
- String j_id="Africa/Johannesburg";\r
- TimeZone johannesburg = TimeZone.getTimeZone(j_id);\r
- final int ONE_HOUR = 60*60*1000;\r
- int expectedOffset = ONE_HOUR*2; // GMT+2 - NO DST\r
- int offset = johannesburg.getOffset(GregorianCalendar.AD,2007,Calendar.JULY,5,Calendar.THURSDAY,0); \r
- \r
- if(offset != expectedOffset) {\r
- errln("FAIL: zone " + j_id +" returned offset in July " + offset +", expected "+expectedOffset);\r
- } else {\r
- logln("OK: zone " + j_id +" returned offset in July: " + offset);\r
- }\r
-\r
- int offset2 = johannesburg.getOffset(GregorianCalendar.AD,2007,Calendar.DECEMBER,12,Calendar.WEDNESDAY,0);\r
-\r
- if(offset2 != expectedOffset) {\r
- errln("FAIL: zone " + j_id +" returned offset in December " + offset2 +", expected "+expectedOffset);\r
- } else {\r
- logln("OK: zone " + j_id +" returned offset in December: " + offset2);\r
- }\r
-\r
- }\r
-}\r
-\r
-//eof\r
+//##header J2SE15
+/**
+ *******************************************************************************
+ * Copyright (C) 2000-2009, International Business Machines Corporation and *
+ * others. All Rights Reserved. *
+ *******************************************************************************
+ */
+
+/**
+ * @test 1.18 99/09/21
+ * @bug 4052967 4073209 4073215 4084933 4096952 4109314 4126678 4151406 4151429
+ * @bug 4154525 4154537 4154542 4154650 4159922 4162593 4173604 4176686 4184229 4208960
+ */
+
+package com.ibm.icu.dev.test.timezone;
+import com.ibm.icu.util.*;
+import java.io.*;
+import com.ibm.icu.text.*;
+import com.ibm.icu.dev.test.*;
+import java.util.Date;
+import java.util.Locale;
+
+public class TimeZoneRegression extends TestFmwk {
+
+ public static void main(String[] args) throws Exception {
+ new TimeZoneRegression().run(args);
+ }
+
+ public void Test4052967() {
+ logln("*** CHECK TIMEZONE AGAINST HOST OS SETTING ***");
+ String id = TimeZone.getDefault().getID();
+ try {
+ // user.timezone is a protected system property
+ logln("user.timezone: " + System.getProperty("user.timezone", "<not set>"));
+ logln("TimeZone.getDefault().getID(): " + id);
+ logln(new Date().toString());
+ logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");
+ }
+ catch (SecurityException e) {
+ warnln("security exception: " + e.toString());
+ }
+ }
+
+ public void Test4073209() {
+ TimeZone z1 = TimeZone.getTimeZone("PST");
+ TimeZone z2 = TimeZone.getTimeZone("PST");
+ if (z1 == z2) errln("Fail: TimeZone should return clones");
+ }
+
+ public void Test4073215() {
+ SimpleTimeZone z = new SimpleTimeZone(0, "GMT");
+ if (z.useDaylightTime())
+ errln("Fail: Fix test to start with non-DST zone");
+ z.setStartRule(Calendar.FEBRUARY, 1, Calendar.SUNDAY, 0);
+ z.setEndRule(Calendar.MARCH, -1, Calendar.SUNDAY, 0);
+ if (!z.useDaylightTime())
+ errln("Fail: DST not active");
+ Calendar tempcal = Calendar.getInstance();
+ tempcal.clear();
+ tempcal.setTimeZone(z);
+ tempcal.set(1997, Calendar.JANUARY, 31);
+ Date d1 = tempcal.getTime();
+ if (z.inDaylightTime(d1)) {
+ errln("Fail: DST not working as expected");
+ }
+
+ tempcal.set(1997, Calendar.MARCH, 1);
+ Date d2 = tempcal.getTime();
+ if (!z.inDaylightTime(d2)) {
+ errln("Fail: DST not working as expected");
+ }
+ tempcal.clear();
+ tempcal.set(1997, Calendar.MARCH, 31);
+ Date d3 = tempcal.getTime();
+ if (z.inDaylightTime(d3)) {
+ errln("Fail: DST not working as expected");
+ }
+ }
+
+ /**
+ * The expected behavior of TimeZone around the boundaries is:
+ * (Assume transition time of 2:00 AM)
+ * day of onset 1:59 AM STD = display name 1:59 AM ST
+ * 2:00 AM STD = display name 3:00 AM DT
+ * day of end 0:59 AM STD = display name 1:59 AM DT
+ * 1:00 AM STD = display name 1:00 AM ST
+ */
+ public void Test4084933() {
+ TimeZone tz = TimeZone.getTimeZone("PST");
+
+ long offset1 = tz.getOffset(1,
+ 1997, Calendar.OCTOBER, 26, Calendar.SUNDAY, (2*60*60*1000));
+ long offset2 = tz.getOffset(1,
+ 1997, Calendar.OCTOBER, 26, Calendar.SUNDAY, (2*60*60*1000)-1);
+
+ long offset3 = tz.getOffset(1,
+ 1997, Calendar.OCTOBER, 26, Calendar.SUNDAY, (1*60*60*1000));
+ long offset4 = tz.getOffset(1,
+ 1997, Calendar.OCTOBER, 26, Calendar.SUNDAY, (1*60*60*1000)-1);
+
+ /*
+ * The following was added just for consistency. It shows that going *to* Daylight
+ * Savings Time (PDT) does work at 2am.
+ */
+
+ long offset5 = tz.getOffset(1,
+ 1997, Calendar.APRIL, 6, Calendar.SUNDAY, (2*60*60*1000));
+ long offset6 = tz.getOffset(1,
+ 1997, Calendar.APRIL, 6, Calendar.SUNDAY, (2*60*60*1000)-1);
+
+ long offset7 = tz.getOffset(1,
+ 1997, Calendar.APRIL, 6, Calendar.SUNDAY, (1*60*60*1000));
+ long offset8 = tz.getOffset(1,
+ 1997, Calendar.APRIL, 6, Calendar.SUNDAY, (1*60*60*1000)-1);
+
+ long SToffset = -8 * 60*60*1000L;
+ long DToffset = -7 * 60*60*1000L;
+ if (offset1 != SToffset || offset2 != SToffset ||
+ offset3 != SToffset || offset4 != DToffset ||
+ offset5 != DToffset || offset6 != SToffset ||
+ offset7 != SToffset || offset8 != SToffset)
+ warnln("Fail: TimeZone misbehaving");
+ }
+
+ public void Test4096952() {
+ String[] ZONES = { "GMT", "MET", "IST" };
+ boolean pass = true;
+ try {
+ for (int i=0; i<ZONES.length; ++i) {
+ TimeZone zone = TimeZone.getTimeZone(ZONES[i]);
+ if (!zone.getID().equals(ZONES[i]))
+ warnln("Fail: Test broken; zones not instantiating");
+
+ ByteArrayOutputStream baos;
+ ObjectOutputStream ostream =
+ new ObjectOutputStream(baos = new
+ ByteArrayOutputStream());
+ ostream.writeObject(zone);
+ ostream.close();
+ baos.close();
+ ObjectInputStream istream =
+ new ObjectInputStream(new
+ ByteArrayInputStream(baos.toByteArray()));
+ TimeZone frankenZone = (TimeZone) istream.readObject();
+ //logln("Zone: " + zone);
+ //logln("FrankenZone: " + frankenZone);
+ if (!zone.equals(frankenZone)) {
+ logln("TimeZone " + zone.getID() +
+ " not equal to serialized/deserialized one");
+ pass = false;
+ }
+ }
+ if (!pass) errln("Fail: TimeZone serialization/equality bug");
+ }
+ catch (IOException e) {
+ errln("Fail: " + e);
+ e.printStackTrace();
+ }
+ catch (ClassNotFoundException e) {
+ errln("Fail: " + e);
+ e.printStackTrace();
+ }
+ }
+
+ public void Test4109314() {
+ GregorianCalendar testCal = (GregorianCalendar)Calendar.getInstance();
+ TimeZone PST = TimeZone.getTimeZone("PST");
+ java.util.Calendar tempcal = java.util.Calendar.getInstance();
+ tempcal.clear();
+ tempcal.set(1998,Calendar.APRIL,4,22,0);
+ Date d1 = tempcal.getTime();
+ tempcal.set(1998,Calendar.APRIL,5,6,0);
+ Date d2 = tempcal.getTime();
+ tempcal.set(1998,Calendar.OCTOBER,24,22,0);
+ Date d3 = tempcal.getTime();
+ tempcal.set(1998,Calendar.OCTOBER,25,6,0);
+ Date d4 = tempcal.getTime();
+ Object[] testData = {
+ PST, d1, d2,
+ PST, d3, d4,
+ };
+ boolean pass=true;
+ for (int i=0; i<testData.length; i+=3) {
+ testCal.setTimeZone((TimeZone) testData[i]);
+ long t = ((Date)testData[i+1]).getTime();
+ Date end = (Date) testData[i+2];
+ while (t < end.getTime()) {
+ testCal.setTime(new Date(t));
+ if (!checkCalendar314(testCal, (TimeZone) testData[i]))
+ pass = false;
+ t += 60*60*1000L;
+ }
+ }
+ if (!pass) errln("Fail: TZ API inconsistent");
+ }
+
+ boolean checkCalendar314(GregorianCalendar testCal, TimeZone testTZ) {
+ // GregorianCalendar testCal = (GregorianCalendar)aCal.clone();
+
+ final int ONE_DAY = 24*60*60*1000;
+
+ int tzOffset, tzRawOffset;
+ Float tzOffsetFloat,tzRawOffsetFloat;
+ // Here is where the user made an error. They were passing in the value of
+ // the MILLSECOND field; you need to pass in the millis in the day in STANDARD
+ // time.
+ int millis = testCal.get(Calendar.MILLISECOND) +
+ 1000 * (testCal.get(Calendar.SECOND) +
+ 60 * (testCal.get(Calendar.MINUTE) +
+ 60 * (testCal.get(Calendar.HOUR_OF_DAY)))) -
+ testCal.get(Calendar.DST_OFFSET);
+
+ /* Fix up millis to be in range. ASSUME THAT WE ARE NOT AT THE
+ * BEGINNING OR END OF A MONTH. We must add this code because
+ * getOffset() has been changed to be more strict about the parameters
+ * it receives -- it turns out that this test was passing in illegal
+ * values. */
+ int date = testCal.get(Calendar.DATE);
+ int dow = testCal.get(Calendar.DAY_OF_WEEK);
+ while (millis < 0) {
+ millis += ONE_DAY;
+ --date;
+ dow = Calendar.SUNDAY + ((dow - Calendar.SUNDAY + 6) % 7);
+ }
+ while (millis >= ONE_DAY) {
+ millis -= ONE_DAY;
+ ++date;
+ dow = Calendar.SUNDAY + ((dow - Calendar.SUNDAY + 1) % 7);
+ }
+
+ tzOffset = testTZ.getOffset(testCal.get(Calendar.ERA),
+ testCal.get(Calendar.YEAR),
+ testCal.get(Calendar.MONTH),
+ date,
+ dow,
+ millis);
+ tzRawOffset = testTZ.getRawOffset();
+ tzOffsetFloat = new Float((float)tzOffset/(float)3600000);
+ tzRawOffsetFloat = new Float((float)tzRawOffset/(float)3600000);
+
+ Date testDate = testCal.getTime();
+
+ boolean inDaylightTime = testTZ.inDaylightTime(testDate);
+ SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm");
+ sdf.setCalendar(testCal);
+ String inDaylightTimeString;
+
+ boolean passed;
+
+ if (inDaylightTime)
+ {
+ inDaylightTimeString = " DST ";
+ passed = (tzOffset == (tzRawOffset + 3600000));
+ }
+ else
+ {
+ inDaylightTimeString = " ";
+ passed = (tzOffset == tzRawOffset);
+ }
+
+ String output = testTZ.getID() + " " + sdf.format(testDate) +
+ " Offset(" + tzOffsetFloat + ")" +
+ " RawOffset(" + tzRawOffsetFloat + ")" +
+ " " + millis/(float)3600000 + " " +
+ inDaylightTimeString;
+
+ if (passed)
+ output += " ";
+ else
+ output += "ERROR";
+
+ if (passed) logln(output); else errln(output);
+ return passed;
+ }
+
+ /**
+ * CANNOT REPRODUDE
+ *
+ * Yet another _alleged_ bug in TimeZone.getOffset(), a method that never
+ * should have been made public. It's simply too hard to use correctly.
+ *
+ * The original test code failed to do the following:
+ * (1) Call Calendar.setTime() before getting the fields!
+ * (2) Use the right millis (as usual) for getOffset(); they were passing
+ * in the MILLIS field, instead of the STANDARD MILLIS IN DAY.
+ * When you fix these two problems, the test passes, as expected.
+ */
+ public void Test4126678() {
+ // Note: this test depends on the PST time zone.
+ TimeZone initialZone = TimeZone.getDefault();
+ Calendar cal = Calendar.getInstance();
+ TimeZone tz = TimeZone.getTimeZone("PST");
+ TimeZone.setDefault(tz);
+ cal.setTimeZone(tz);
+
+ java.util.Calendar tempcal = java.util.Calendar.getInstance();
+ tempcal.clear();
+ tempcal.set(1998, Calendar.APRIL, 5, 10, 0);
+ Date dt = tempcal.getTime();
+ // the dt value is local time in PST.
+ if (!tz.inDaylightTime(dt))
+ errln("We're not in Daylight Savings Time and we should be.\n");
+
+ cal.setTime(dt);
+ int era = cal.get(Calendar.ERA);
+ int year = cal.get(Calendar.YEAR);
+ int month = cal.get(Calendar.MONTH);
+ int day = cal.get(Calendar.DATE);
+ int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
+ int millis = cal.get(Calendar.MILLISECOND) +
+ (cal.get(Calendar.SECOND) +
+ (cal.get(Calendar.MINUTE) +
+ (cal.get(Calendar.HOUR) * 60) * 60) * 1000) -
+ cal.get(Calendar.DST_OFFSET);
+
+ long offset = tz.getOffset(era, year, month, day, dayOfWeek, millis);
+ long raw_offset = tz.getRawOffset();
+ if (offset == raw_offset)
+ errln("Offsets should not match when in DST");
+
+ // restore the initial time zone so that this test case
+ // doesn't affect the others.
+ TimeZone.setDefault(initialZone);
+ }
+
+ /**
+ * TimeZone.getAvailableIDs(int) throws exception for certain values,
+ * due to a faulty constant in TimeZone.java.
+ */
+ public void Test4151406() {
+ int max = 0;
+ for (int h=-28; h<=30; ++h) {
+ // h is in half-hours from GMT; rawoffset is in millis
+ int rawoffset = h * 1800000;
+ int hh = (h<0) ? -h : h;
+ String hname = ((h<0) ? "GMT-" : "GMT+") +
+ ((hh/2 < 10) ? "0" : "") +
+ (hh/2) + ':' +
+ ((hh%2==0) ? "00" : "30");
+ try {
+ String[] ids = TimeZone.getAvailableIDs(rawoffset);
+ if (ids.length > max) max = ids.length;
+ logln(hname + ' ' + ids.length +
+ ((ids.length > 0) ? (" e.g. " + ids[0]) : ""));
+ } catch (Exception e) {
+ errln(hname + ' ' + "Fail: " + e);
+ }
+ }
+ logln("Maximum zones per offset = " + max);
+ }
+
+ public void Test4151429() {
+ try {
+ TimeZone tz = TimeZone.getTimeZone("GMT");
+ /*String name =*/ tz.getDisplayName(true, Integer.MAX_VALUE,
+ Locale.getDefault());
+ errln("IllegalArgumentException not thrown by TimeZone.getDisplayName()");
+ } catch(IllegalArgumentException e) {
+ System.out.print("");
+ }
+ }
+
+ /**
+ * SimpleTimeZone accepts illegal DST savings values. These values
+ * must be non-zero. There is no upper limit at this time.
+ */
+ public void Test4154525() {
+ final int GOOD = 1, BAD = 0;
+ int[] DATA = {
+ 1, GOOD,
+ 0, BAD,
+ -1, BAD,
+ 60*60*1000, GOOD,
+ Integer.MIN_VALUE, BAD,
+ // Integer.MAX_VALUE, ?, // no upper limit on DST savings at this time
+ };
+ for (int i=0; i<DATA.length; i+=2) {
+ int savings = DATA[i];
+ boolean valid = DATA[i+1] == GOOD;
+ String method = null;
+ for (int j=0; j<2; ++j) {
+ try {
+ switch (j) {
+ case 0:
+ method = "constructor";
+ SimpleTimeZone z = new SimpleTimeZone(0, "id",
+ Calendar.JANUARY, 1, 0, 0,
+ Calendar.MARCH, 1, 0, 0,
+ savings); // <- what we're interested in
+ break;
+ case 1:
+ method = "setDSTSavings()";
+ z = new SimpleTimeZone(0, "GMT");
+ z.setDSTSavings(savings);
+ break;
+ }
+ if (valid) {
+ logln("Pass: DST savings of " + savings + " accepted by " + method);
+ } else {
+ errln("Fail: DST savings of " + savings + " accepted by " + method);
+ }
+ } catch (IllegalArgumentException e) {
+ if (valid) {
+ errln("Fail: DST savings of " + savings + " to " + method + " gave " + e);
+ } else {
+ logln("Pass: DST savings of " + savings + " to " + method + " gave " + e);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * SimpleTimeZone.hasSameRules() doesn't work for zones with no DST
+ * and different DST parameters.
+ */
+ public void Test4154537() {
+ // tz1 and tz2 have no DST and different rule parameters
+ SimpleTimeZone tz1 = new SimpleTimeZone(0, "1", 0, 0, 0, 0, 2, 0, 0, 0);
+ SimpleTimeZone tz2 = new SimpleTimeZone(0, "2", 1, 0, 0, 0, 3, 0, 0, 0);
+ // tza and tzA have the same rule params
+ SimpleTimeZone tza = new SimpleTimeZone(0, "a", 0, 1, 0, 0, 3, 2, 0, 0);
+ SimpleTimeZone tzA = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 3, 2, 0, 0);
+ // tzb differs from tza
+ SimpleTimeZone tzb = new SimpleTimeZone(0, "b", 0, 1, 0, 0, 3, 1, 0, 0);
+ if (tz1.useDaylightTime() || tz2.useDaylightTime() ||
+ !tza.useDaylightTime() || !tzA.useDaylightTime() ||
+ !tzb.useDaylightTime()) {
+ errln("Test is broken -- rewrite it");
+ }
+ if (!tza.hasSameRules(tzA) || tza.hasSameRules(tzb)) {
+ errln("Fail: hasSameRules() broken for zones with rules");
+ }
+ if (!tz1.hasSameRules(tz2)) {
+ errln("Fail: hasSameRules() returns false for zones without rules");
+ errln("zone 1 = " + tz1);
+ errln("zone 2 = " + tz2);
+ }
+ }
+
+ /**
+ * SimpleTimeZone constructors, setStartRule(), and setEndRule() don't
+ * check for out-of-range arguments.
+ */
+ public void Test4154542() {
+ final int GOOD = 1;
+ final int BAD = 0;
+
+ final int GOOD_MONTH = Calendar.JANUARY;
+ final int GOOD_DAY = 1;
+ final int GOOD_DAY_OF_WEEK = Calendar.SUNDAY;
+ final int GOOD_TIME = 0;
+
+ int[] DATA = {
+ GOOD, Integer.MIN_VALUE, 0, Integer.MAX_VALUE, Integer.MIN_VALUE,
+ GOOD, Calendar.JANUARY, -5, Calendar.SUNDAY, 0,
+ GOOD, Calendar.DECEMBER, 5, Calendar.SATURDAY, 24*60*60*1000-1,
+ BAD, Calendar.DECEMBER, 5, Calendar.SATURDAY, 24*60*60*1000+1,
+ BAD, Calendar.DECEMBER, 5, Calendar.SATURDAY, -1,
+ BAD, Calendar.JANUARY, -6, Calendar.SUNDAY, 0,
+ BAD, Calendar.DECEMBER, 6, Calendar.SATURDAY, 24*60*60*1000,
+ GOOD, Calendar.DECEMBER, 1, 0, 0,
+ GOOD, Calendar.DECEMBER, 31, 0, 0,
+ BAD, Calendar.APRIL, 31, 0, 0,
+ BAD, Calendar.DECEMBER, 32, 0, 0,
+ BAD, Calendar.JANUARY-1, 1, Calendar.SUNDAY, 0,
+ BAD, Calendar.DECEMBER+1, 1, Calendar.SUNDAY, 0,
+ GOOD, Calendar.DECEMBER, 31, -Calendar.SUNDAY, 0,
+ GOOD, Calendar.DECEMBER, 31, -Calendar.SATURDAY, 0,
+ BAD, Calendar.DECEMBER, 32, -Calendar.SATURDAY, 0,
+ BAD, Calendar.DECEMBER, -32, -Calendar.SATURDAY, 0,
+ BAD, Calendar.DECEMBER, 31, -Calendar.SATURDAY-1, 0,
+ };
+ SimpleTimeZone zone = new SimpleTimeZone(0, "Z");
+ for (int i=0; i<DATA.length; i+=5) {
+ boolean shouldBeGood = (DATA[i] == GOOD);
+ int month = DATA[i+1];
+ int day = DATA[i+2];
+ int dayOfWeek = DATA[i+3];
+ int time = DATA[i+4];
+
+ Exception ex = null;
+ try {
+ zone.setStartRule(month, day, dayOfWeek, time);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ if ((ex == null) != shouldBeGood) {
+ errln("setStartRule(month=" + month + ", day=" + day +
+ ", dayOfWeek=" + dayOfWeek + ", time=" + time +
+ (shouldBeGood ? (") should work but throws " + ex)
+ : ") should fail but doesn't"));
+ }
+
+ ex = null;
+ try {
+ zone.setEndRule(month, day, dayOfWeek, time);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ if ((ex == null) != shouldBeGood) {
+ errln("setEndRule(month=" + month + ", day=" + day +
+ ", dayOfWeek=" + dayOfWeek + ", time=" + time +
+ (shouldBeGood ? (") should work but throws " + ex)
+ : ") should fail but doesn't"));
+ }
+
+ ex = null;
+ try {
+ /*SimpleTimeZone temp =*/ new SimpleTimeZone(0, "Z",
+ month, day, dayOfWeek, time,
+ GOOD_MONTH, GOOD_DAY, GOOD_DAY_OF_WEEK, GOOD_TIME);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ if ((ex == null) != shouldBeGood) {
+ errln("SimpleTimeZone(month=" + month + ", day=" + day +
+ ", dayOfWeek=" + dayOfWeek + ", time=" + time +
+ (shouldBeGood ? (", <end>) should work but throws " + ex)
+ : ", <end>) should fail but doesn't"));
+ }
+
+ ex = null;
+ try {
+ /*SimpleTimeZone temp = */new SimpleTimeZone(0, "Z",
+ GOOD_MONTH, GOOD_DAY, GOOD_DAY_OF_WEEK, GOOD_TIME,
+ month, day, dayOfWeek, time);
+ // temp = null;
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ if ((ex == null) != shouldBeGood) {
+ errln("SimpleTimeZone(<start>, month=" + month + ", day=" + day +
+ ", dayOfWeek=" + dayOfWeek + ", time=" + time +
+ (shouldBeGood ? (") should work but throws " + ex)
+ : ") should fail but doesn't"));
+ }
+ }
+ }
+
+ /**
+ * SimpleTimeZone.getOffset accepts illegal arguments.
+ */
+ public void Test4154650() {
+ final int GOOD=1, BAD=0;
+ final int GOOD_ERA=GregorianCalendar.AD, GOOD_YEAR=1998, GOOD_MONTH=Calendar.AUGUST;
+ final int GOOD_DAY=2, GOOD_DOW=Calendar.SUNDAY, GOOD_TIME=16*3600000;
+ int[] DATA = {
+ GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+
+ GOOD, GregorianCalendar.BC, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+ GOOD, GregorianCalendar.AD, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+ BAD, GregorianCalendar.BC-1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+ BAD, GregorianCalendar.AD+1, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+
+ GOOD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+ GOOD, GOOD_ERA, GOOD_YEAR, Calendar.DECEMBER, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+ BAD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY-1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+ BAD, GOOD_ERA, GOOD_YEAR, Calendar.DECEMBER+1, GOOD_DAY, GOOD_DOW, GOOD_TIME,
+
+ GOOD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, 1, GOOD_DOW, GOOD_TIME,
+ GOOD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, 31, GOOD_DOW, GOOD_TIME,
+ BAD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, 0, GOOD_DOW, GOOD_TIME,
+ BAD, GOOD_ERA, GOOD_YEAR, Calendar.JANUARY, 32, GOOD_DOW, GOOD_TIME,
+
+ GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar.SUNDAY, GOOD_TIME,
+ GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar.SATURDAY, GOOD_TIME,
+ BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar.SUNDAY-1, GOOD_TIME,
+ BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, Calendar.SATURDAY+1, GOOD_TIME,
+
+ GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 0,
+ GOOD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000-1,
+ BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, -1,
+ BAD, GOOD_ERA, GOOD_YEAR, GOOD_MONTH, GOOD_DAY, GOOD_DOW, 24*3600000,
+ };
+
+ TimeZone tz = TimeZone.getDefault();
+ for (int i=0; i<DATA.length; i+=7) {
+ boolean good = DATA[i] == GOOD;
+ IllegalArgumentException e = null;
+ try {
+ /*int offset =*/ tz.getOffset(DATA[i+1], DATA[i+2], DATA[i+3],
+ DATA[i+4], DATA[i+5], DATA[i+6]);
+ //offset = 0;
+ } catch (IllegalArgumentException ex) {
+ e = ex;
+ }
+ if (good != (e == null)) {
+ errln("Fail: getOffset(" +
+ DATA[i+1] + ", " + DATA[i+2] + ", " + DATA[i+3] + ", " +
+ DATA[i+4] + ", " + DATA[i+5] + ", " + DATA[i+6] +
+ (good ? (") threw " + e) : ") accepts invalid args"));
+ }
+ }
+ }
+
+ /**
+ * TimeZone constructors allow null IDs.
+ */
+ public void Test4159922() {
+ TimeZone z = null;
+
+ // TimeZone API. Only hasSameRules() and setDefault() should
+ // allow null.
+ try {
+ z = TimeZone.getTimeZone(null);
+ errln("FAIL: Null allowed in getTimeZone");
+ } catch (NullPointerException e) {
+ System.out.print("");
+ }
+ z = TimeZone.getTimeZone("GMT");
+ try {
+ // {dlf} requiring cast for disambiguation is ok for compatibility since null
+ // is not a valid argument to this API
+ z.getDisplayName(false, TimeZone.SHORT, (ULocale)null);
+ errln("FAIL: Null allowed in getDisplayName(3)");
+ } catch (NullPointerException e) {
+ System.out.print("");
+ }
+ try {
+ // {dlf} see above
+ z.getDisplayName((ULocale)null);
+ errln("FAIL: Null allowed in getDisplayName(1)");
+ } catch (NullPointerException e) {
+ System.out.print("");
+ }
+ try {
+ if (z.hasSameRules(null)) {
+ errln("FAIL: hasSameRules returned true");
+ }
+ } catch (NullPointerException e) {
+ errln("FAIL: Null NOT allowed in hasSameRules");
+ }
+ try {
+ z.inDaylightTime(null);
+ errln("FAIL: Null allowed in inDaylightTime");
+ } catch (NullPointerException e) {
+ System.out.print("");
+ }
+ try {
+ z.setID(null);
+ errln("FAIL: Null allowed in setID");
+ } catch (NullPointerException e) {
+ System.out.print("");
+ }
+
+ TimeZone save = TimeZone.getDefault();
+ try {
+ TimeZone.setDefault(null);
+ } catch (NullPointerException e) {
+ errln("FAIL: Null NOT allowed in setDefault");
+ } finally {
+ TimeZone.setDefault(save);
+ }
+
+ // SimpleTimeZone API
+ SimpleTimeZone s = null;
+ try {
+ s = new SimpleTimeZone(0, null);
+ errln("FAIL: Null allowed in SimpleTimeZone(2)");
+ } catch (NullPointerException e) {
+ System.out.print("");
+ }
+ try {
+ s = new SimpleTimeZone(0, null, 0, 1, 0, 0, 0, 1, 0, 0);
+ errln("FAIL: Null allowed in SimpleTimeZone(10)");
+ } catch (NullPointerException e) {
+ System.out.print("");
+ }
+ try {
+ s = new SimpleTimeZone(0, null, 0, 1, 0, 0, 0, 1, 0, 0, 1000);
+ errln("FAIL: Null allowed in SimpleTimeZone(11)");
+ } catch (NullPointerException e) {
+ System.out.print("");
+ }
+ if(s!=null){
+ errln("FAIL: Did not get the expected Exception");
+ }
+ }
+
+ /**
+ * TimeZone broken at midnight. The TimeZone code fails to handle
+ * transitions at midnight correctly.
+ */
+ public void Test4162593() {
+ SimpleDateFormat fmt = new SimpleDateFormat("z", Locale.US);
+ final int ONE_HOUR = 60*60*1000;
+ final float H = (float) ONE_HOUR;
+ TimeZone initialZone = TimeZone.getDefault();
+ SimpleDateFormat sdf = new SimpleDateFormat("MMM dd yyyy HH:mm z");
+
+ SimpleTimeZone asuncion = new SimpleTimeZone(-4*ONE_HOUR, "America/Asuncion" /*PY%sT*/,
+ Calendar.OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR,
+ Calendar.MARCH, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR);
+
+ /* Zone
+ * Starting time
+ * Transition expected between start+1H and start+2H
+ */
+ Object[] DATA = {
+ new SimpleTimeZone(2*ONE_HOUR, "Asia/Damascus" /*EE%sT*/,
+ Calendar.APRIL, 1, 0 /*DOM*/, 0*ONE_HOUR,
+ Calendar.OCTOBER, 1, 0 /*DOM*/, 0*ONE_HOUR, 1*ONE_HOUR),
+ new int[] {1998, Calendar.SEPTEMBER, 30, 22, 0},
+ Boolean.TRUE,
+
+ asuncion,
+ new int[] {2000, Calendar.FEBRUARY, 28, 22, 0},
+ Boolean.FALSE,
+
+ asuncion,
+ new int[] {2000, Calendar.FEBRUARY, 29, 22, 0},
+ Boolean.TRUE,
+ };
+
+ String[] zone = new String[4];
+
+ for (int j=0; j<DATA.length; j+=3) {
+ TimeZone tz = (TimeZone)DATA[j];
+ TimeZone.setDefault(tz);
+ fmt.setTimeZone(tz);
+ sdf.setTimeZone(tz);
+
+ // Must construct the Date object AFTER setting the default zone
+ int[] p = (int[])DATA[j+1];
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.set(p[0], p[1], p[2], p[3], p[4]);
+ long start = cal.getTime().getTime();
+ boolean transitionExpected = ((Boolean)DATA[j+2]).booleanValue();
+
+ logln(tz.getID() + ":");
+ for (int i=0; i<4; ++i) {
+ Date d = new Date(start + i*ONE_HOUR);
+ zone[i] = fmt.format(d);
+ logln("" + i + ": " + sdf.format(d) + " => " + zone[i] +
+ " (" + d.getTime()/H + ")");
+ }
+ cal.set(p[0], p[1], p[2], 0, 0);
+ for (int i=0; i<4; ++i) {
+ int h = 22+i;
+ int dom = p[2]+(h>=24?1:0);
+ h %= 24;
+ int ms = h*ONE_HOUR;
+ cal.clear();
+ cal.set(p[0], p[1], dom, 0, 0);
+ int off = tz.getOffset(GregorianCalendar.AD,
+ cal.get(Calendar.YEAR),
+ cal.get(Calendar.MONTH),
+ cal.get(Calendar.DATE),
+ cal.get(Calendar.DAY_OF_WEEK),
+ ms);
+ cal.add(Calendar.HOUR, h);
+ int dstOffset = cal.get(Calendar.DST_OFFSET);
+ logln("h=" + h + "; dom=" + dom +
+ "; ZONE_OFFSET=" + cal.get(Calendar.ZONE_OFFSET)/H +
+ "; DST_OFFSET=" + dstOffset/H +
+ "; getOffset()=" + off/H +
+ " (" + cal.getTime().getTime()/H + ")");
+ }
+ if (zone[0].equals(zone[1]) &&
+ (zone[1].equals(zone[2]) != transitionExpected) &&
+ zone[2].equals(zone[3])) {
+ logln("Ok: transition " + transitionExpected);
+ } else {
+ errln("FAIL: expected " +
+ (transitionExpected?"transition":"no transition"));
+ }
+ }
+
+ // restore the initial time zone so that this test case
+ // doesn't affect the others.
+ TimeZone.setDefault(initialZone);
+ }
+
+ /**
+ * TimeZone broken in last hour of year
+ */
+ public void Test4173604() {
+ TimeZone pst = TimeZone.getTimeZone("PST");
+ int o22 = pst.getOffset(1, 1998, 11, 31, Calendar.THURSDAY, 22*60*60*1000);
+ int o23 = pst.getOffset(1, 1998, 11, 31, Calendar.THURSDAY, 23*60*60*1000);
+ int o00 = pst.getOffset(1, 1999, 0, 1, Calendar.FRIDAY, 0);
+ if (o22 != o23 || o22 != o00) {
+ errln("Offsets should be the same (for PST), but got: " +
+ "12/31 22:00 " + o22 +
+ ", 12/31 23:00 " + o23 +
+ ", 01/01 00:00 " + o00);
+ }
+
+ GregorianCalendar cal = new GregorianCalendar();
+ cal.setTimeZone(pst);
+ cal.clear();
+ cal.set(1998, Calendar.JANUARY, 1);
+ int lastDST = cal.get(Calendar.DST_OFFSET);
+ int transitions = 0;
+ int delta = 5;
+ while (cal.get(Calendar.YEAR) < 2000) {
+ cal.add(Calendar.MINUTE, delta);
+ if (cal.get(Calendar.DST_OFFSET) != lastDST) {
+ ++transitions;
+ Calendar t = (Calendar)cal.clone();
+ t.add(Calendar.MINUTE, -delta);
+ logln(t.getTime() + " " + t.get(Calendar.DST_OFFSET));
+ logln(cal.getTime() + " " + (lastDST=cal.get(Calendar.DST_OFFSET)));
+ }
+ }
+ if (transitions != 4) {
+ errln("Saw " + transitions + " transitions; should have seen 4");
+ }
+ }
+
+ /**
+ * getDisplayName doesn't work with unusual savings/offsets.
+ */
+ public void Test4176686() {
+ // Construct a zone that does not observe DST but
+ // that does have a DST savings (which should be ignored).
+ int offset = 90 * 60000; // 1:30
+ SimpleTimeZone z1 = new SimpleTimeZone(offset, "_std_zone_");
+ z1.setDSTSavings(45 * 60000); // 0:45
+
+ // Construct a zone that observes DST for the first 6 months.
+ SimpleTimeZone z2 = new SimpleTimeZone(offset, "_dst_zone_");
+ z2.setDSTSavings(45 * 60000); // 0:45
+ z2.setStartRule(Calendar.JANUARY, 1, 0);
+ z2.setEndRule(Calendar.JULY, 1, 0);
+
+ // Also check DateFormat
+ DateFormat fmt1 = new SimpleDateFormat("z");
+ fmt1.setTimeZone(z1); // Format uses standard zone
+ DateFormat fmt2 = new SimpleDateFormat("z");
+ fmt2.setTimeZone(z2); // Format uses DST zone
+ java.util.Calendar tempcal = java.util.Calendar.getInstance();
+ tempcal.clear();
+ tempcal.set(1970, Calendar.FEBRUARY, 1);
+ Date dst = tempcal.getTime(); // Time in DST
+ tempcal.set(1970, Calendar.AUGUST, 1);
+ Date std = tempcal.getTime(); // Time in standard
+
+ // Description, Result, Expected Result
+ String[] DATA = {
+ "getDisplayName(false, SHORT)/std zone",
+ z1.getDisplayName(false, TimeZone.SHORT), "GMT+01:30",
+ "getDisplayName(false, LONG)/std zone",
+ z1.getDisplayName(false, TimeZone.LONG ), "GMT+01:30",
+ "getDisplayName(true, SHORT)/std zone",
+ z1.getDisplayName(true, TimeZone.SHORT), "GMT+01:30",
+ "getDisplayName(true, LONG)/std zone",
+ z1.getDisplayName(true, TimeZone.LONG ), "GMT+01:30",
+ "getDisplayName(false, SHORT)/dst zone",
+ z2.getDisplayName(false, TimeZone.SHORT), "GMT+01:30",
+ "getDisplayName(false, LONG)/dst zone",
+ z2.getDisplayName(false, TimeZone.LONG ), "GMT+01:30",
+ "getDisplayName(true, SHORT)/dst zone",
+ z2.getDisplayName(true, TimeZone.SHORT), "GMT+02:15",
+ "getDisplayName(true, LONG)/dst zone",
+ z2.getDisplayName(true, TimeZone.LONG ), "GMT+02:15",
+ "DateFormat.format(std)/std zone", fmt1.format(std), "GMT+01:30",
+ "DateFormat.format(dst)/std zone", fmt1.format(dst), "GMT+01:30",
+ "DateFormat.format(std)/dst zone", fmt2.format(std), "GMT+01:30",
+ "DateFormat.format(dst)/dst zone", fmt2.format(dst), "GMT+02:15",
+ };
+
+ for (int i=0; i<DATA.length; i+=3) {
+ if (!DATA[i+1].equals(DATA[i+2])) {
+ errln("FAIL: " + DATA[i] + " -> " + DATA[i+1] + ", exp " + DATA[i+2]);
+ }
+ }
+ }
+
+ /**
+ * SimpleTimeZone allows invalid DOM values.
+ */
+ // Current orgnaization of data in zoneinfor.res allows negative
+ // values from DOM so comment these tests out
+
+ public void Test4184229() {
+ SimpleTimeZone zone = null;
+ try {
+ zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 0);
+ errln("Failed. No exception has been thrown for DOM -1 startDay");
+ } catch(IllegalArgumentException e) {
+ logln("(a) " + e.getMessage());
+ }
+ try {
+ zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0);
+ errln("Failed. No exception has been thrown for DOM -1 endDay");
+ } catch(IllegalArgumentException e) {
+ logln("(b) " + e.getMessage());
+ }
+ try {
+ zone = new SimpleTimeZone(0, "A", 0, -1, 0, 0, 0, 0, 0, 0, 1000);
+ errln("Failed. No exception has been thrown for DOM -1 startDay +savings");
+ } catch(IllegalArgumentException e) {
+ logln("(c) " + e.getMessage());
+ }
+ try {
+ zone = new SimpleTimeZone(0, "A", 0, 0, 0, 0, 0, -1, 0, 0, 1000);
+ errln("Failed. No exception has been thrown for DOM -1 endDay +savings");
+ } catch(IllegalArgumentException e) {
+ logln("(d) " + e.getMessage());
+ }
+ // Make a valid constructor call for subsequent tests.
+
+ zone = new SimpleTimeZone(0, "A", 0, 1, 0, 0, 0, 1, 0, 0);
+
+ try {
+ zone.setStartRule(0, -1, 0, 0);
+ errln("Failed. No exception has been thrown for DOM -1 setStartRule +savings");
+ } catch(IllegalArgumentException e) {
+ logln("(e) " + e.getMessage());
+ }
+ try {
+ zone.setStartRule(0, -1, 0);
+ errln("Failed. No exception has been thrown for DOM -1 setStartRule");
+ } catch(IllegalArgumentException e) {
+ logln("(f) " + e.getMessage());
+ }
+ try {
+ zone.setEndRule(0, -1, 0, 0);
+ errln("Failed. No exception has been thrown for DOM -1 setEndRule +savings");
+ } catch(IllegalArgumentException e) {
+ logln("(g) " + e.getMessage());
+ }
+ try {
+ zone.setEndRule(0, -1, 0);
+ errln("Failed. No exception has been thrown for DOM -1 setEndRule");
+ } catch(IllegalArgumentException e) {
+ logln("(h) " + e.getMessage());
+ }
+
+ }
+
+ /**
+ * SimpleTimeZone.getOffset() throws IllegalArgumentException when to get
+ * of 2/29/1996 (leap day).
+ */
+ public void Test4208960 () {
+ TimeZone tz = TimeZone.getTimeZone("PST");
+ try {
+ /*int offset =*/ tz.getOffset(GregorianCalendar.AD, 1996, Calendar.FEBRUARY, 29,
+ Calendar.THURSDAY, 0);
+ //offset = 0;
+ } catch (IllegalArgumentException e) {
+ errln("FAILED: to get TimeZone.getOffset(2/29/96)");
+ }
+ try {
+ /*int offset =*/ tz.getOffset(GregorianCalendar.AD, 1997, Calendar.FEBRUARY, 29,
+ Calendar.THURSDAY, 0);
+ //offset = 0;
+ warnln("FAILED: TimeZone.getOffset(2/29/97) expected to throw Exception.");
+ } catch (IllegalArgumentException e) {
+ logln("got IllegalArgumentException");
+ }
+ }
+
+ /**
+ * Test to see if DateFormat understands zone equivalency groups. It
+ * might seem that this should be a DateFormat test, but it's really a
+ * TimeZone test -- the changes to DateFormat are minor.
+ *
+ * We use two known, zones that are equivalent, where one zone has
+ * localized name data, and the other doesn't, in some locale.
+ */
+ public void TestJ449() {
+ // not used String str;
+
+ // Modify the following three as necessary. The two IDs must
+ // specify two zones in the same equivalency group. One must have
+ // locale data in 'loc'; the other must not.
+ String idWithLocaleData = "America/Los_Angeles";
+ String idWithoutLocaleData = "PST"; // "US/Pacific";
+ Locale loc = new Locale("en", "", "");
+
+ TimeZone zoneWith = TimeZone.getTimeZone(idWithLocaleData);
+ TimeZone zoneWithout = TimeZone.getTimeZone(idWithoutLocaleData);
+ // Make sure we got valid zones
+ if (!(zoneWith.getID().equals(idWithLocaleData) &&
+ zoneWithout.getID().equals(idWithoutLocaleData))) {
+ warnln("Fail: Unable to create zones");
+ } else {
+ GregorianCalendar calWith = new GregorianCalendar(zoneWith);
+ GregorianCalendar calWithout = new GregorianCalendar(zoneWithout);
+ SimpleDateFormat fmt =
+ new SimpleDateFormat("MMM d yyyy hh:mm a zzz", loc);
+ Date date = new Date(0L);
+ fmt.setCalendar(calWith);
+ String strWith = fmt.format(date);
+ fmt.setCalendar(calWithout);
+ String strWithout = fmt.format(date);
+ if (strWith.equals(strWithout)) {
+ logln("Ok: " + idWithLocaleData + " -> " +
+ strWith + "; " + idWithoutLocaleData + " -> " +
+ strWithout);
+ } else {
+ errln("FAIL: " + idWithLocaleData + " -> " +
+ strWith + "; " + idWithoutLocaleData + " -> " +
+ strWithout);
+ }
+ }
+ }
+
+ /**
+ * getOffset returns wrong offset for days in early 20th century
+ */
+ public void TestJ5134() {
+ GregorianCalendar testCal = (GregorianCalendar)Calendar.getInstance();
+ TimeZone icuEastern = TimeZone.getTimeZone("America/New_York");
+ testCal.setTimeZone(icuEastern);
+ testCal.set(1900, Calendar.JANUARY, 1, 0, 0, 0);
+ long time = testCal.getTimeInMillis();
+
+ int offset = icuEastern.getOffset(time);
+ if (offset != -18000000) {
+ errln("FAIL: UTC offset in time zone America/New_York on Jan 1, 1900 -> " + offset);
+ }
+ boolean isDst = icuEastern.inDaylightTime(new Date(time));
+ if (isDst) {
+ errln("FAIL: DST is observed in time zone America/New_York on Jan 1, 1900");
+ }
+
+//#if defined(FOUNDATION10) || defined(J2SE13)
+//#else
+ if (System.getProperty("java.vendor", "").startsWith("IBM") &&
+ System.getProperty("java.version", "").equals("1.4.1")) {
+ // IBM JDK 1.4.1 has a bug and fails to run this test case.
+ return;
+ }
+ java.util.TimeZone jdkEastern = java.util.TimeZone.getTimeZone("America/New_York");
+ // Compare offset and DST observation with JDK and ICU for 50 years since 1900
+ testCal.add(Calendar.YEAR, 50);
+ long endTime = testCal.getTimeInMillis();
+ int jdkOffset;
+ boolean isDstJdk;
+ while (time < endTime) {
+ offset = icuEastern.getOffset(time);
+ jdkOffset = jdkEastern.getOffset(time);
+ if (offset != jdkOffset) {
+ errln("FAIL: Incompatible UTC offset -> JDK:" + jdkOffset + "/ICU:" + offset + " [" + time + "]");
+ }
+ Date d = new Date(time);
+ isDst = icuEastern.inDaylightTime(d);
+ isDstJdk = jdkEastern.inDaylightTime(d);
+ if (isDst != isDstJdk) {
+ errln("FAIL: Incompatible DST -> JDK:" + isDstJdk + "/ICU:" + isDst + " [" + time + "]");
+ }
+ time += 24*60*60*1000L; // increment 1 day
+ }
+//#endif
+ }
+
+ /**
+ * Test setRawOffset works OK with system timezone
+ */
+ public void TestT5280() {
+ String[] tzids = TimeZone.getAvailableIDs();
+ for (int i = 0; i < tzids.length; i++) {
+ TimeZone tz = TimeZone.getTimeZone(tzids[i]);
+ boolean useDst = tz.useDaylightTime();
+
+ // Increase offset for 30 minutes
+ int newRawOffset = tz.getRawOffset() + 30*60*1000;
+ try {
+ tz.setRawOffset(newRawOffset);
+ } catch (Exception e) {
+ errln("FAIL: setRawOffset throws an exception");
+ }
+ int offset = tz.getRawOffset();
+ if (offset != newRawOffset) {
+ errln("FAIL: Modified zone(" + tz.getID() + ") - getRawOffset returns " + offset + "/ Expected: " + newRawOffset);
+ }
+ // Ticket#5917
+ // Check if DST observation status is not unexpectedly changed.
+ boolean newDst = tz.useDaylightTime();
+ if (useDst != newDst) {
+ errln("FAIL: Modified zone(" + tz.getID() + ") - useDaylightTime has changed from " + useDst + " to " + newDst);
+ }
+ // Make sure the offset is preserved in a clone
+ TimeZone tzClone = (TimeZone)tz.clone();
+ offset = tzClone.getRawOffset();
+ if (offset != newRawOffset) {
+ errln("FAIL: Cloned modified zone(" + tz.getID() + ") - getRawOffset returns " + offset + "/ Expected: " + newRawOffset);
+ }
+ }
+ }
+
+ /*
+ * Zone ID is not set by a SimpleTimeZone constructor
+ */
+ public void TestT5432() {
+ String tzid = "MyZone";
+ SimpleTimeZone stz;
+
+ // 2-arg constructor
+ stz = new SimpleTimeZone(0, tzid);
+ if (!tzid.equals(stz.getID())) {
+ errln("FAIL: Bad zone id (" + stz.getID() + ") is returned - expected ("
+ + tzid + ") [2-arg constructor]");
+ }
+
+ // 10-arg constructor
+ stz = new SimpleTimeZone(0, tzid, 3, -1, 1, 3600000, 9, -1, 1, 3600000);
+ if (!tzid.equals(stz.getID())) {
+ errln("FAIL: Bad zone id (" + stz.getID() + ") is returned - expected ("
+ + tzid + ") [10-arg constructor]");
+ }
+
+ // 11-arg constructor
+ stz = new SimpleTimeZone(0, tzid, 3, -1, 1, 3600000, 9, -1, 1, 3600000, 3600000);
+ if (!tzid.equals(stz.getID())) {
+ errln("FAIL: Bad zone id (" + stz.getID() + ") is returned - expected ("
+ + tzid + ") [11-arg constructor]");
+ }
+
+ // 13-arg constructor - this version had a problem reported by trac#5432
+ stz = new SimpleTimeZone(0, tzid, 3, -1, 1, 3600000, SimpleTimeZone.WALL_TIME,
+ 9, -1, 1, 3600000, SimpleTimeZone.WALL_TIME, 3600000);
+ if (!tzid.equals(stz.getID())) {
+ errln("FAIL: Bad zone id (" + stz.getID() + ") is returned - expected ("
+ + tzid + ") [13-arg constructor]");
+ }
+ }
+
+ // test bug #4265
+ public void TestJohannesburg() {
+ String j_id="Africa/Johannesburg";
+ TimeZone johannesburg = TimeZone.getTimeZone(j_id);
+ final int ONE_HOUR = 60*60*1000;
+ int expectedOffset = ONE_HOUR*2; // GMT+2 - NO DST
+ int offset = johannesburg.getOffset(GregorianCalendar.AD,2007,Calendar.JULY,5,Calendar.THURSDAY,0);
+
+ if(offset != expectedOffset) {
+ errln("FAIL: zone " + j_id +" returned offset in July " + offset +", expected "+expectedOffset);
+ } else {
+ logln("OK: zone " + j_id +" returned offset in July: " + offset);
+ }
+
+ int offset2 = johannesburg.getOffset(GregorianCalendar.AD,2007,Calendar.DECEMBER,12,Calendar.WEDNESDAY,0);
+
+ if(offset2 != expectedOffset) {
+ errln("FAIL: zone " + j_id +" returned offset in December " + offset2 +", expected "+expectedOffset);
+ } else {
+ logln("OK: zone " + j_id +" returned offset in December: " + offset2);
+ }
+
+ }
+}
+
+//eof