]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/timezone/TimeZoneRegression.java
go
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / timezone / TimeZoneRegression.java
old mode 100755 (executable)
new mode 100644 (file)
index df2519d..25dd6b6
-//##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