]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - jars/icu4j-4_2_1-src/src/com/ibm/icu/dev/test/serializable/SerializableTest.java
go
[Dictionary.git] / jars / icu4j-4_2_1-src / src / com / ibm / icu / dev / test / serializable / SerializableTest.java
old mode 100755 (executable)
new mode 100644 (file)
index 69d6a82..c631acb
-//##header\r
-/*\r
- *******************************************************************************\r
- * Copyright (C) 1996-2009, International Business Machines Corporation and    *\r
- * others. All Rights Reserved.                                                *\r
- *******************************************************************************\r
- *\r
- */\r
-\r
-package com.ibm.icu.dev.test.serializable;\r
-\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-import java.util.Locale;\r
-\r
-import com.ibm.icu.dev.test.TestFmwk;\r
-import com.ibm.icu.impl.JavaTimeZone;\r
-import com.ibm.icu.impl.OlsonTimeZone;\r
-import com.ibm.icu.impl.TimeZoneAdapter;\r
-import com.ibm.icu.math.BigDecimal;\r
-import com.ibm.icu.math.MathContext;\r
-import com.ibm.icu.util.AnnualTimeZoneRule;\r
-import com.ibm.icu.util.Calendar;\r
-import com.ibm.icu.util.Currency;\r
-import com.ibm.icu.util.DateInterval;\r
-import com.ibm.icu.util.DateTimeRule;\r
-import com.ibm.icu.util.GregorianCalendar;\r
-import com.ibm.icu.util.InitialTimeZoneRule;\r
-import com.ibm.icu.util.RuleBasedTimeZone;\r
-import com.ibm.icu.util.SimpleTimeZone;\r
-import com.ibm.icu.util.TimeArrayTimeZoneRule;\r
-import com.ibm.icu.util.TimeZone;\r
-import com.ibm.icu.util.TimeZoneRule;\r
-import com.ibm.icu.util.ULocale;\r
-import com.ibm.icu.util.VTimeZone;\r
-\r
-/**\r
- * @author emader\r
- *\r
- * TODO To change the template for this generated type comment go to\r
- * Window - Preferences - Java - Code Style - Code Templates\r
- */\r
-public class SerializableTest extends TestFmwk.TestGroup\r
-{\r
-    public interface Handler\r
-    {\r
-        public Object[] getTestObjects();\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b);\r
-    }\r
-    \r
-    public static Handler getHandler(String className)\r
-    {\r
-        return (Handler) map.get(className);\r
-    }\r
-    \r
-    private static class TimeZoneHandler implements Handler\r
-    {\r
-        String[] ZONES = { "GMT", "MET", "IST" };\r
-\r
-        public Object[] getTestObjects()\r
-        {\r
-            TimeZone zones[] = new TimeZone[ZONES.length];\r
-            \r
-            for(int z = 0; z < ZONES.length; z += 1) {\r
-                zones[z] = TimeZone.getTimeZone(ZONES[z]);\r
-            }\r
-            \r
-            return zones;\r
-        }\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b)\r
-        {\r
-            TimeZone zone_a = (TimeZone) a;\r
-            TimeZone zone_b = (TimeZone) b;\r
-\r
-            if (!(zone_a.getDisplayName().equals(zone_b.getDisplayName()))) {\r
-                return false;\r
-            }\r
-\r
-            int a_offsets[] = {0, 0};\r
-            int b_offsets[] = {0, 0};\r
-\r
-            boolean bSame = true;\r
-            for (int i = 0; i < sampleTimes.length; i++) {\r
-                zone_a.getOffset(sampleTimes[i], false, a_offsets);\r
-                zone_b.getOffset(sampleTimes[i], false, b_offsets);\r
-                if (a_offsets[0] != b_offsets[0] || a_offsets[1] != b_offsets[1]) {\r
-                    bSame = false;\r
-                    break;\r
-                }\r
-            }\r
-            return bSame;\r
-        }\r
-    }\r
-    \r
-    private static Locale locales[] = {\r
-        Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA, \r
-        Locale.CHINESE, Locale.ENGLISH, Locale.FRANCE, Locale.FRENCH, \r
-        Locale.GERMAN, Locale.GERMANY, Locale.ITALIAN, Locale.ITALY, \r
-        Locale.JAPAN, Locale.JAPANESE, Locale.KOREA, Locale.KOREAN, \r
-        Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN, \r
-        Locale.TRADITIONAL_CHINESE, Locale.UK, Locale.US\r
-    };\r
-    \r
-    private static Locale places[] = {\r
-        Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA, \r
-        Locale.FRANCE, Locale.GERMANY, Locale.ITALY, \r
-        Locale.JAPAN, Locale.KOREA, Locale.PRC, Locale.TAIWAN, \r
-        Locale.UK, Locale.US\r
-    };\r
-    \r
-    public static Locale[] getLocales()\r
-    {\r
-        return locales;\r
-    }\r
-    \r
-    public static boolean compareStrings(String a[], String b[])\r
-    {\r
-        if (a.length != b.length) {\r
-            return false;\r
-        }\r
-        \r
-        for (int i = 0; i < a.length; i += 1) {\r
-            if (! a[i].equals(b[i])) {\r
-                return false;\r
-            }\r
-        }\r
-        \r
-        return true;\r
-    }\r
-    \r
-    public static boolean compareChars(char a[], char b[])\r
-    {\r
-        if (a.length != b.length) {\r
-            return false;\r
-        }\r
-        \r
-        for (int i = 0; i < a.length; i += 1) {\r
-            if (a[i] != b[i]) {\r
-                return false;\r
-            }\r
-        }\r
-        \r
-        return true;\r
-    }\r
-\r
-    private static class SimpleTimeZoneHandler extends TimeZoneHandler\r
-    {\r
-        public Object[] getTestObjects()\r
-        {\r
-            SimpleTimeZone simpleTimeZones[] = new SimpleTimeZone[6];\r
-            \r
-            simpleTimeZones[0] = new SimpleTimeZone(32400000, "MyTimeZone");\r
-            \r
-            simpleTimeZones[1] = new SimpleTimeZone(32400000, "Asia/Tokyo");\r
-            \r
-            simpleTimeZones[2] = new SimpleTimeZone(32400000, "Asia/Tokyo");\r
-            simpleTimeZones[2].setRawOffset(0);\r
-            \r
-            simpleTimeZones[3] = new SimpleTimeZone(32400000, "Asia/Tokyo");\r
-            simpleTimeZones[3].setStartYear(100);\r
-            \r
-            simpleTimeZones[4] = new SimpleTimeZone(32400000, "Asia/Tokyo");\r
-            simpleTimeZones[4].setStartYear(1000);\r
-            simpleTimeZones[4].setDSTSavings(1800000);\r
-            simpleTimeZones[4].setStartRule(3, 4, 180000);\r
-            simpleTimeZones[4].setEndRule(6, 3, 4, 360000);\r
-            \r
-            simpleTimeZones[5] = new SimpleTimeZone(32400000, "Asia/Tokyo");\r
-            simpleTimeZones[5].setStartRule(2, 3, 4, 360000);\r
-            simpleTimeZones[5].setEndRule(6, 3, 4, 360000);\r
-            \r
-            return simpleTimeZones;\r
-        }\r
-    }\r
-\r
-    private static class VTimeZoneHandler extends TimeZoneHandler {\r
-        public Object[] getTestObjects() {\r
-            //TODO\r
-            VTimeZone[] vtzs = new VTimeZone[1];\r
-            vtzs[0] = VTimeZone.create("America/New_York");\r
-            return vtzs;\r
-        }\r
-    }\r
-\r
-    private static final int HOUR = 60*60*1000;\r
-    private static final AnnualTimeZoneRule[] TEST_US_EASTERN = {\r
-        new AnnualTimeZoneRule("EST", -5*HOUR, 0,\r
-                new DateTimeRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME),\r
-                1967, 2006),\r
-        \r
-        new AnnualTimeZoneRule("EST", -5*HOUR, 0,\r
-                new DateTimeRule(Calendar.NOVEMBER, 1, Calendar.SUNDAY, true, 2*HOUR, DateTimeRule.WALL_TIME),\r
-                2007, AnnualTimeZoneRule.MAX_YEAR),\r
-        \r
-        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,\r
-                new DateTimeRule(Calendar.APRIL, -1, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME),\r
-                1967, 1973),\r
-\r
-        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,\r
-                new DateTimeRule(Calendar.JANUARY, 6, 2*HOUR, DateTimeRule.WALL_TIME),\r
-                1974, 1974),\r
-\r
-        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,\r
-                new DateTimeRule(Calendar.FEBRUARY, 23, 2*HOUR, DateTimeRule.WALL_TIME),\r
-                1975, 1975),\r
-\r
-        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,\r
-                new DateTimeRule(Calendar.APRIL, -1, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME),\r
-                1976, 1986),\r
-\r
-        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,\r
-                new DateTimeRule(Calendar.APRIL, 1, Calendar.SUNDAY, true, 2*HOUR, DateTimeRule.WALL_TIME),\r
-                1987, 2006),\r
-\r
-        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,\r
-                new DateTimeRule(Calendar.MARCH, 8, Calendar.SUNDAY, true, 2*HOUR, DateTimeRule.WALL_TIME),\r
-                2007, AnnualTimeZoneRule.MAX_YEAR)\r
-    };\r
-    \r
-\r
-    \r
-    private static class RuleBasedTimeZoneHandler extends TimeZoneHandler\r
-    {\r
-        public Object[] getTestObjects()\r
-        {\r
-            RuleBasedTimeZone ruleBasedTimeZones[] = new RuleBasedTimeZone[2];\r
-\r
-            InitialTimeZoneRule ir = new InitialTimeZoneRule("GMT-5", -5*HOUR, 0);\r
-\r
-            // GMT-5, no transition\r
-            ruleBasedTimeZones[0] = new RuleBasedTimeZone("GMT-5", ir);\r
-\r
-\r
-            // US Eastern since 1967\r
-            ruleBasedTimeZones[1] = new RuleBasedTimeZone("US_East", ir);\r
-            for (int i = 0; i < TEST_US_EASTERN.length; i++) {\r
-                ruleBasedTimeZones[1].addTransitionRule(TEST_US_EASTERN[i]);\r
-            }\r
-            return ruleBasedTimeZones;\r
-        }\r
-    }\r
-\r
-    private static class DateTimeRuleHandler implements Handler {\r
-        public Object[] getTestObjects() {\r
-            DateTimeRule[] rules = new DateTimeRule[4];\r
-\r
-            // DOM + UTC\r
-            rules[0] = new DateTimeRule(Calendar.OCTOBER, 10, 13*HOUR, DateTimeRule.UTC_TIME);\r
-\r
-            // DOW + WALL\r
-            rules[1] = new DateTimeRule(Calendar.MARCH, 2, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME);\r
-\r
-            // DOW_GEQ_DOM + STD\r
-            rules[2] = new DateTimeRule(Calendar.MAY, 1, Calendar.MONDAY, true, 0*HOUR, DateTimeRule.STANDARD_TIME);\r
-\r
-            // DOW_LEQ_DOM + WALL\r
-            rules[3] = new DateTimeRule(Calendar.AUGUST, 31, Calendar.SATURDAY, false, 1*HOUR, DateTimeRule.WALL_TIME);\r
-\r
-            return rules;\r
-        }\r
-\r
-        public boolean hasSameBehavior(Object a, Object b) {\r
-            return hasSameRule((DateTimeRule)a, (DateTimeRule)b);\r
-        }\r
-\r
-        static boolean hasSameRule(DateTimeRule dtra, DateTimeRule dtrb) {\r
-            boolean bSame = false;\r
-            if (dtra.getDateRuleType() == dtrb.getDateRuleType()\r
-                    && dtra.getRuleMonth() == dtrb.getRuleMonth()\r
-                    && dtra.getTimeRuleType() == dtrb.getTimeRuleType()\r
-                    && dtra.getRuleMillisInDay() == dtrb.getRuleMillisInDay()) {\r
-                switch (dtra.getDateRuleType()) {\r
-                case DateTimeRule.DOM:\r
-                    bSame = (dtra.getRuleDayOfMonth() == dtrb.getRuleDayOfMonth());\r
-                    break;\r
-                case DateTimeRule.DOW:\r
-                    bSame = (dtra.getRuleDayOfWeek() == dtrb.getRuleDayOfWeek() &&\r
-                                dtra.getRuleWeekInMonth() == dtrb.getRuleWeekInMonth());\r
-                    break;\r
-                case DateTimeRule.DOW_GEQ_DOM:\r
-                case DateTimeRule.DOW_LEQ_DOM:\r
-                    bSame = (dtra.getRuleDayOfMonth() == dtrb.getRuleDayOfMonth() &&\r
-                                dtra.getRuleDayOfWeek() == dtrb.getRuleDayOfWeek());\r
-                    break;\r
-                }\r
-            }\r
-            return bSame;            \r
-        }\r
-    }\r
-\r
-    private static boolean compareTimeZoneRules(TimeZoneRule ra, TimeZoneRule rb) {\r
-        if (ra.getName().equals(rb.getName()) &&\r
-                ra.getRawOffset() == rb.getRawOffset() &&\r
-                ra.getDSTSavings() == rb.getDSTSavings()) {\r
-            return true;\r
-        }\r
-        return false;        \r
-    }\r
-\r
-    private static class AnnualTimeZoneRuleHandler implements Handler {\r
-        public Object[] getTestObjects() {\r
-            return TEST_US_EASTERN;\r
-        }\r
-\r
-        public boolean hasSameBehavior(Object a, Object b) {\r
-            AnnualTimeZoneRule ra = (AnnualTimeZoneRule)a;\r
-            AnnualTimeZoneRule rb = (AnnualTimeZoneRule)b;\r
-            if (DateTimeRuleHandler.hasSameRule(ra.getRule(), rb.getRule()) &&\r
-                    ra.getStartYear() == rb.getStartYear() &&\r
-                    ra.getEndYear() == rb.getEndYear()) {\r
-                return compareTimeZoneRules(ra, rb);\r
-            }\r
-            return false;\r
-        }\r
-    }\r
-\r
-    private static class InitialTimeZoneRuleHandler implements Handler {\r
-        public Object[] getTestObjects() {\r
-            TimeZoneRule[] rules = new TimeZoneRule[2];\r
-            rules[0] = new InitialTimeZoneRule("EST", -5*HOUR, 0);\r
-            rules[1] = new InitialTimeZoneRule("PST", -8*HOUR, 0);\r
-            return rules;\r
-        }\r
-\r
-        public boolean hasSameBehavior(Object a, Object b) {\r
-            return compareTimeZoneRules((TimeZoneRule)a, (TimeZoneRule)b);\r
-        }\r
-    }\r
-\r
-    private static class TimeArrayTimeZoneRuleHandler implements Handler {\r
-        public Object[] getTestObjects() {\r
-            TimeArrayTimeZoneRule[] rules = new TimeArrayTimeZoneRule[1];\r
-            long[] ttime = new long[] {-631152000000L, 0L, 946684800000L}; /* {1950-1-1, 1970-1-1, 2000-1-1} */\r
-            rules[0] = new TimeArrayTimeZoneRule("Foo", 1*HOUR, 1*HOUR, ttime, DateTimeRule.UTC_TIME);\r
-\r
-            return rules;\r
-        }\r
-        public boolean hasSameBehavior(Object a, Object b) {\r
-            TimeArrayTimeZoneRule ra = (TimeArrayTimeZoneRule)a;\r
-            TimeArrayTimeZoneRule rb = (TimeArrayTimeZoneRule)b;\r
-\r
-            Date da = ra.getFirstStart(0, 0);\r
-            Date db = rb.getFirstStart(0, 0);\r
-            long t = da.getTime();\r
-            if (da.equals(db)) {\r
-                da = ra.getFinalStart(0, 0);\r
-                db = rb.getFinalStart(0, 0);\r
-                long end = da.getTime();\r
-                if (da.equals(db)) {\r
-                    while (t < end) {\r
-                        da = ra.getNextStart(t, 0, 0, false);\r
-                        db = ra.getNextStart(t, 0, 0, false);\r
-                        if (da == null || db == null || !da.equals(db)) {\r
-                            break;\r
-                        }\r
-                        t = da.getTime();\r
-                    }\r
-                    return compareTimeZoneRules(ra, rb);\r
-                }\r
-            }\r
-            return false;\r
-        }\r
-    }\r
-\r
-    private static class ULocaleHandler implements Handler\r
-    {\r
-        public Object[] getTestObjects()\r
-        {\r
-            ULocale uLocales[] = new ULocale[locales.length];\r
-            \r
-            for (int i = 0; i < locales.length; i += 1) {\r
-                uLocales[i] = ULocale.forLocale(locales[i]);\r
-            }\r
-            \r
-            return uLocales;\r
-        }\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b)\r
-        {\r
-            ULocale uloc_a = (ULocale) a;\r
-            ULocale uloc_b = (ULocale) b;\r
-            \r
-            return uloc_a.getName().equals(uloc_b.getName());\r
-        }\r
-    }\r
-    \r
-    public static class DateIntervalHandler implements Handler\r
-    {\r
-        private DateInterval dateInterval[] = {\r
-                new DateInterval(0L, 1164931200000L/*20061201T000000Z*/)\r
-        };\r
-        public Object[] getTestObjects()\r
-        {\r
-            return dateInterval;\r
-        }\r
-\r
-        public boolean hasSameBehavior(Object a, Object b)\r
-        {\r
-            return a.equals(b);\r
-        }\r
-    }\r
-\r
-\r
-    private static class CurrencyHandler implements Handler\r
-    {\r
-        public Object[] getTestObjects()\r
-        {\r
-            Currency currencies[] = new Currency[places.length];\r
-            \r
-            for (int i = 0; i < places.length; i += 1) {\r
-                currencies[i] = Currency.getInstance(places[i]);\r
-            }\r
-            \r
-            return currencies;\r
-        }\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b)\r
-        {\r
-            Currency curr_a = (Currency) a;\r
-            Currency curr_b = (Currency) b;\r
-            \r
-            return curr_a.getCurrencyCode().equals(curr_b.getCurrencyCode());\r
-            \r
-        }\r
-    }\r
-\r
-    private static String zoneIDs[] = {\r
-        "Pacific/Honolulu", "America/Anchorage", "America/Los_Angeles", "America/Denver",\r
-        "America/Chicago", "America/New_York", "Africa/Cairo", "Africa/Addis_Ababa", "Africa/Dar_es_Salaam",\r
-        "Africa/Freetown", "Africa/Johannesburg", "Africa/Nairobi", "Asia/Bangkok", "Asia/Baghdad",\r
-        "Asia/Calcutta", "Asia/Hong_Kong", "Asia/Jakarta", "Asia/Jerusalem", "Asia/Manila", "Asia/Tokyo",\r
-        "Europe/Amsterdam", "Europe/Athens", "Europe/Berlin", "Europe/London", "Europe/Malta", "Europe/Moscow",\r
-        "Europe/Paris", "Europe/Rome"\r
-    };\r
-        \r
-    private static long sampleTimes[] = {\r
-        1136073600000L, // 20060101T000000Z\r
-        1138752000000L, // 20060201T000000Z\r
-        1141171200000L, // 20060301T000000Z\r
-        1143849600000L, // 20060401T000000Z\r
-        1146441600000L, // 20060501T000000Z\r
-        1149120000000L, // 20060601T000000Z\r
-        1151712000000L, // 20060701T000000Z\r
-        1154390400000L, // 20060801T000000Z\r
-        1157068800000L, // 20060901T000000Z\r
-        1159660800000L, // 20061001T000000Z\r
-        1162339200000L, // 20061101T000000Z\r
-        1164931200000L, // 20061201T000000Z\r
-    };\r
-\r
-    private static class OlsonTimeZoneHandler implements Handler\r
-    {\r
-        public Object[] getTestObjects()\r
-        {\r
-            OlsonTimeZone timeZones[] = new OlsonTimeZone[zoneIDs.length];\r
-            \r
-            for (int i = 0; i < zoneIDs.length; i += 1) {\r
-                timeZones[i] = new OlsonTimeZone(zoneIDs[i]);\r
-            }\r
-            \r
-            return timeZones;\r
-                \r
-        }\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b)\r
-        {\r
-            OlsonTimeZone otz_a = (OlsonTimeZone) a;\r
-            OlsonTimeZone otz_b = (OlsonTimeZone) b;\r
-            int a_offsets[] = {0, 0};\r
-            int b_offsets[] = {0, 0};\r
-\r
-            boolean bSame = true;\r
-            for (int i = 0; i < sampleTimes.length; i++) {\r
-                otz_a.getOffset(sampleTimes[i], false, a_offsets);\r
-                otz_b.getOffset(sampleTimes[i], false, b_offsets);\r
-                if (a_offsets[0] != b_offsets[0] || a_offsets[1] != b_offsets[1]) {\r
-                    bSame = false;\r
-                    break;\r
-                }\r
-            }\r
-            return bSame;\r
-        }\r
-    }\r
-\r
-    private static class TimeZoneAdapterHandler implements Handler\r
-    {\r
-        public Object[] getTestObjects()\r
-        {\r
-            TimeZoneAdapter timeZones[] = new TimeZoneAdapter[zoneIDs.length];\r
-            \r
-            for (int i = 0; i < zoneIDs.length; i += 1) {\r
-                timeZones[i] = new TimeZoneAdapter(TimeZone.getTimeZone(zoneIDs[i]));\r
-            }\r
-            \r
-            return timeZones;\r
-                \r
-        }\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b)\r
-        {\r
-            GregorianCalendar cal = new GregorianCalendar();\r
-            TimeZoneAdapter tza_a = (TimeZoneAdapter) a;\r
-            TimeZoneAdapter tza_b = (TimeZoneAdapter) b;\r
-            \r
-            int a_offset, b_offset;\r
-            boolean a_dst, b_dst;\r
-            boolean bSame = true;\r
-            for (int i = 0; i < sampleTimes.length; i++) {\r
-                cal.setTimeInMillis(sampleTimes[i]);\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.DAY_OF_MONTH);\r
-                int dow = cal.get(Calendar.DAY_OF_WEEK);\r
-                int mid = cal.get(Calendar.MILLISECONDS_IN_DAY);\r
-                a_offset = tza_a.getOffset(era, year, month, day, dow, mid);\r
-                b_offset = tza_b.getOffset(era, year, month, day, dow, mid);\r
-                Date d = new Date(sampleTimes[i]);\r
-                a_dst = tza_a.inDaylightTime(d);\r
-                b_dst = tza_b.inDaylightTime(d);\r
-                if (a_offset != b_offset || a_dst != b_dst) {\r
-                    bSame = false;\r
-                    break;\r
-                }\r
-            }\r
-            return bSame;\r
-        }\r
-    }\r
-\r
-    private static class JavaTimeZoneHandler implements Handler {\r
-        String[] ZONES = { "GMT", "America/New_York", "GMT+05:45" };\r
-\r
-        public Object[] getTestObjects() {\r
-            JavaTimeZone zones[] = new JavaTimeZone[ZONES.length];\r
-            for(int z = 0; z < ZONES.length; z += 1) {\r
-                zones[z] = new JavaTimeZone(ZONES[z]);\r
-            }\r
-            return zones;\r
-        }\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b)\r
-        {\r
-            TimeZone zone_a = (TimeZone) a;\r
-            TimeZone zone_b = (TimeZone) b;\r
-\r
-            if (!(TimeZone.getCanonicalID(zone_a.getID()).equals(TimeZone.getCanonicalID(zone_b.getID())))) {\r
-                return false;\r
-            }\r
-\r
-            int a_offsets[] = {0, 0};\r
-            int b_offsets[] = {0, 0};\r
-\r
-            boolean bSame = true;\r
-            for (int i = 0; i < sampleTimes.length; i++) {\r
-                zone_a.getOffset(sampleTimes[i], false, a_offsets);\r
-                zone_b.getOffset(sampleTimes[i], false, b_offsets);\r
-                if (a_offsets[0] != b_offsets[0] || a_offsets[1] != b_offsets[1]) {\r
-                    bSame = false;\r
-                    break;\r
-                }\r
-            }\r
-            return bSame;\r
-        }\r
-    }\r
-\r
-    private static class BigDecimalHandler implements Handler\r
-    {\r
-        String values[] = {\r
-            "1234567890.",\r
-            "123456789.0",\r
-            "12345678.90",\r
-            "1234567.890",\r
-            "123456.7890",\r
-            "12345.67890",\r
-            "1234.567890",\r
-            "123.4567890",\r
-            "12.34567890",\r
-            "1.234567890",\r
-            ".1234567890"};\r
-        \r
-        public Object[] getTestObjects()\r
-        {\r
-            BigDecimal bds[] = new BigDecimal[values.length];\r
-            \r
-            for (int i = 0; i < values.length; i += 1) {\r
-                bds[i] = new BigDecimal(values[i]);\r
-            }\r
-            \r
-            return bds;\r
-        }\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b) {\r
-            BigDecimal bda = (BigDecimal) a;\r
-            BigDecimal bdb = (BigDecimal) b;\r
-            \r
-            return bda.toString().equals(bdb.toString());\r
-        }\r
-    }\r
-    \r
-    private static class MathContextHandler implements Handler\r
-    {\r
-        int forms[] = {MathContext.PLAIN, MathContext.ENGINEERING, MathContext.SCIENTIFIC};\r
-        int rounds[] = {\r
-            MathContext.ROUND_CEILING, MathContext.ROUND_DOWN, MathContext.ROUND_FLOOR,\r
-            MathContext.ROUND_HALF_DOWN, MathContext.ROUND_HALF_EVEN, MathContext.ROUND_HALF_UP,\r
-            MathContext.ROUND_UNNECESSARY, MathContext.ROUND_UP};\r
-\r
-        public Object[] getTestObjects()\r
-        {\r
-            int objectCount = forms.length * rounds.length;\r
-            MathContext contexts[] = new MathContext[objectCount];\r
-            int i = 0;\r
-            \r
-            for (int f = 0; f < forms.length; f += 1) {\r
-                for (int r = 0; r < rounds.length; r += 1) {\r
-                    int digits = f * r;\r
-                    boolean lostDigits = (r & 1) != 0;\r
-                    \r
-                    contexts[i++] = new MathContext(digits, forms[f], lostDigits, rounds[r]);\r
-                }\r
-            }\r
-            \r
-            return contexts;\r
-        }\r
-        \r
-        public boolean hasSameBehavior(Object a, Object b)\r
-        {\r
-            MathContext mca = (MathContext) a;\r
-            MathContext mcb = (MathContext) b;\r
-            \r
-            return mca.toString().equals(mcb.toString());\r
-        }\r
-    }\r
-\r
-    private static HashMap map = new HashMap();\r
-    \r
-    static {\r
-        map.put("com.ibm.icu.util.TimeZone", new TimeZoneHandler());\r
-        map.put("com.ibm.icu.util.SimpleTimeZone", new SimpleTimeZoneHandler());\r
-        map.put("com.ibm.icu.util.RuleBasedTimeZone", new RuleBasedTimeZoneHandler());\r
-        map.put("com.ibm.icu.util.VTimeZone", new VTimeZoneHandler());\r
-        map.put("com.ibm.icu.util.DateTimeRule", new DateTimeRuleHandler());\r
-        map.put("com.ibm.icu.util.AnnualTimeZoneRule", new AnnualTimeZoneRuleHandler());\r
-        map.put("com.ibm.icu.util.InitialTimeZoneRule", new InitialTimeZoneRuleHandler());\r
-        map.put("com.ibm.icu.util.TimeArrayTimeZoneRule", new TimeArrayTimeZoneRuleHandler());\r
-        map.put("com.ibm.icu.util.ULocale", new ULocaleHandler());\r
-        map.put("com.ibm.icu.util.Currency", new CurrencyHandler());\r
-        map.put("com.ibm.icu.impl.JavaTimeZone", new JavaTimeZoneHandler());\r
-        map.put("com.ibm.icu.impl.OlsonTimeZone", new OlsonTimeZoneHandler());\r
-        map.put("com.ibm.icu.impl.TimeZoneAdapter", new TimeZoneAdapterHandler());\r
-        map.put("com.ibm.icu.math.BigDecimal", new BigDecimalHandler());\r
-        map.put("com.ibm.icu.math.MathContext", new MathContextHandler());\r
-        \r
-        map.put("com.ibm.icu.text.NumberFormat", new FormatTests.NumberFormatHandler());\r
-        map.put("com.ibm.icu.text.DecimalFormat", new FormatTests.DecimalFormatHandler());\r
-        map.put("com.ibm.icu.text.RuleBasedNumberFormat", new FormatTests.RuleBasedNumberFormatHandler());\r
-        map.put("com.ibm.icu.text.CurrencyPluralInfo", new FormatTests.CurrencyPluralInfoHandler());\r
-        map.put("com.ibm.icu.text.DecimalFormatSymbols", new FormatTests.DecimalFormatSymbolsHandler());\r
-        map.put("com.ibm.icu.text.MessageFormat", new FormatTests.MessageFormatHandler());\r
-        map.put("com.ibm.icu.text.DateFormat", new FormatTests.DateFormatHandler());\r
-        map.put("com.ibm.icu.text.DateFormatSymbols", new FormatTests.DateFormatSymbolsHandler());\r
-        map.put("com.ibm.icu.util.DateInterval", new DateIntervalHandler());\r
-        map.put("com.ibm.icu.text.DateIntervalFormat", new FormatTests.DateIntervalFormatHandler());\r
-        map.put("com.ibm.icu.text.DateIntervalInfo", new FormatTests.DateIntervalInfoHandler());\r
-        map.put("com.ibm.icu.text.DateIntervalInfo$PatternInfo", new FormatTests.PatternInfoHandler());\r
-        map.put("com.ibm.icu.text.SimpleDateFormat", new FormatTests.SimpleDateFormatHandler());\r
-        map.put("com.ibm.icu.text.ChineseDateFormat", new FormatTests.ChineseDateFormatHandler());\r
-        map.put("com.ibm.icu.text.ChineseDateFormatSymbols", new FormatTests.ChineseDateFormatSymbolsHandler());\r
-        map.put("com.ibm.icu.impl.DateNumberFormat", new FormatTests.DateNumberFormatHandler());\r
-        map.put("com.ibm.icu.text.PluralFormat", new FormatTests.PluralFormatHandler());\r
-        map.put("com.ibm.icu.text.PluralRules", new FormatTests.PluralRulesHandler());\r
-        map.put("com.ibm.icu.text.TimeUnitFormat", new FormatTests.TimeUnitFormatHandler());\r
-\r
-        map.put("com.ibm.icu.util.Calendar", new CalendarTests.CalendarHandler());\r
-        map.put("com.ibm.icu.util.BuddhistCalendar", new CalendarTests.BuddhistCalendarHandler());\r
-        map.put("com.ibm.icu.util.ChineseCalendar", new CalendarTests.ChineseCalendarHandler());\r
-        map.put("com.ibm.icu.util.CopticCalendar", new CalendarTests.CopticCalendarHandler());\r
-        map.put("com.ibm.icu.util.EthiopicCalendar", new CalendarTests.EthiopicCalendarHandler());\r
-        map.put("com.ibm.icu.util.GregorianCalendar", new CalendarTests.GregorianCalendarHandler());\r
-        map.put("com.ibm.icu.util.HebrewCalendar", new CalendarTests.HebrewCalendarHandler());\r
-        map.put("com.ibm.icu.util.IndianCalendar", new CalendarTests.IndianCalendarHandler());\r
-        map.put("com.ibm.icu.util.IslamicCalendar", new CalendarTests.IslamicCalendarHandler());\r
-        map.put("com.ibm.icu.util.JapaneseCalendar", new CalendarTests.JapaneseCalendarHandler());\r
-        map.put("com.ibm.icu.util.TaiwanCalendar", new CalendarTests.TaiwanCalendarHandler());\r
-        \r
-        map.put("com.ibm.icu.text.ArabicShapingException", new ExceptionTests.ArabicShapingExceptionHandler());\r
-        map.put("com.ibm.icu.text.StringPrepParseException", new ExceptionTests.StringPrepParseExceptionHandler());\r
-        map.put("com.ibm.icu.util.UResourceTypeMismatchException", new ExceptionTests.UResourceTypeMismatchExceptionHandler());\r
-        map.put("com.ibm.icu.impl.InvalidFormatException", new ExceptionTests.InvalidFormatExceptionHandler());\r
-\r
-//#if defined(FOUNDATION10) || defined(J2SE13)\r
-//#else\r
-        map.put("com.ibm.icu.text.NumberFormat$Field", new FormatTests.NumberFormatFieldHandler());\r
-        map.put("com.ibm.icu.text.DateFormat$Field", new FormatTests.DateFormatFieldHandler());\r
-        map.put("com.ibm.icu.text.ChineseDateFormat$Field", new FormatTests.ChineseDateFormatFieldHandler());\r
-        map.put("com.ibm.icu.text.MessageFormat$Field", new FormatTests.MessageFormatFieldHandler());\r
-//#endif\r
-        map.put("com.ibm.icu.impl.duration.BasicDurationFormat", new FormatTests.BasicDurationFormatHandler());\r
-        map.put("com.ibm.icu.impl.RelativeDateFormat", new FormatTests.RelativeDateFormatHandler());\r
-        map.put("com.ibm.icu.util.IllformedLocaleException", new ExceptionTests.IllformedLocaleExceptionHandler());\r
-        map.put("com.ibm.icu.impl.locale.LocaleSyntaxException", new ExceptionTests.LocaleSyntaxExceptionHandler());\r
-        map.put("com.ibm.icu.impl.IllegalIcuArgumentException", new ExceptionTests.IllegalIcuArgumentExceptionHandler());\r
-    }\r
-    \r
-    public SerializableTest()\r
-    {\r
-        super(\r
-            new String[] {\r
-                "com.ibm.icu.dev.test.serializable.CoverageTest",\r
-                "com.ibm.icu.dev.test.serializable.CompatibilityTest"},\r
-            "All Serializable Tests"\r
-        );\r
-    }\r
-\r
-    public static final String CLASS_TARGET_NAME  = "Serializable";\r
-\r
-    public static void main(String[] args)\r
-    {\r
-        SerializableTest test = new SerializableTest();\r
-        \r
-        test.run(args);\r
-    }\r
-}\r
-//eof\r
+//##header J2SE15
+/*
+ *******************************************************************************
+ * Copyright (C) 1996-2009, International Business Machines Corporation and    *
+ * others. All Rights Reserved.                                                *
+ *******************************************************************************
+ *
+ */
+
+package com.ibm.icu.dev.test.serializable;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+
+import com.ibm.icu.dev.test.TestFmwk;
+import com.ibm.icu.impl.JavaTimeZone;
+import com.ibm.icu.impl.OlsonTimeZone;
+import com.ibm.icu.impl.TimeZoneAdapter;
+import com.ibm.icu.math.BigDecimal;
+import com.ibm.icu.math.MathContext;
+import com.ibm.icu.util.AnnualTimeZoneRule;
+import com.ibm.icu.util.Calendar;
+import com.ibm.icu.util.Currency;
+import com.ibm.icu.util.DateInterval;
+import com.ibm.icu.util.DateTimeRule;
+import com.ibm.icu.util.GregorianCalendar;
+import com.ibm.icu.util.InitialTimeZoneRule;
+import com.ibm.icu.util.RuleBasedTimeZone;
+import com.ibm.icu.util.SimpleTimeZone;
+import com.ibm.icu.util.TimeArrayTimeZoneRule;
+import com.ibm.icu.util.TimeZone;
+import com.ibm.icu.util.TimeZoneRule;
+import com.ibm.icu.util.ULocale;
+import com.ibm.icu.util.VTimeZone;
+
+/**
+ * @author emader
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class SerializableTest extends TestFmwk.TestGroup
+{
+    public interface Handler
+    {
+        public Object[] getTestObjects();
+        
+        public boolean hasSameBehavior(Object a, Object b);
+    }
+    
+    public static Handler getHandler(String className)
+    {
+        return (Handler) map.get(className);
+    }
+    
+    private static class TimeZoneHandler implements Handler
+    {
+        String[] ZONES = { "GMT", "MET", "IST" };
+
+        public Object[] getTestObjects()
+        {
+            TimeZone zones[] = new TimeZone[ZONES.length];
+            
+            for(int z = 0; z < ZONES.length; z += 1) {
+                zones[z] = TimeZone.getTimeZone(ZONES[z]);
+            }
+            
+            return zones;
+        }
+        
+        public boolean hasSameBehavior(Object a, Object b)
+        {
+            TimeZone zone_a = (TimeZone) a;
+            TimeZone zone_b = (TimeZone) b;
+
+            if (!(zone_a.getDisplayName().equals(zone_b.getDisplayName()))) {
+                return false;
+            }
+
+            int a_offsets[] = {0, 0};
+            int b_offsets[] = {0, 0};
+
+            boolean bSame = true;
+            for (int i = 0; i < sampleTimes.length; i++) {
+                zone_a.getOffset(sampleTimes[i], false, a_offsets);
+                zone_b.getOffset(sampleTimes[i], false, b_offsets);
+                if (a_offsets[0] != b_offsets[0] || a_offsets[1] != b_offsets[1]) {
+                    bSame = false;
+                    break;
+                }
+            }
+            return bSame;
+        }
+    }
+    
+    private static Locale locales[] = {
+        Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA, 
+        Locale.CHINESE, Locale.ENGLISH, Locale.FRANCE, Locale.FRENCH, 
+        Locale.GERMAN, Locale.GERMANY, Locale.ITALIAN, Locale.ITALY, 
+        Locale.JAPAN, Locale.JAPANESE, Locale.KOREA, Locale.KOREAN, 
+        Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN, 
+        Locale.TRADITIONAL_CHINESE, Locale.UK, Locale.US
+    };
+    
+    private static Locale places[] = {
+        Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA, 
+        Locale.FRANCE, Locale.GERMANY, Locale.ITALY, 
+        Locale.JAPAN, Locale.KOREA, Locale.PRC, Locale.TAIWAN, 
+        Locale.UK, Locale.US
+    };
+    
+    public static Locale[] getLocales()
+    {
+        return locales;
+    }
+    
+    public static boolean compareStrings(String a[], String b[])
+    {
+        if (a.length != b.length) {
+            return false;
+        }
+        
+        for (int i = 0; i < a.length; i += 1) {
+            if (! a[i].equals(b[i])) {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+    
+    public static boolean compareChars(char a[], char b[])
+    {
+        if (a.length != b.length) {
+            return false;
+        }
+        
+        for (int i = 0; i < a.length; i += 1) {
+            if (a[i] != b[i]) {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+
+    private static class SimpleTimeZoneHandler extends TimeZoneHandler
+    {
+        public Object[] getTestObjects()
+        {
+            SimpleTimeZone simpleTimeZones[] = new SimpleTimeZone[6];
+            
+            simpleTimeZones[0] = new SimpleTimeZone(32400000, "MyTimeZone");
+            
+            simpleTimeZones[1] = new SimpleTimeZone(32400000, "Asia/Tokyo");
+            
+            simpleTimeZones[2] = new SimpleTimeZone(32400000, "Asia/Tokyo");
+            simpleTimeZones[2].setRawOffset(0);
+            
+            simpleTimeZones[3] = new SimpleTimeZone(32400000, "Asia/Tokyo");
+            simpleTimeZones[3].setStartYear(100);
+            
+            simpleTimeZones[4] = new SimpleTimeZone(32400000, "Asia/Tokyo");
+            simpleTimeZones[4].setStartYear(1000);
+            simpleTimeZones[4].setDSTSavings(1800000);
+            simpleTimeZones[4].setStartRule(3, 4, 180000);
+            simpleTimeZones[4].setEndRule(6, 3, 4, 360000);
+            
+            simpleTimeZones[5] = new SimpleTimeZone(32400000, "Asia/Tokyo");
+            simpleTimeZones[5].setStartRule(2, 3, 4, 360000);
+            simpleTimeZones[5].setEndRule(6, 3, 4, 360000);
+            
+            return simpleTimeZones;
+        }
+    }
+
+    private static class VTimeZoneHandler extends TimeZoneHandler {
+        public Object[] getTestObjects() {
+            //TODO
+            VTimeZone[] vtzs = new VTimeZone[1];
+            vtzs[0] = VTimeZone.create("America/New_York");
+            return vtzs;
+        }
+    }
+
+    private static final int HOUR = 60*60*1000;
+    private static final AnnualTimeZoneRule[] TEST_US_EASTERN = {
+        new AnnualTimeZoneRule("EST", -5*HOUR, 0,
+                new DateTimeRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME),
+                1967, 2006),
+        
+        new AnnualTimeZoneRule("EST", -5*HOUR, 0,
+                new DateTimeRule(Calendar.NOVEMBER, 1, Calendar.SUNDAY, true, 2*HOUR, DateTimeRule.WALL_TIME),
+                2007, AnnualTimeZoneRule.MAX_YEAR),
+        
+        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,
+                new DateTimeRule(Calendar.APRIL, -1, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME),
+                1967, 1973),
+
+        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,
+                new DateTimeRule(Calendar.JANUARY, 6, 2*HOUR, DateTimeRule.WALL_TIME),
+                1974, 1974),
+
+        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,
+                new DateTimeRule(Calendar.FEBRUARY, 23, 2*HOUR, DateTimeRule.WALL_TIME),
+                1975, 1975),
+
+        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,
+                new DateTimeRule(Calendar.APRIL, -1, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME),
+                1976, 1986),
+
+        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,
+                new DateTimeRule(Calendar.APRIL, 1, Calendar.SUNDAY, true, 2*HOUR, DateTimeRule.WALL_TIME),
+                1987, 2006),
+
+        new AnnualTimeZoneRule("EDT", -5*HOUR, 1*HOUR,
+                new DateTimeRule(Calendar.MARCH, 8, Calendar.SUNDAY, true, 2*HOUR, DateTimeRule.WALL_TIME),
+                2007, AnnualTimeZoneRule.MAX_YEAR)
+    };
+    
+
+    
+    private static class RuleBasedTimeZoneHandler extends TimeZoneHandler
+    {
+        public Object[] getTestObjects()
+        {
+            RuleBasedTimeZone ruleBasedTimeZones[] = new RuleBasedTimeZone[2];
+
+            InitialTimeZoneRule ir = new InitialTimeZoneRule("GMT-5", -5*HOUR, 0);
+
+            // GMT-5, no transition
+            ruleBasedTimeZones[0] = new RuleBasedTimeZone("GMT-5", ir);
+
+
+            // US Eastern since 1967
+            ruleBasedTimeZones[1] = new RuleBasedTimeZone("US_East", ir);
+            for (int i = 0; i < TEST_US_EASTERN.length; i++) {
+                ruleBasedTimeZones[1].addTransitionRule(TEST_US_EASTERN[i]);
+            }
+            return ruleBasedTimeZones;
+        }
+    }
+
+    private static class DateTimeRuleHandler implements Handler {
+        public Object[] getTestObjects() {
+            DateTimeRule[] rules = new DateTimeRule[4];
+
+            // DOM + UTC
+            rules[0] = new DateTimeRule(Calendar.OCTOBER, 10, 13*HOUR, DateTimeRule.UTC_TIME);
+
+            // DOW + WALL
+            rules[1] = new DateTimeRule(Calendar.MARCH, 2, Calendar.SUNDAY, 2*HOUR, DateTimeRule.WALL_TIME);
+
+            // DOW_GEQ_DOM + STD
+            rules[2] = new DateTimeRule(Calendar.MAY, 1, Calendar.MONDAY, true, 0*HOUR, DateTimeRule.STANDARD_TIME);
+
+            // DOW_LEQ_DOM + WALL
+            rules[3] = new DateTimeRule(Calendar.AUGUST, 31, Calendar.SATURDAY, false, 1*HOUR, DateTimeRule.WALL_TIME);
+
+            return rules;
+        }
+
+        public boolean hasSameBehavior(Object a, Object b) {
+            return hasSameRule((DateTimeRule)a, (DateTimeRule)b);
+        }
+
+        static boolean hasSameRule(DateTimeRule dtra, DateTimeRule dtrb) {
+            boolean bSame = false;
+            if (dtra.getDateRuleType() == dtrb.getDateRuleType()
+                    && dtra.getRuleMonth() == dtrb.getRuleMonth()
+                    && dtra.getTimeRuleType() == dtrb.getTimeRuleType()
+                    && dtra.getRuleMillisInDay() == dtrb.getRuleMillisInDay()) {
+                switch (dtra.getDateRuleType()) {
+                case DateTimeRule.DOM:
+                    bSame = (dtra.getRuleDayOfMonth() == dtrb.getRuleDayOfMonth());
+                    break;
+                case DateTimeRule.DOW:
+                    bSame = (dtra.getRuleDayOfWeek() == dtrb.getRuleDayOfWeek() &&
+                                dtra.getRuleWeekInMonth() == dtrb.getRuleWeekInMonth());
+                    break;
+                case DateTimeRule.DOW_GEQ_DOM:
+                case DateTimeRule.DOW_LEQ_DOM:
+                    bSame = (dtra.getRuleDayOfMonth() == dtrb.getRuleDayOfMonth() &&
+                                dtra.getRuleDayOfWeek() == dtrb.getRuleDayOfWeek());
+                    break;
+                }
+            }
+            return bSame;            
+        }
+    }
+
+    private static boolean compareTimeZoneRules(TimeZoneRule ra, TimeZoneRule rb) {
+        if (ra.getName().equals(rb.getName()) &&
+                ra.getRawOffset() == rb.getRawOffset() &&
+                ra.getDSTSavings() == rb.getDSTSavings()) {
+            return true;
+        }
+        return false;        
+    }
+
+    private static class AnnualTimeZoneRuleHandler implements Handler {
+        public Object[] getTestObjects() {
+            return TEST_US_EASTERN;
+        }
+
+        public boolean hasSameBehavior(Object a, Object b) {
+            AnnualTimeZoneRule ra = (AnnualTimeZoneRule)a;
+            AnnualTimeZoneRule rb = (AnnualTimeZoneRule)b;
+            if (DateTimeRuleHandler.hasSameRule(ra.getRule(), rb.getRule()) &&
+                    ra.getStartYear() == rb.getStartYear() &&
+                    ra.getEndYear() == rb.getEndYear()) {
+                return compareTimeZoneRules(ra, rb);
+            }
+            return false;
+        }
+    }
+
+    private static class InitialTimeZoneRuleHandler implements Handler {
+        public Object[] getTestObjects() {
+            TimeZoneRule[] rules = new TimeZoneRule[2];
+            rules[0] = new InitialTimeZoneRule("EST", -5*HOUR, 0);
+            rules[1] = new InitialTimeZoneRule("PST", -8*HOUR, 0);
+            return rules;
+        }
+
+        public boolean hasSameBehavior(Object a, Object b) {
+            return compareTimeZoneRules((TimeZoneRule)a, (TimeZoneRule)b);
+        }
+    }
+
+    private static class TimeArrayTimeZoneRuleHandler implements Handler {
+        public Object[] getTestObjects() {
+            TimeArrayTimeZoneRule[] rules = new TimeArrayTimeZoneRule[1];
+            long[] ttime = new long[] {-631152000000L, 0L, 946684800000L}; /* {1950-1-1, 1970-1-1, 2000-1-1} */
+            rules[0] = new TimeArrayTimeZoneRule("Foo", 1*HOUR, 1*HOUR, ttime, DateTimeRule.UTC_TIME);
+
+            return rules;
+        }
+        public boolean hasSameBehavior(Object a, Object b) {
+            TimeArrayTimeZoneRule ra = (TimeArrayTimeZoneRule)a;
+            TimeArrayTimeZoneRule rb = (TimeArrayTimeZoneRule)b;
+
+            Date da = ra.getFirstStart(0, 0);
+            Date db = rb.getFirstStart(0, 0);
+            long t = da.getTime();
+            if (da.equals(db)) {
+                da = ra.getFinalStart(0, 0);
+                db = rb.getFinalStart(0, 0);
+                long end = da.getTime();
+                if (da.equals(db)) {
+                    while (t < end) {
+                        da = ra.getNextStart(t, 0, 0, false);
+                        db = ra.getNextStart(t, 0, 0, false);
+                        if (da == null || db == null || !da.equals(db)) {
+                            break;
+                        }
+                        t = da.getTime();
+                    }
+                    return compareTimeZoneRules(ra, rb);
+                }
+            }
+            return false;
+        }
+    }
+
+    private static class ULocaleHandler implements Handler
+    {
+        public Object[] getTestObjects()
+        {
+            ULocale uLocales[] = new ULocale[locales.length];
+            
+            for (int i = 0; i < locales.length; i += 1) {
+                uLocales[i] = ULocale.forLocale(locales[i]);
+            }
+            
+            return uLocales;
+        }
+        
+        public boolean hasSameBehavior(Object a, Object b)
+        {
+            ULocale uloc_a = (ULocale) a;
+            ULocale uloc_b = (ULocale) b;
+            
+            return uloc_a.getName().equals(uloc_b.getName());
+        }
+    }
+    
+    public static class DateIntervalHandler implements Handler
+    {
+        private DateInterval dateInterval[] = {
+                new DateInterval(0L, 1164931200000L/*20061201T000000Z*/)
+        };
+        public Object[] getTestObjects()
+        {
+            return dateInterval;
+        }
+
+        public boolean hasSameBehavior(Object a, Object b)
+        {
+            return a.equals(b);
+        }
+    }
+
+
+    private static class CurrencyHandler implements Handler
+    {
+        public Object[] getTestObjects()
+        {
+            Currency currencies[] = new Currency[places.length];
+            
+            for (int i = 0; i < places.length; i += 1) {
+                currencies[i] = Currency.getInstance(places[i]);
+            }
+            
+            return currencies;
+        }
+        
+        public boolean hasSameBehavior(Object a, Object b)
+        {
+            Currency curr_a = (Currency) a;
+            Currency curr_b = (Currency) b;
+            
+            return curr_a.getCurrencyCode().equals(curr_b.getCurrencyCode());
+            
+        }
+    }
+
+    private static String zoneIDs[] = {
+        "Pacific/Honolulu", "America/Anchorage", "America/Los_Angeles", "America/Denver",
+        "America/Chicago", "America/New_York", "Africa/Cairo", "Africa/Addis_Ababa", "Africa/Dar_es_Salaam",
+        "Africa/Freetown", "Africa/Johannesburg", "Africa/Nairobi", "Asia/Bangkok", "Asia/Baghdad",
+        "Asia/Calcutta", "Asia/Hong_Kong", "Asia/Jakarta", "Asia/Jerusalem", "Asia/Manila", "Asia/Tokyo",
+        "Europe/Amsterdam", "Europe/Athens", "Europe/Berlin", "Europe/London", "Europe/Malta", "Europe/Moscow",
+        "Europe/Paris", "Europe/Rome"
+    };
+        
+    private static long sampleTimes[] = {
+        1136073600000L, // 20060101T000000Z
+        1138752000000L, // 20060201T000000Z
+        1141171200000L, // 20060301T000000Z
+        1143849600000L, // 20060401T000000Z
+        1146441600000L, // 20060501T000000Z
+        1149120000000L, // 20060601T000000Z
+        1151712000000L, // 20060701T000000Z
+        1154390400000L, // 20060801T000000Z
+        1157068800000L, // 20060901T000000Z
+        1159660800000L, // 20061001T000000Z
+        1162339200000L, // 20061101T000000Z
+        1164931200000L, // 20061201T000000Z
+    };
+
+    private static class OlsonTimeZoneHandler implements Handler
+    {
+        public Object[] getTestObjects()
+        {
+            OlsonTimeZone timeZones[] = new OlsonTimeZone[zoneIDs.length];
+            
+            for (int i = 0; i < zoneIDs.length; i += 1) {
+                timeZones[i] = new OlsonTimeZone(zoneIDs[i]);
+            }
+            
+            return timeZones;
+                
+        }
+        
+        public boolean hasSameBehavior(Object a, Object b)
+        {
+            OlsonTimeZone otz_a = (OlsonTimeZone) a;
+            OlsonTimeZone otz_b = (OlsonTimeZone) b;
+            int a_offsets[] = {0, 0};
+            int b_offsets[] = {0, 0};
+
+            boolean bSame = true;
+            for (int i = 0; i < sampleTimes.length; i++) {
+                otz_a.getOffset(sampleTimes[i], false, a_offsets);
+                otz_b.getOffset(sampleTimes[i], false, b_offsets);
+                if (a_offsets[0] != b_offsets[0] || a_offsets[1] != b_offsets[1]) {
+                    bSame = false;
+                    break;
+                }
+            }
+            return bSame;
+        }
+    }
+
+    private static class TimeZoneAdapterHandler implements Handler
+    {
+        public Object[] getTestObjects()
+        {
+            TimeZoneAdapter timeZones[] = new TimeZoneAdapter[zoneIDs.length];
+            
+            for (int i = 0; i < zoneIDs.length; i += 1) {
+                timeZones[i] = new TimeZoneAdapter(TimeZone.getTimeZone(zoneIDs[i]));
+            }
+            
+            return timeZones;
+                
+        }
+        
+        public boolean hasSameBehavior(Object a, Object b)
+        {
+            GregorianCalendar cal = new GregorianCalendar();
+            TimeZoneAdapter tza_a = (TimeZoneAdapter) a;
+            TimeZoneAdapter tza_b = (TimeZoneAdapter) b;
+            
+            int a_offset, b_offset;
+            boolean a_dst, b_dst;
+            boolean bSame = true;
+            for (int i = 0; i < sampleTimes.length; i++) {
+                cal.setTimeInMillis(sampleTimes[i]);
+                int era = cal.get(Calendar.ERA);
+                int year = cal.get(Calendar.YEAR);
+                int month = cal.get(Calendar.MONTH);
+                int day = cal.get(Calendar.DAY_OF_MONTH);
+                int dow = cal.get(Calendar.DAY_OF_WEEK);
+                int mid = cal.get(Calendar.MILLISECONDS_IN_DAY);
+                a_offset = tza_a.getOffset(era, year, month, day, dow, mid);
+                b_offset = tza_b.getOffset(era, year, month, day, dow, mid);
+                Date d = new Date(sampleTimes[i]);
+                a_dst = tza_a.inDaylightTime(d);
+                b_dst = tza_b.inDaylightTime(d);
+                if (a_offset != b_offset || a_dst != b_dst) {
+                    bSame = false;
+                    break;
+                }
+            }
+            return bSame;
+        }
+    }
+
+    private static class JavaTimeZoneHandler implements Handler {
+        String[] ZONES = { "GMT", "America/New_York", "GMT+05:45" };
+
+        public Object[] getTestObjects() {
+            JavaTimeZone zones[] = new JavaTimeZone[ZONES.length];
+            for(int z = 0; z < ZONES.length; z += 1) {
+                zones[z] = new JavaTimeZone(ZONES[z]);
+            }
+            return zones;
+        }
+        
+        public boolean hasSameBehavior(Object a, Object b)
+        {
+            TimeZone zone_a = (TimeZone) a;
+            TimeZone zone_b = (TimeZone) b;
+
+            if (!(TimeZone.getCanonicalID(zone_a.getID()).equals(TimeZone.getCanonicalID(zone_b.getID())))) {
+                return false;
+            }
+
+            int a_offsets[] = {0, 0};
+            int b_offsets[] = {0, 0};
+
+            boolean bSame = true;
+            for (int i = 0; i < sampleTimes.length; i++) {
+                zone_a.getOffset(sampleTimes[i], false, a_offsets);
+                zone_b.getOffset(sampleTimes[i], false, b_offsets);
+                if (a_offsets[0] != b_offsets[0] || a_offsets[1] != b_offsets[1]) {
+                    bSame = false;
+                    break;
+                }
+            }
+            return bSame;
+        }
+    }
+
+    private static class BigDecimalHandler implements Handler
+    {
+        String values[] = {
+            "1234567890.",
+            "123456789.0",
+            "12345678.90",
+            "1234567.890",
+            "123456.7890",
+            "12345.67890",
+            "1234.567890",
+            "123.4567890",
+            "12.34567890",
+            "1.234567890",
+            ".1234567890"};
+        
+        public Object[] getTestObjects()
+        {
+            BigDecimal bds[] = new BigDecimal[values.length];
+            
+            for (int i = 0; i < values.length; i += 1) {
+                bds[i] = new BigDecimal(values[i]);
+            }
+            
+            return bds;
+        }
+        
+        public boolean hasSameBehavior(Object a, Object b) {
+            BigDecimal bda = (BigDecimal) a;
+            BigDecimal bdb = (BigDecimal) b;
+            
+            return bda.toString().equals(bdb.toString());
+        }
+    }
+    
+    private static class MathContextHandler implements Handler
+    {
+        int forms[] = {MathContext.PLAIN, MathContext.ENGINEERING, MathContext.SCIENTIFIC};
+        int rounds[] = {
+            MathContext.ROUND_CEILING, MathContext.ROUND_DOWN, MathContext.ROUND_FLOOR,
+            MathContext.ROUND_HALF_DOWN, MathContext.ROUND_HALF_EVEN, MathContext.ROUND_HALF_UP,
+            MathContext.ROUND_UNNECESSARY, MathContext.ROUND_UP};
+
+        public Object[] getTestObjects()
+        {
+            int objectCount = forms.length * rounds.length;
+            MathContext contexts[] = new MathContext[objectCount];
+            int i = 0;
+            
+            for (int f = 0; f < forms.length; f += 1) {
+                for (int r = 0; r < rounds.length; r += 1) {
+                    int digits = f * r;
+                    boolean lostDigits = (r & 1) != 0;
+                    
+                    contexts[i++] = new MathContext(digits, forms[f], lostDigits, rounds[r]);
+                }
+            }
+            
+            return contexts;
+        }
+        
+        public boolean hasSameBehavior(Object a, Object b)
+        {
+            MathContext mca = (MathContext) a;
+            MathContext mcb = (MathContext) b;
+            
+            return mca.toString().equals(mcb.toString());
+        }
+    }
+
+    private static HashMap map = new HashMap();
+    
+    static {
+        map.put("com.ibm.icu.util.TimeZone", new TimeZoneHandler());
+        map.put("com.ibm.icu.util.SimpleTimeZone", new SimpleTimeZoneHandler());
+        map.put("com.ibm.icu.util.RuleBasedTimeZone", new RuleBasedTimeZoneHandler());
+        map.put("com.ibm.icu.util.VTimeZone", new VTimeZoneHandler());
+        map.put("com.ibm.icu.util.DateTimeRule", new DateTimeRuleHandler());
+        map.put("com.ibm.icu.util.AnnualTimeZoneRule", new AnnualTimeZoneRuleHandler());
+        map.put("com.ibm.icu.util.InitialTimeZoneRule", new InitialTimeZoneRuleHandler());
+        map.put("com.ibm.icu.util.TimeArrayTimeZoneRule", new TimeArrayTimeZoneRuleHandler());
+        map.put("com.ibm.icu.util.ULocale", new ULocaleHandler());
+        map.put("com.ibm.icu.util.Currency", new CurrencyHandler());
+        map.put("com.ibm.icu.impl.JavaTimeZone", new JavaTimeZoneHandler());
+        map.put("com.ibm.icu.impl.OlsonTimeZone", new OlsonTimeZoneHandler());
+        map.put("com.ibm.icu.impl.TimeZoneAdapter", new TimeZoneAdapterHandler());
+        map.put("com.ibm.icu.math.BigDecimal", new BigDecimalHandler());
+        map.put("com.ibm.icu.math.MathContext", new MathContextHandler());
+        
+        map.put("com.ibm.icu.text.NumberFormat", new FormatTests.NumberFormatHandler());
+        map.put("com.ibm.icu.text.DecimalFormat", new FormatTests.DecimalFormatHandler());
+        map.put("com.ibm.icu.text.RuleBasedNumberFormat", new FormatTests.RuleBasedNumberFormatHandler());
+        map.put("com.ibm.icu.text.CurrencyPluralInfo", new FormatTests.CurrencyPluralInfoHandler());
+        map.put("com.ibm.icu.text.DecimalFormatSymbols", new FormatTests.DecimalFormatSymbolsHandler());
+        map.put("com.ibm.icu.text.MessageFormat", new FormatTests.MessageFormatHandler());
+        map.put("com.ibm.icu.text.DateFormat", new FormatTests.DateFormatHandler());
+        map.put("com.ibm.icu.text.DateFormatSymbols", new FormatTests.DateFormatSymbolsHandler());
+        map.put("com.ibm.icu.util.DateInterval", new DateIntervalHandler());
+        map.put("com.ibm.icu.text.DateIntervalFormat", new FormatTests.DateIntervalFormatHandler());
+        map.put("com.ibm.icu.text.DateIntervalInfo", new FormatTests.DateIntervalInfoHandler());
+        map.put("com.ibm.icu.text.DateIntervalInfo$PatternInfo", new FormatTests.PatternInfoHandler());
+        map.put("com.ibm.icu.text.SimpleDateFormat", new FormatTests.SimpleDateFormatHandler());
+        map.put("com.ibm.icu.text.ChineseDateFormat", new FormatTests.ChineseDateFormatHandler());
+        map.put("com.ibm.icu.text.ChineseDateFormatSymbols", new FormatTests.ChineseDateFormatSymbolsHandler());
+        map.put("com.ibm.icu.impl.DateNumberFormat", new FormatTests.DateNumberFormatHandler());
+        map.put("com.ibm.icu.text.PluralFormat", new FormatTests.PluralFormatHandler());
+        map.put("com.ibm.icu.text.PluralRules", new FormatTests.PluralRulesHandler());
+        map.put("com.ibm.icu.text.TimeUnitFormat", new FormatTests.TimeUnitFormatHandler());
+
+        map.put("com.ibm.icu.util.Calendar", new CalendarTests.CalendarHandler());
+        map.put("com.ibm.icu.util.BuddhistCalendar", new CalendarTests.BuddhistCalendarHandler());
+        map.put("com.ibm.icu.util.ChineseCalendar", new CalendarTests.ChineseCalendarHandler());
+        map.put("com.ibm.icu.util.CopticCalendar", new CalendarTests.CopticCalendarHandler());
+        map.put("com.ibm.icu.util.EthiopicCalendar", new CalendarTests.EthiopicCalendarHandler());
+        map.put("com.ibm.icu.util.GregorianCalendar", new CalendarTests.GregorianCalendarHandler());
+        map.put("com.ibm.icu.util.HebrewCalendar", new CalendarTests.HebrewCalendarHandler());
+        map.put("com.ibm.icu.util.IndianCalendar", new CalendarTests.IndianCalendarHandler());
+        map.put("com.ibm.icu.util.IslamicCalendar", new CalendarTests.IslamicCalendarHandler());
+        map.put("com.ibm.icu.util.JapaneseCalendar", new CalendarTests.JapaneseCalendarHandler());
+        map.put("com.ibm.icu.util.TaiwanCalendar", new CalendarTests.TaiwanCalendarHandler());
+        
+        map.put("com.ibm.icu.text.ArabicShapingException", new ExceptionTests.ArabicShapingExceptionHandler());
+        map.put("com.ibm.icu.text.StringPrepParseException", new ExceptionTests.StringPrepParseExceptionHandler());
+        map.put("com.ibm.icu.util.UResourceTypeMismatchException", new ExceptionTests.UResourceTypeMismatchExceptionHandler());
+        map.put("com.ibm.icu.impl.InvalidFormatException", new ExceptionTests.InvalidFormatExceptionHandler());
+
+//#if defined(FOUNDATION10) || defined(J2SE13)
+//#else
+        map.put("com.ibm.icu.text.NumberFormat$Field", new FormatTests.NumberFormatFieldHandler());
+        map.put("com.ibm.icu.text.DateFormat$Field", new FormatTests.DateFormatFieldHandler());
+        map.put("com.ibm.icu.text.ChineseDateFormat$Field", new FormatTests.ChineseDateFormatFieldHandler());
+        map.put("com.ibm.icu.text.MessageFormat$Field", new FormatTests.MessageFormatFieldHandler());
+//#endif
+        map.put("com.ibm.icu.impl.duration.BasicDurationFormat", new FormatTests.BasicDurationFormatHandler());
+        map.put("com.ibm.icu.impl.RelativeDateFormat", new FormatTests.RelativeDateFormatHandler());
+        map.put("com.ibm.icu.util.IllformedLocaleException", new ExceptionTests.IllformedLocaleExceptionHandler());
+        map.put("com.ibm.icu.impl.locale.LocaleSyntaxException", new ExceptionTests.LocaleSyntaxExceptionHandler());
+        map.put("com.ibm.icu.impl.IllegalIcuArgumentException", new ExceptionTests.IllegalIcuArgumentExceptionHandler());
+    }
+    
+    public SerializableTest()
+    {
+        super(
+            new String[] {
+                "com.ibm.icu.dev.test.serializable.CoverageTest",
+                "com.ibm.icu.dev.test.serializable.CompatibilityTest"},
+            "All Serializable Tests"
+        );
+    }
+
+    public static final String CLASS_TARGET_NAME  = "Serializable";
+
+    public static void main(String[] args)
+    {
+        SerializableTest test = new SerializableTest();
+        
+        test.run(args);
+    }
+}
+//eof