12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
5f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert * Copyright (C) 2001-2015, International Business Machines Corporation and    *
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Port From:   ICU4C v1.8.1 : format : DateFormatRegressionTest
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Source File: $ICU4CRoot/source/test/intltest/dtfmrgts.cpp
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayInputStream;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ByteArrayOutputStream;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.IOException;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectInputStream;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.ObjectOutputStream;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.io.OptionalDataException;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.Format;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParseException;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition;
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date;
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
302d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test;
312d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DateFormat;
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.SimpleDateFormat;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Calendar;
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.GregorianCalendar;
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.IslamicCalendar;
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.JapaneseCalendar;
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.SimpleTimeZone;
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeZone;
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Performs regression test for DateFormat
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert **/
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class DateFormatRegressionTest extends com.ibm.icu.dev.test.TestFmwk {
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4029195
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4029195() {
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance();
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date today = cal.getTime();
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("today: " + today);
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat sdf = (SimpleDateFormat) DateFormat.getDateInstance();
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = sdf.toPattern();
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: " + pat);
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer fmtd = new StringBuffer("");
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(0);
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmtd = sdf.format(today, fmtd, pos);
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("today: " + fmtd);
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sdf.applyPattern("G yyyy DDD");
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer todayS = new StringBuffer("");
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        todayS = sdf.format(today, todayS, pos);
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("today: " + todayS);
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            today = sdf.parse(todayS.toString());
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("today date: " + today);
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Error reparsing date: " + e.getMessage());
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer rt = new StringBuffer("");
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            rt = sdf.format(sdf.parse(todayS.toString()), rt, pos);
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("round trip: " + rt);
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!rt.toString().equals(todayS.toString()))
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: Want " + todayS + " Got " + rt);
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + e);
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e.printStackTrace();
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4052408
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4052408() {
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.US);
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance();
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(97 + 1900, Calendar.MAY, 3, 8, 55);
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date dt = cal.getTime();
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String str = fmt.format(dt);
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(str);
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!str.equals("5/3/97, 8:55 AM"))
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: Test broken; Want 5/3/97, 8:55 AM Got " + str);
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String expected[] = {
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"ERA_FIELD",
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "97", //"YEAR_FIELD",
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "5", //"MONTH_FIELD",
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "3", //"DATE_FIELD",
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"HOUR_OF_DAY1_FIELD",
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"HOUR_OF_DAY0_FIELD",
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "55", //"MINUTE_FIELD",
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"SECOND_FIELD",
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"MILLISECOND_FIELD",
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"DAY_OF_WEEK_FIELD",
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"DAY_OF_YEAR_FIELD",
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"DAY_OF_WEEK_IN_MONTH_FIELD",
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"WEEK_OF_YEAR_FIELD",
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"WEEK_OF_MONTH_FIELD",
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "AM", //"AM_PM_FIELD",
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "8", //"HOUR1_FIELD",
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "", //"HOUR0_FIELD",
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "" //"TIMEZONE_FIELD"
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            };
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String fieldNames[] = {
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "ERA_FIELD",
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "YEAR_FIELD",
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "MONTH_FIELD",
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "DATE_FIELD",
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "HOUR_OF_DAY1_FIELD",
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "HOUR_OF_DAY0_FIELD",
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "MINUTE_FIELD",
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "SECOND_FIELD",
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "MILLISECOND_FIELD",
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "DAY_OF_WEEK_FIELD",
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "DAY_OF_YEAR_FIELD",
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "DAY_OF_WEEK_IN_MONTH_FIELD",
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "WEEK_OF_YEAR_FIELD",
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "WEEK_OF_MONTH_FIELD",
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "AM_PM_FIELD",
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "HOUR1_FIELD",
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "HOUR0_FIELD",
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "TIMEZONE_FIELD"};
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean pass = true;
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i <= 17; ++i) {
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            FieldPosition pos = new FieldPosition(i);
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer buf = new StringBuffer("");
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.format(dt, buf, pos);
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //char[] dst = new char[pos.getEndIndex() - pos.getBeginIndex()];
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String dst = buf.substring(pos.getBeginIndex(), pos.getEndIndex());
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            str = dst;
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log(i + ": " + fieldNames[i] + ", \"" + str + "\", "
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    + pos.getBeginIndex() + ", " + pos.getEndIndex());
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String exp = expected[i];
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ((exp.length() == 0 && str.length() == 0) || str.equals(exp))
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(" ok");
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            else {
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(" expected " + exp);
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pass = false;
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!pass)
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: FieldPosition not set right by DateFormat");
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4056591
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Verify the function of the [s|g]et2DigitYearStart() API.
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4056591() {
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd", Locale.US);
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Calendar cal = Calendar.getInstance();
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(1809, Calendar.DECEMBER, 25);
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date start = cal.getTime();
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fmt.set2DigitYearStart(start);
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ((fmt.get2DigitYearStart() != start))
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("get2DigitYearStart broken");
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(1809, Calendar.DECEMBER, 25);
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date d1 = cal.getTime();
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(1909, Calendar.DECEMBER, 24);
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date d2 = cal.getTime();
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(1809, Calendar.DECEMBER, 26);
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date d3 = cal.getTime();
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(1861, Calendar.DECEMBER, 25);
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date d4 = cal.getTime();
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date dates[] = {d1, d2, d3, d4};
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String strings[] = {"091225", "091224", "091226", "611225"};
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < 4; i++) {
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s = strings[i];
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Date exp = dates[i];
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Date got = fmt.parse(s);
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(s + " . " + got + "; exp " + exp);
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (got.getTime() != exp.getTime())
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("set2DigitYearStart broken");
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + e);
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e.printStackTrace();
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4059917
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2142d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4059917() {
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat fmt;
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String myDate;
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = new SimpleDateFormat("yyyy/MM/dd");
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        myDate = "1997/01/01";
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        aux917( fmt, myDate );
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        fmt = new SimpleDateFormat("yyyyMMdd");
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        myDate = "19970101";
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        aux917( fmt, myDate );
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void aux917(SimpleDateFormat fmt, String str) {
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pat = fmt.toPattern();
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("==================");
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("testIt: pattern=" + pat + " string=" + str);
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Object o = fmt.parseObject(str, pos);
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //logln( UnicodeString("Parsed object: ") + o );
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer formatted = new StringBuffer("");
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition poss = new FieldPosition(0);
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        formatted = fmt.format(o, formatted, poss);
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Formatted string: " + formatted);
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!formatted.toString().equals(str))
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: Want " + str + " Got " + formatted);
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4060212
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2472d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4060212() {
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String dateString = "1995-040.05:01:29";
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("dateString= " + dateString);
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Using yyyy-DDD.hh:mm:ss");
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-DDD.hh:mm:ss");
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date myDate = formatter.parse(dateString, pos);
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.LONG);
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String myString = fmt.format(myDate);
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(myString);
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = new GregorianCalendar();
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setTime(myDate);
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if ((cal.get(Calendar.DAY_OF_YEAR) != 40))
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: Got " + cal.get(Calendar.DAY_OF_YEAR) + " Want 40");
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Using yyyy-ddd.hh:mm:ss");
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        formatter = new SimpleDateFormat("yyyy-ddd.hh:mm:ss");
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pos.setIndex(0);
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        myDate = formatter.parse(dateString, pos);
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        myString = fmt.format(myDate);
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(myString);
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setTime(myDate);
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if ((cal.get(Calendar.DAY_OF_YEAR) != 40))
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: Got " + cal.get(Calendar.DAY_OF_YEAR) + " Want 40");
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4061287
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
2762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4061287() {
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(df.parse("35/01/1971").toString());
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + e);
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e.printStackTrace();
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        df.setLenient(false);
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean ok = false;
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(df.parse("35/01/1971").toString());
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ok = true;
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!ok)
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: Lenient not working");
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4065240
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4065240() {
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date curDate;
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat shortdate, fulldate;
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String strShortDate, strFullDate;
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale saveLocale = Locale.getDefault();
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeZone saveZone = TimeZone.getDefault();
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale curLocale = new Locale("de", "DE");
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale.setDefault(curLocale);
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // {sfb} adoptDefault instead of setDefault
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //TimeZone.setDefault(TimeZone.createTimeZone("EST"));
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TimeZone.setDefault(TimeZone.getTimeZone("EST"));
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Calendar cal = Calendar.getInstance();
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(98 + 1900, 0, 1);
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            curDate = cal.getTime();
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            shortdate = DateFormat.getDateInstance(DateFormat.SHORT);
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            fulldate = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strShortDate = "The current date (short form) is ";
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String temp;
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            temp = shortdate.format(curDate);
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strShortDate += temp;
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strFullDate = "The current date (long form) is ";
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String temp2 = fulldate.format(curDate);
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            strFullDate += temp2;
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(strShortDate);
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(strFullDate);
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // {sfb} What to do with resource bundle stuff?????
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Check to see if the resource is present; if not, we can't test
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //ResourceBundle bundle = //The variable is never used
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //    ICULocaleData.getBundle("DateFormatZoneData", curLocale);
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // {sfb} API change to ResourceBundle -- add getLocale()
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /*if (bundle.getLocale().getLanguage().equals("de")) {
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // UPDATE THIS AS ZONE NAME RESOURCE FOR <EST> in de_DE is updated
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!strFullDate.endsWith("GMT-05:00"))
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Fail: Want GMT-05:00");
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("*** TEST COULD NOT BE COMPLETED BECAUSE DateFormatZoneData ***");
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("*** FOR LOCALE de OR de_DE IS MISSING ***");
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }*/
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(e.getMessage());
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } finally {
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale.setDefault(saveLocale);
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TimeZone.setDefault(saveZone);
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      DateFormat.equals is too narrowly defined.  As a result, MessageFormat
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      does not work correctly.  DateFormat.equals needs to be written so
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      that the Calendar sub-object is not compared using Calendar.equals,
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      but rather compared for equivalency.  This may necessitate adding a
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      (package private) method to Calendar to test for equivalency.
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      Currently this bug breaks MessageFormat.toPattern
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      */
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4071441
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
3672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4071441() {
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmtA = DateFormat.getInstance();
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmtB = DateFormat.getInstance();
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // {sfb} Is it OK to cast away const here?
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar calA = fmtA.getCalendar();
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar calB = fmtB.getCalendar();
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calA.clear();
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calA.set(1900, 0 ,0);
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calB.clear();
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calB.set(1900, 0, 0);
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!calA.equals(calB))
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: Can't complete test; Calendar instances unequal");
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!fmtA.equals(fmtB))
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: DateFormat unequal when Calendars equal");
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calB.clear();
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calB.set(1961, Calendar.DECEMBER, 25);
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (calA.equals(calB))
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: Can't complete test; Calendar instances equal");
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!fmtA.equals(fmtB))
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: DateFormat unequal when Calendars equivalent");
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("DateFormat.equals ok");
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /* The java.text.DateFormat.parse(String) method expects for the
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      US locale a string formatted according to mm/dd/yy and parses it
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      correctly.
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      When given a string mm/dd/yyyy it only parses up to the first
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      two y's, typically resulting in a date in the year 1919.
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      Please extend the parsing method(s) to handle strings with
4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      four-digit year values (probably also applicable to various
4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      other locales.  */
4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4073003
4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4052d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4073003() {
4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String tests[] = {"12/25/61", "12/25/1961", "4/3/2010", "4/3/10"};
4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < 4; i += 2) {
4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Date d = fmt.parse(tests[i]);
4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Date dd = fmt.parse(tests[i + 1]);
4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String s;
4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                s = fmt.format(d);
4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String ss;
4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ss = fmt.format(dd);
4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (d.getTime() != dd.getTime())
4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Fail: " + d + " != " + dd);
4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!s.equals(ss))
4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("Fail: " + s + " != " + ss);
4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("Ok: " + s + " " + d);
4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException e) {
4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + e);
4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            e.printStackTrace();
4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4089106
4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4322d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4089106() {
4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeZone def = TimeZone.getDefault();
4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TimeZone z = new SimpleTimeZone((int) (1.25 * 3600000), "FAKEZONE");
4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TimeZone.setDefault(z);
438fd8e573a5df79014cfd7642eb6f0474b89b5736aNeil Fuller            // Android patch (http://b/28949992) start.
439fd8e573a5df79014cfd7642eb6f0474b89b5736aNeil Fuller            // ICU TimeZone.setDefault() not supported on Android.
440fd8e573a5df79014cfd7642eb6f0474b89b5736aNeil Fuller            z = TimeZone.getDefault();
441fd8e573a5df79014cfd7642eb6f0474b89b5736aNeil Fuller            // Android patch (http://b/28949992) end.
4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SimpleDateFormat f = new SimpleDateFormat();
4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!f.getTimeZone().equals(z))
4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: SimpleTimeZone should use TimeZone.getDefault()");
4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } finally {
4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TimeZone.setDefault(def);
4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4100302
4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4100302() {
4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale locales[] = {
4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale.CANADA, Locale.CANADA_FRENCH, Locale.CHINA,
4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale.CHINESE, Locale.ENGLISH, Locale.FRANCE, Locale.FRENCH,
4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale.GERMAN, Locale.GERMANY, Locale.ITALIAN, Locale.ITALY,
4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale.JAPAN, Locale.JAPANESE, Locale.KOREA, Locale.KOREAN,
4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale.PRC, Locale.SIMPLIFIED_CHINESE, Locale.TAIWAN,
4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale.TRADITIONAL_CHINESE, Locale.UK, Locale.US};
4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            boolean pass = true;
4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            for (int i = 0; i < 21; i++) {
4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Format format = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locales[i]);
4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                byte[] bytes;
4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ByteArrayOutputStream baos = new ByteArrayOutputStream();
4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ObjectOutputStream oos = new ObjectOutputStream(baos);
4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                oos.writeObject(format);
4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                oos.flush();
4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                baos.close();
4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                bytes = baos.toByteArray();
4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                Object o = ois.readObject();
4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (!format.equals(o)) {
4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    pass = false;
4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("DateFormat instance for locale " + locales[i] + " is incorrectly serialized/deserialized.");
4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    logln("DateFormat instance for locale " + locales[i] + " is OKAY.");
4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!pass)
4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: DateFormat serialization/equality bug");
4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (OptionalDataException e) {
4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + e);
4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (IOException e) {
4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + e);
4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ClassNotFoundException e) {
4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + e);
4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4101483
4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
4982d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4101483() {
5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat sdf = new SimpleDateFormat("z", Locale.US);
5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(DateFormat.TIMEZONE_FIELD);
5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = new Date(9234567890L);
5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer buf = new StringBuffer("");
5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sdf.format(d, buf, fp);
5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(sdf.format(d, buf, fp).toString());
5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("beginIndex = " + fp.getBeginIndex());
5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("endIndex = " + fp.getEndIndex());
5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (fp.getBeginIndex() == fp.getEndIndex())
5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: Empty field");
5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4103340
5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4138203
5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This bug really only works in Locale.US, since that's what the locale
5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * used for Date.toString() is.  Bug 4138203 reports that it fails on Korean
5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * NT; it would actually have failed on any non-US locale.  Now it should
5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * work on all locales.
5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
5202d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4103340() {
5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // choose a date that is the FIRST of some month
5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // and some arbitrary time
5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance();
5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(1997, 3, 1, 1, 1, 1);
5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = cal.getTime();
5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat df = new SimpleDateFormat("MMMM", Locale.US);
5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = d.toString();
5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer s2 = new StringBuffer("");
5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(0);
5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        s2 = df.format(d, s2, pos);
5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Date=" + s);
5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("DF=" + s2);
5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String substr = s2.substring(0,2);
5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (s.indexOf(substr) == -1)
5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          errln("Months should match");
5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4103341
5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
5442d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4103341() {
5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeZone saveZone = TimeZone.getDefault();
5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // {sfb} changed from adoptDefault to setDefault
5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TimeZone.setDefault(TimeZone.getTimeZone("CST"));
5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SimpleDateFormat simple = new SimpleDateFormat("MM/dd/yyyy HH:mm");
5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TimeZone temp = TimeZone.getDefault();
5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!simple.getTimeZone().equals(temp))
5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: SimpleDateFormat not using default zone");
5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } finally {
5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            TimeZone.setDefault(saveZone);
5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4104136
5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
5622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4104136() {
5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat sdf = new SimpleDateFormat();
5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "'time' hh:mm";
5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sdf.applyPattern(pattern);
5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: \"" + pattern + "\"");
5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String strings[] = {"time 10:30", "time 10:x", "time 10x"};
5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition ppos[] = {new ParsePosition(10), new ParsePosition(0), new ParsePosition(0)};
5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance();
5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(1970, Calendar.JANUARY, 1, 10, 30);
5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date dates[] = {cal.getTime(), new Date(-1), new Date(-1)};
5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 3; i++) {
5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String text = strings[i];
5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition finish = ppos[i];
5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date exp = dates[i];
5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition pos = new ParsePosition(0);
5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date d = sdf.parse(text, pos);
5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(" text: \"" + text + "\"");
5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(" index: %d" + pos.getIndex());
5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(" result: " + d);
5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (pos.getIndex() != finish.getIndex())
5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: Expected pos " + finish.getIndex());
5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!((d == null && exp.equals(new Date(-1))) || (d.equals(exp))))
5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln( "Fail: Expected result " + exp);
5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4104522
5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * CANNOT REPRODUCE
5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * According to the bug report, this test should throw a
5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * StringIndexOutOfBoundsException during the second parse.  However,
5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * this is not seen.
5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
5972d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4104522() {
5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat sdf = new SimpleDateFormat();
6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "'time' hh:mm";
6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        sdf.applyPattern(pattern);
6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern: \"" + pattern + "\"");
6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // works correctly
6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pp = new ParsePosition(0);
6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = "time ";
6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date dt = sdf.parse(text, pp);
6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" text: \"" + text + "\"" + " date: " + dt);
6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // works wrong
6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pp.setIndex(0);
6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        text = "time";
6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        dt = sdf.parse(text, pp);
6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(" text: \"" + text + "\"" + " date: " + dt);
6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4106807
6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
6182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4106807() {
6207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date dt;
6217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat df = DateFormat.getDateTimeInstance();
6227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat sdfs[] = {
6247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new SimpleDateFormat("yyyyMMddHHmmss"),
6257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new SimpleDateFormat("yyyyMMddHHmmss'Z'"),
6267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new SimpleDateFormat("yyyyMMddHHmmss''"),
6277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new SimpleDateFormat("yyyyMMddHHmmss'a''a'"),
6287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                new SimpleDateFormat("yyyyMMddHHmmss %")};
6297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String strings[] = {
6307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "19980211140000",
6317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "19980211140000",
6327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "19980211140000",
6337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "19980211140000a",
6347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                "19980211140000 "};
6357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        GregorianCalendar gc = new GregorianCalendar();
6367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeZone timeZone = TimeZone.getDefault();
6377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeZone gmt = (TimeZone) timeZone.clone();
6387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        gmt.setRawOffset(0);
6397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < 5; i++) {
6407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SimpleDateFormat format = sdfs[i];
6417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String dateString = strings[i];
6427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
6437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                format.setTimeZone(gmt);
6447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                dt = format.parse(dateString);
6457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // {sfb} some of these parses will fail purposely
6467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringBuffer fmtd = new StringBuffer("");
6487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                FieldPosition pos = new FieldPosition(0);
6497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                fmtd = df.format(dt, fmtd, pos);
6507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(fmtd.toString());
6517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                //logln(df.format(dt));
6527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                gc.setTime(dt);
6537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("" + gc.get(Calendar.ZONE_OFFSET));
6547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                StringBuffer s = new StringBuffer("");
6557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                s = format.format(dt, s, pos);
6567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln(s.toString());
6577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
6587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("No way Jose");
6597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
6607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
6617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /*
6647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      Synopsis: Chinese time zone CTT is not recogonized correctly.
6657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      Description: Platform Chinese Windows 95 - ** Time zone set to CST **
6667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      */
6677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4108407
6697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
6707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // {sfb} what to do with this one ??
6722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4108407() {
6747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
6757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // TODO user.timezone is a protected system property, catch securityexception and warn
6767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // if this is reenabled
6777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        long l = System.currentTimeMillis();
6787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("user.timezone = " + System.getProperty("user.timezone", "?"));
6797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Time Zone :" +
6807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           DateFormat.getDateInstance().getTimeZone().getID());
6817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Default format :" +
6827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           DateFormat.getDateInstance().format(new Date(l)));
6837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Full format :" +
6847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                           DateFormat.getDateInstance(DateFormat.FULL).format(new
6857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                                                                              Date(l)));
6867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("*** Set host TZ to CST ***");
6877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");
6887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        */
6897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
6907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
6917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
6927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4134203
6937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * SimpleDateFormat won't parse "GMT"
6947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
6952d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
6967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4134203() {
6977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String dateFormat = "MM/dd/yy HH:mm:ss zzz";
6987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat fmt = new SimpleDateFormat(dateFormat);
6997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition p0 = new ParsePosition(0);
7017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = fmt.parse("01/22/92 04:52:00 GMT", p0);
7027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(d.toString());
7037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(p0.equals(new ParsePosition(0)))
7047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: failed to parse 'GMT'");
7057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // In the failure case an exception is thrown by parse();
7067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // if no exception is thrown, the test passes.
7077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4151631
7117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * SimpleDateFormat incorrect handling of 2 single quotes in format()
7127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4151631() {
7157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern =
7167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            "'TO_DATE('''dd'-'MM'-'yyyy HH:mm:ss''' , ''DD-MM-YYYY HH:MI:SS'')'";
7177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("pattern=" + pattern);
7187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.US);
7197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer result = new StringBuffer("");
7207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(0);
7217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance();
7227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
7237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(1998, Calendar.JUNE, 30, 13, 30, 0);
7247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = cal.getTime();
7257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        result = format.format(d, result, pos);
7267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!result.toString().equals("TO_DATE('30-06-1998 13:30:00' , 'DD-MM-YYYY HH:MI:SS')")) {
7277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: result=" + result);
7287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
7297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("Pass: result=" + result);
7307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4151706
7357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * 'z' at end of date format throws index exception in SimpleDateFormat
7367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * CANNOT REPRODUCE THIS BUG ON 1.2FCS
7377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7382d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4151706() {
7407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String dateString = "Thursday, 31-Dec-98 23:00:00 GMT";
7417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat fmt = new SimpleDateFormat("EEEE, dd-MMM-yy HH:mm:ss z", Locale.US);
7427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.US);
7437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
7447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(1998, Calendar.DECEMBER, 31, 23, 0, 0);
7457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = new Date();
7467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
7477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            d = fmt.parse(dateString);
7487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // {sfb} what about next two lines?
7497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (d.getTime() != cal.getTime().getTime())
7507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Incorrect value: " + d);
7517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
7527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + e);
7537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer temp = new StringBuffer("");
7557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition pos = new FieldPosition(0);
7567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(dateString + " . " + fmt.format(d, temp, pos));
7577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @bug 4162071
7617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Cannot reproduce this bug under 1.2 FCS -- it may be a convoluted duplicate
7627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * of some other bug that has been fixed.
7637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4162071() {
7667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String dateString = "Thu, 30-Jul-1999 11:51:14 GMT";
7677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String format = "EEE', 'dd-MMM-yyyy HH:mm:ss z"; // RFC 822/1123
7687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat df = new SimpleDateFormat(format, Locale.US);
7697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
7707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date x = df.parse(dateString);
7717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer temp = new StringBuffer("");
7727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            FieldPosition pos = new FieldPosition(0);
7737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(dateString + " -> " + df.format(x, temp, pos));
7747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
7757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Parse format \"" + format + "\" failed.");
7767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
7777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
7787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
7807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * DateFormat shouldn't parse year "-1" as a two-digit year (e.g., "-1" . 1999).
7817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
7822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
7837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4182066() {
7847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat fmt = new SimpleDateFormat("MM/dd/yy", Locale.US);
7857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat dispFmt = new SimpleDateFormat("MMM dd yyyy HH:mm:ss GG", Locale.US);
7867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /* We expect 2-digit year formats to put 2-digit years in the right
7877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * window.  Out of range years, that is, anything less than "00" or
7887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * greater than "99", are treated as literal years.  So "1/2/3456"
7897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * becomes 3456 AD.  Likewise, "1/2/-3" becomes -3 AD == 2 BC.
7907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
7917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final String STRINGS[] =
7927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            {"02/29/00", "01/23/01", "04/05/-1", "01/23/-9", "11/12/1314", "10/31/1", "09/12/+1", "09/12/001",};
7937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int STRINGS_COUNT = STRINGS.length;
7947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
7957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = Calendar.getInstance();
7967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date FAIL_DATE = cal.getTime();
7977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
7987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(2000, Calendar.FEBRUARY, 29);
7997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d0 = cal.getTime();
8007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
8017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(2001, Calendar.JANUARY, 23);
8027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d1 = cal.getTime();
8037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
8047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(-1, Calendar.APRIL, 5);
8057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d2 = cal.getTime();
8067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
8077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(-9, Calendar.JANUARY, 23);
8087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d3 = cal.getTime();
8097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
8107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(1314, Calendar.NOVEMBER, 12);
8117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d4 = cal.getTime();
8127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
8137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(1, Calendar.OCTOBER, 31);
8147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d5 = cal.getTime();
8157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
8167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(1, Calendar.SEPTEMBER, 12);
8177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d7 = cal.getTime();
8187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date DATES[] = {d0, d1, d2, d3, d4, d5, FAIL_DATE, d7};
8197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String out = "";
8217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        boolean pass = true;
8227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < STRINGS_COUNT; ++i) {
8237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String str = STRINGS[i];
8247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date expected = DATES[i];
8257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Date actual = null;
8267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            try {
8277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                actual = fmt.parse(str);
8287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } catch (ParseException e) {
8297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                actual = FAIL_DATE;
8307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String actStr = "";
8327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ((actual.getTime()) == FAIL_DATE.getTime()) {
8337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                actStr += "null";
8347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
8357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Yuck: See j25
8367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                actStr = ((DateFormat) dispFmt).format(actual);
8377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (expected.getTime() == (actual.getTime())) {
8407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                out += str + " => " + actStr + "\n";
8417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
8427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                String expStr = "";
8437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (expected.getTime() == FAIL_DATE.getTime()) {
8447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    expStr += "null";
8457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                } else {
8467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    // Yuck: See j25
8477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    expStr = ((DateFormat) dispFmt).format(expected);
8487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
8497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                out += "FAIL: " + str + " => " + actStr + ", expected " + expStr + "\n";
8507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pass = false;
8517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
8527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pass) {
8547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            log(out);
8557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
8567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            err(out);
8577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
8617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * j32 {JDK Bug 4210209 4209272}
8627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * DateFormat cannot parse Feb 29 2000 when setLenient(false)
8637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
8642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
8657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test4210209() {
8667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "MMM d, yyyy";
8687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = new SimpleDateFormat(pattern, Locale.US);
8697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat disp = new SimpleDateFormat("MMM dd yyyy GG", Locale.US);
8707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar calx = fmt.getCalendar();
8727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calx.setLenient(false);
8737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar calendar = Calendar.getInstance();
8747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calendar.clear();
8757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        calendar.set(2000, Calendar.FEBRUARY, 29);
8767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = calendar.getTime();
8777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = fmt.format(d);
8787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(disp.format(d) + " f> " + pattern + " => \"" + s + "\"");
8797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
8807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        d = fmt.parse(s, pos);
8817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("\"" + s + "\" p> " + pattern + " => " +
8827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              (d!=null?disp.format(d):"null"));
8837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Parse pos = " + pos.getIndex() + ", error pos = " + pos.getErrorIndex());
8847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (pos.getErrorIndex() != -1) {
8857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("FAIL: Error index should be -1");
8867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
8877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // The underlying bug is in GregorianCalendar.  If the following lines
8897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // succeed, the bug is fixed.  If the bug isn't fixed, they will throw
8907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // an exception.
8917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        GregorianCalendar cal = new GregorianCalendar();
8927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.clear();
8937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.setLenient(false);
8947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        cal.set(2000, Calendar.FEBRUARY, 29); // This should work!
8957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        d = cal.getTime();
8967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("Attempt to set Calendar to Feb 29 2000: " + disp.format(d));
8977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
8987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
8992d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
9007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test714() {
9017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //TimeZone Offset
9027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeZone defaultTZ = TimeZone.getDefault();
9037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeZone PST = TimeZone.getTimeZone("PST");
9047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int defaultOffset = defaultTZ.getRawOffset();
9057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int PSTOffset = PST.getRawOffset();
9067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = new Date(978103543000l - (defaultOffset - PSTOffset));
9077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        d = new Date(d.getTime() - (defaultTZ.inDaylightTime(d) ? 3600000 : 0));
9087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = DateFormat.getDateTimeInstance(-1, DateFormat.MEDIUM, Locale.US);
9097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String tests = "7:25:43 AM";
9107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s = fmt.format(d);
9117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!s.equals(tests)) {
9127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail: " + s + " != " + tests);
9137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
9147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln("OK: " + s + " == " + tests);
9157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
9197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test_GEec() {
9207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class PatternAndResult {
9217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private String pattern;
9227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            private String result;
9237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            PatternAndResult(String pat, String res) {
9247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pattern = pat;
9257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                result = res;
9267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getPattern()  { return pattern; }
9287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String getResult()  { return result; }
9297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final PatternAndResult[] tests = {
9317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "dd MMM yyyy GGG",   "02 Jul 2008 AD" ),
9327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "dd MMM yyyy GGGGG", "02 Jul 2008 A" ),
9337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "e dd MMM yyyy",     "4 02 Jul 2008" ),
9347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "ee dd MMM yyyy",    "04 02 Jul 2008" ),
9357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "c dd MMM yyyy",     "4 02 Jul 2008" ),
9367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "cc dd MMM yyyy",    "4 02 Jul 2008" ),
9377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "eee dd MMM yyyy",   "Wed 02 Jul 2008" ),
9387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "EEE dd MMM yyyy",   "Wed 02 Jul 2008" ),
9397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "EE dd MMM yyyy",    "Wed 02 Jul 2008" ),
9407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "eeee dd MMM yyyy",  "Wednesday 02 Jul 2008" ),
9417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "eeeee dd MMM yyyy", "W 02 Jul 2008" ),
9427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "e ww YYYY",         "4 27 2008" ),
9437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new PatternAndResult( "c ww YYYY",         "4 27 2008" ),
9447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
9457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale loc = ULocale.ENGLISH;
9467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
9477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = new GregorianCalendar(tz, loc);
9487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MMM-dd", loc);
9497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for ( int i = 0; i < tests.length; i++ ) {
9507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            PatternAndResult item = tests[i];
9517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            dateFormat.applyPattern( item.getPattern() );
9527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.set(2008, 6, 2, 5, 0); // 2008 July 02 5 AM PDT
9537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            StringBuffer buf = new StringBuffer(32);
9547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            FieldPosition fp = new FieldPosition(DateFormat.YEAR_FIELD);
9557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            dateFormat.format(cal, buf, fp);
9567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ( buf.toString().compareTo(item.getResult()) != 0 ) {
9577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("for pattern " + item.getPattern() + ", expected " + item.getResult() + ", got " + buf );
9587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            ParsePosition pos = new ParsePosition(0);
9607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            dateFormat.parse( item.getResult(), cal, pos);
9617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int year = cal.get(Calendar.YEAR);
9627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int month = cal.get(Calendar.MONTH);
9637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            int day = cal.get(Calendar.DATE);
9647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if ( year != 2008 || month != 6 || day != 2 ) {
9657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("use pattern " + item.getPattern() + " to parse " + item.getResult() +
9667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        ", expected y2008 m6 d2, got " + year + " " + month + " " + day );
9677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
9707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final char kArabicZero = 0x0660;
9727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final char kHindiZero  = 0x0966;
9737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static final char kLatinZero  = 0x0030;
9747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
9767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestHindiArabicDigits()
9777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
9787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String s;
9797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        char first;
9807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String what;
9817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
9837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat df = DateFormat.getInstance(new GregorianCalendar(), new ULocale("hi_IN@numbers=deva"));
9847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            what = "Gregorian Calendar, hindi";
9857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = df.format(new Date(0)); /* 31/12/1969 */
9867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(what + "=" + s);
9877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = s.charAt(0);
9887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(first<kHindiZero || first>(kHindiZero+9)) {
9897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(what + "- wrong digit,  got " + s + " (integer digit value " + new Integer((int)first).toString());
9907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
9917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
9927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
9937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
9947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat df = DateFormat.getInstance(new IslamicCalendar(), new Locale("ar","IQ"));
9957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = df.format(new Date(0)); /* 21/10/1989 */
9967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            what = "Islamic Calendar, Arabic";
9977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(what + ": " + s);
9987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = s.charAt(0);
9997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(first<kArabicZero || first>(kArabicZero+9)) {
10007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(what + " wrong digit, got " + s + " (integer digit value " + new Integer((int)first).toString());
10017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
10057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat df = DateFormat.getInstance(new GregorianCalendar(), new Locale("ar","IQ"));
10067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = df.format(new Date(0)); /* 31/12/1969 */
10077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            what = "Gregorian,  ar_IQ, df.getInstance";
10087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(what + ": " + s);
10097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = s.charAt(0);
10107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(first<kArabicZero || first>(kArabicZero+9)) {
10117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(what + " wrong  digit but got " + s + " (integer digit value " + new Integer((int)first).toString());
10127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
10157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat df = DateFormat.getInstance(new GregorianCalendar(), new Locale("mt","MT"));
10167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = df.format(new Date(0)); /* 31/12/1969 */
10177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            what = "Gregorian,  mt_MT, df.getInstance";
10187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(what + ": " + s);
10197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = s.charAt(0);
10207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(first<kLatinZero || first>(kLatinZero+9)) {
10217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(what + " wrong  digit but got " + s + " (integer digit value " + new Integer((int)first).toString());
10227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
10267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat df = DateFormat.getInstance(new IslamicCalendar(), new Locale("ar","IQ"));
10277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = df.format(new Date(0)); /* 31/12/1969 */
10287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            what = "Islamic calendar, ar_IQ, df.getInstance";
10297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(what+ ": " + s);
10307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = s.charAt(0);
10317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(first<kArabicZero || first>(kArabicZero+9)) {
10327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(what + " wrong  digit but got " + s + " (integer digit value " + new Integer((int)first).toString());
10337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
10377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, new Locale("ar","IQ"));
10387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = df.format(new Date(0)); /* 31/12/1969 */
10397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            what = "ar_IQ, getDateTimeInstance";
10407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(what+ ": " + s);
10417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = s.charAt(0);
10427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(first<kArabicZero || first>(kArabicZero+9)) {
10437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(what + " wrong  digit but got " + s + " (integer digit value " + new Integer((int)first).toString());
10447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        {
10487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat df = DateFormat.getInstance(new JapaneseCalendar(), new Locale("ar","IQ"));
10497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            s = df.format(new Date(0)); /* 31/12/1969 */
10507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            what = "ar_IQ, Japanese Calendar, getInstance";
10517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(what+ ": " + s);
10527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            first = s.charAt(0);
10537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(first<kArabicZero || first>(kArabicZero+9)) {
10547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(what + " wrong  digit but got " + s + " (integer digit value " + new Integer((int)first).toString());
10557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Ticket#5683
10607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Some ICU4J 3.6 data files contain garbage data which prevent the code to resolve another
10617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // bundle as an alias.  zh_TW should be equivalent to zh_Hant_TW
10622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
10637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestT5683() {
10647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] aliasLocales = {
10657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new Locale("zh", "CN"),
10667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new Locale("zh", "TW"),
10677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new Locale("zh", "HK"),
10687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new Locale("zh", "SG"),
10697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new Locale("zh", "MO")
10707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
10717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale[] canonicalLocales = {
10737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new ULocale("zh_Hans_CN"),
10747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new ULocale("zh_Hant_TW"),
10757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new ULocale("zh_Hant_HK"),
10767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new ULocale("zh_Hans_SG"),
10777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new ULocale("zh_Hant_MO")
10787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
10797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = new Date(0);
10817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < aliasLocales.length; i++) {
10837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat dfAlias = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, aliasLocales[i]);
10847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            DateFormat dfCanonical = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, canonicalLocales[i]);
10857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String sAlias = dfAlias.format(d);
10877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String sCanonical = dfCanonical.format(d);
10887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!sAlias.equals(sCanonical)) {
10907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("Fail: The format result for locale " + aliasLocales[i] + " is different from the result for locale " + canonicalLocales[i]
10917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ": " + sAlias + "[" + aliasLocales[i] + "] / " + sCanonical + "[" + canonicalLocales[i] + "]");
10927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
10937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
10947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
10957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
10967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Note: The purpose of this test case is a little bit questionable. This test
10977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // case expects Islamic month name is different from Gregorian month name.
10987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // However, some locales (in this code, zh_CN) may intentionally use the same
10997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // month name for both Gregorian and Islamic calendars. See #9645.
11002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
11017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void Test5006GetShortMonths() throws Exception {
11027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Currently supported NLV locales
11037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale ENGLISH = new Locale("en", "US"); // We don't support 'en' alone
11047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale ARABIC = new Locale("ar", "");
11057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale CZECH = new Locale("cs", "");
11067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale GERMAN = new Locale("de", "");
11077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale GREEK = new Locale("el", "");
11087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale SPANISH = new Locale("es", "");
11097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale FRENCH = new Locale("fr", "");
11107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale HUNGARIAN = new Locale("hu", "");
11117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale ITALIAN = new Locale("it", "");
11127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale HEBREW = new Locale("iw", "");
11137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale JAPANESE = new Locale("ja", "");
11147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale KOREAN = new Locale("ko", "");
11157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale POLISH = new Locale("pl", "");
11167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale PORTUGUESE = new Locale("pt", "BR");
11177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale RUSSIAN = new Locale("ru", "");
11187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale TURKISH = new Locale("tr", "");
11197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale CHINESE_SIMPLIFIED = new Locale("zh", "CN");
11207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale CHINESE_TRADITIONAL = new Locale("zh", "TW");
11217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Locale[] locales = new Locale[] { ENGLISH, ARABIC, CZECH, GERMAN, GREEK, SPANISH, FRENCH,
11237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                HUNGARIAN, ITALIAN, HEBREW, JAPANESE, KOREAN, POLISH, PORTUGUESE, RUSSIAN, TURKISH,
11247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                CHINESE_SIMPLIFIED, CHINESE_TRADITIONAL };
11257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] islamicCivilTwelfthMonthLocalized = new String[locales.length];
11277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] islamicTwelfthMonthLocalized = new String[locales.length];
11287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String[] gregorianTwelfthMonthLocalized = new String[locales.length];
11297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locales.length; i++) {
11317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            Locale locale = locales[i];
11337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Islamic
11357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.util.Calendar islamicCivilCalendar = new com.ibm.icu.util.IslamicCalendar(locale);
11367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.text.SimpleDateFormat islamicCivilDateFormat = (com.ibm.icu.text.SimpleDateFormat) islamicCivilCalendar
11377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    .getDateTimeFormat(com.ibm.icu.text.DateFormat.FULL, -1, locale);
11387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.text.DateFormatSymbols islamicCivilDateFormatSymbols = islamicCivilDateFormat
11397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    .getDateFormatSymbols();
11407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] shortMonthsCivil = islamicCivilDateFormatSymbols.getShortMonths();
11427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String twelfthMonthLocalizedCivil = shortMonthsCivil[11];
11437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            islamicCivilTwelfthMonthLocalized[i] = twelfthMonthLocalizedCivil;
11457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.util.IslamicCalendar islamicCalendar = new com.ibm.icu.util.IslamicCalendar(locale);
11477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            islamicCalendar.setCivil(false);
11487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.text.SimpleDateFormat islamicDateFormat = (com.ibm.icu.text.SimpleDateFormat) islamicCalendar
11497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    .getDateTimeFormat(com.ibm.icu.text.DateFormat.FULL, -1, locale);
11507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.text.DateFormatSymbols islamicDateFormatSymbols = islamicDateFormat
11517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    .getDateFormatSymbols();
11527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String[] shortMonths = islamicDateFormatSymbols.getShortMonths();
11547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String twelfthMonthLocalized = shortMonths[11];
11557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            islamicTwelfthMonthLocalized[i] = twelfthMonthLocalized;
11577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Gregorian
11597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.util.Calendar gregorianCalendar = new com.ibm.icu.util.GregorianCalendar(
11607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    locale);
11617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.text.SimpleDateFormat gregorianDateFormat = (com.ibm.icu.text.SimpleDateFormat) gregorianCalendar
11627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    .getDateTimeFormat(com.ibm.icu.text.DateFormat.FULL, -1, locale);
11637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            com.ibm.icu.text.DateFormatSymbols gregorianDateFormatSymbols = gregorianDateFormat
11657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    .getDateFormatSymbols();
11667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            shortMonths = gregorianDateFormatSymbols.getShortMonths();
11677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            twelfthMonthLocalized = shortMonths[11];
11687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            gregorianTwelfthMonthLocalized[i] = twelfthMonthLocalized;
11707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
11727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Compare
11747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (int i = 0; i < locales.length; i++) {
11757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String gregorianTwelfthMonth = gregorianTwelfthMonthLocalized[i];
11777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String islamicCivilTwelfthMonth = islamicCivilTwelfthMonthLocalized[i];
11787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            String islamicTwelfthMonth = islamicTwelfthMonthLocalized[i];
11797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            logln(locales[i] + ": g:" + gregorianTwelfthMonth + ", ic:" + islamicCivilTwelfthMonth + ", i:"+islamicTwelfthMonth);
11817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (gregorianTwelfthMonth.equalsIgnoreCase(islamicTwelfthMonth)) {
11827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Simplified Chinese uses numeric month for both Gregorian/Islamic calendars
11837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (locales[i] != CHINESE_SIMPLIFIED) {
11847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln(locales[i] + ": gregorian and islamic are same: " + gregorianTwelfthMonth
11857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                          + ", " + islamicTwelfthMonth);
11867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
11897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (gregorianTwelfthMonth.equalsIgnoreCase(islamicCivilTwelfthMonth)) {
11907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                // Simplified Chinese uses numeric month for both Gregorian/Islamic calendars
11917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if (locales[i] != CHINESE_SIMPLIFIED) {
11927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln(locales[i] + ": gregorian and islamic-civil are same: " + gregorianTwelfthMonth
11937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                            + ", " + islamicCivilTwelfthMonth);
11947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                }
11957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
11967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if (!islamicTwelfthMonth.equalsIgnoreCase(islamicCivilTwelfthMonth)) {
11977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln(locales[i] + ": islamic-civil and islamic are NOT same: " + islamicCivilTwelfthMonth
11987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                        + ", " + islamicTwelfthMonth);
11997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12032d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
12047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestParsing() {
12057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = "EEE-WW-MMMM-yyyy";
12067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = "mon-02-march-2011";
12077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int expectedDay = 7;
12087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat format = new SimpleDateFormat(pattern);
12107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = GregorianCalendar.getInstance(Locale.US);
12117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pos = new ParsePosition(0);
12127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
12147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format.parse(text, cal, pos);
12157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (Exception e) {
12167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Fail parsing:  " + e);
12177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (cal.get(Calendar.DAY_OF_MONTH) != expectedDay) {
12207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("Parsing failed: day of month should be '7' with pattern: \"" + pattern + "\" for text: \"" + text + "\"");
12217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // Date formatting with Dangi calendar in en locale (#9987)
12252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
12267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestDangiFormat() {
12277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        DateFormat fmt = DateFormat.getDateInstance(DateFormat.MEDIUM, new ULocale("en@calendar=dangi"));
12287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String calType = fmt.getCalendar().getType();
12297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assertEquals("Incorrect calendar type used by the date format instance", "dangi", calType);
12307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        GregorianCalendar gcal = new GregorianCalendar();
12327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        gcal.set(2013, Calendar.MARCH, 1, 0, 0, 0);
12337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = gcal.getTime();
12347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String dangiDateStr = fmt.format(d);
1236f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        assertEquals("Bad date format", "Mo1 20, 2013", dangiDateStr);
12377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
12407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestT10110() {
12417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
12427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            SimpleDateFormat formatter = new SimpleDateFormat("Gy年M月d日E", new Locale("zh_Hans"));
12437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            /* Object parsed = */ formatter.parseObject("610000");
12447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch(ParseException pe) {
12467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
12477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        catch(Throwable t) {
12497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("ParseException not thrown for bad pattern! exception was: " + t.getLocalizedMessage());
12507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return;
12517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
12527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        errln("No exception thrown at all for bad pattern!");
12537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
12547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
12567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestT10239() {
12577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestDateFormatItem {
12597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String parseString;
12607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String pattern;
12617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String expectedResult;   // null indicates expected error
12627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // Simple constructor
12637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public TestDateFormatItem(String parString, String patt, String expResult) {
12647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pattern = patt;
12657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                parseString = parString;
12667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expectedResult = expResult;
12677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
12687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
12697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final TestDateFormatItem[] items = {
12717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        //                     parse String                 pattern                 expected result
12727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestDateFormatItem("1 Oct 13 2013",             "e MMM dd yyyy",        "1 Oct 13 2013"),
12737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestDateFormatItem("02 Oct 14 2013",            "ee MMM dd yyyy",       "02 Oct 14 2013"),
12747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestDateFormatItem("Tue Oct 15 2013",           "eee MMM dd yyyy",      "Tue Oct 15 2013"),
12757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestDateFormatItem("Wednesday  Oct 16 2013",    "eeee MMM dd yyyy",     "Wednesday Oct 16 2013"),
12767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestDateFormatItem("Th Oct 17 2013",            "eeeeee MMM dd yyyy",   "Th Oct 17 2013"),
12777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestDateFormatItem("Fr Oct 18 2013",            "EEEEEE MMM dd yyyy",   "Fr Oct 18 2013"),
12787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestDateFormatItem("S Oct 19 2013",             "eeeee MMM dd yyyy",    "S Oct 19 2013"),
12797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        new TestDateFormatItem("S Oct 20 2013",             "EEEEE MMM dd yyyy",    "S Oct 20 2013"),
12807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
12817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
12827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer result = new StringBuffer();
12837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = new Date();
12847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
12857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat sdfmt = new SimpleDateFormat();
12867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition p = new ParsePosition(0);
12877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (TestDateFormatItem item: items) {
12887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
12897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            sdfmt.setCalendar(cal);
12907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            sdfmt.applyPattern(item.pattern);
12917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result.setLength(0);
12927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            p.setIndex(0);
12937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            p.setErrorIndex(-1);
12947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            d = sdfmt.parse(item.parseString, p);
12957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(item.expectedResult == null) {
12967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(p.getErrorIndex() != -1)
12977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
12987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                else
12997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error: unexpected parse success..."+item.parseString + " should have failed");
13007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(p.getErrorIndex() != -1) {
13027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: parse error for string " +item.parseString + " against pattern " + item.pattern + " -- idx["+p.getIndex()+"] errIdx["+p.getErrorIndex()+"]");
13037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
13047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.setTime(d);
13067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = sdfmt.format(cal, result, new FieldPosition(0));
13077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(!result.toString().equalsIgnoreCase(item.expectedResult)) {
13087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: unexpected format result. expected - " + item.expectedResult + "  but result was - " + result);
13097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
13107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("formatted results match! - " + result.toString());
13117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
13127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
13147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestT10334() {
13187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String pattern = new String("'--: 'EEE-WW-MMMM-yyyy");
13197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        String text = new String("--mon-02-march-2011");
13207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat format = new SimpleDateFormat(pattern);
13217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1322bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        format.setBooleanAttribute(DateFormat.BooleanAttribute.PARSE_PARTIAL_LITERAL_MATCH, false);
13237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format.parse(text);
13257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("parse partial match did NOT fail in strict mode!");
13267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException pe) {
13277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // expected
13287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1330bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert        format.setBooleanAttribute(DateFormat.BooleanAttribute.PARSE_PARTIAL_LITERAL_MATCH, true);
13317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format.parse(text);
13337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException pe) {
13347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("parse partial match failure in lenient mode: " + pe.getLocalizedMessage());
13357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pattern = new String("YYYY MM dd");
13387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        text =    new String("2013 12 10");
13397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format.applyPattern(pattern);
13407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date referenceDate = null;
13417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            referenceDate = format.parse(text);
13437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException pe) {
13447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("unable to instantiate reference date: " + pe.getLocalizedMessage());
13457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        FieldPosition fp = new FieldPosition(0);
13487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pattern = new String("YYYY LL dd ee cc qq QQ");
13497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format.applyPattern(pattern);
13507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer formattedString = new StringBuffer();
13517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        formattedString = format.format(referenceDate, formattedString, fp);
13527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln("ref date: " + formattedString);
13537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        pattern = new String("YYYY LLL dd eee ccc qqq QQQ");
13567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        text = new String("2013 12 10 03 3 04 04");
13577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format.applyPattern(pattern);
13587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        logln(format.format(referenceDate));
13597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format.setBooleanAttribute(DateFormat.BooleanAttribute.PARSE_ALLOW_NUMERIC, true);
13617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition pp = new ParsePosition(0);
13627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format.parse(text, pp);
13637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int errorIdx = pp.getErrorIndex();
13647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (errorIdx != -1) {
13657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("numeric parse error at["+errorIdx+"] on char["+pattern.substring(errorIdx, errorIdx+1)+"] in pattern["+pattern+"]");
13677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format.setBooleanAttribute(DateFormat.BooleanAttribute.PARSE_ALLOW_NUMERIC, false);
13707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        format.parse(text);
13727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        errln("numeric parse did NOT fail in strict mode!");
13737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException pe) {
13747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // expected
13757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        /*
13787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         * test to verify new code (and improve code coverage) for normal quarter processing
13797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert         */
13807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        text = new String("2013 Dec 10 Thu Thu Q4 Q4");
13817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        try {
13827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            format.parse(text);
13837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } catch (ParseException pe) {
13847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            errln("normal quarter processing failed");
13857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
13867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
13887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
13907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public void TestT10619() {
13917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
13927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        class TestDateFormatLeniencyItem {
13937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public boolean leniency;
13947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String parseString;
13957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String pattern;
13967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public String expectedResult;   // null indicates expected error
13977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert             // Simple constructor
13987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            public TestDateFormatLeniencyItem(boolean len, String parString, String patt, String expResult) {
13997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                leniency = len;
14007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                pattern = patt;
14017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                parseString = parString;
14027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                expectedResult = expResult;
14037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
14057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        final TestDateFormatLeniencyItem[] items = {
14077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            //                             leniency    parse String       pattern                 expected result
14087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestDateFormatLeniencyItem(true,       "2008-Jan 02",     "yyyy-LLL. dd",         "2008-Jan. 02"),
14097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestDateFormatLeniencyItem(false,      "2008-Jan 03",     "yyyy-LLL. dd",         null),
14107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestDateFormatLeniencyItem(true,       "2008-Jan--04",    "yyyy-MMM' -- 'dd",     "2008-Jan -- 04"),
14117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestDateFormatLeniencyItem(false,      "2008-Jan--05",    "yyyy-MMM' -- 'dd",     null),
14127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestDateFormatLeniencyItem(true,       "2008-12-31",      "yyyy-mm-dd",           "2008-12-31"),
14137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestDateFormatLeniencyItem(false,      "6 Jan 05 2008",   "eee MMM dd yyyy",      null),
14147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            new TestDateFormatLeniencyItem(true,       "6 Jan 05 2008",   "eee MMM dd yyyy",      "Sat Jan 05 2008"),
14157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        };
14167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        StringBuffer result = new StringBuffer();
14187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Date d = new Date();
14197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
14207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        SimpleDateFormat sdfmt = new SimpleDateFormat();
14217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ParsePosition p = new ParsePosition(0);
14227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        for (TestDateFormatLeniencyItem item: items) {
14237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.clear();
14247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            sdfmt.setCalendar(cal);
14257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            sdfmt.applyPattern(item.pattern);
14267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            sdfmt.setLenient(item.leniency);
14277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result.setLength(0);
14287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            p.setIndex(0);
14297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            p.setErrorIndex(-1);
14307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            d = sdfmt.parse(item.parseString, p);
14317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(item.expectedResult == null) {
14327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                if(p.getErrorIndex() != -1)
14337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    continue;
14347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                else
14357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                    errln("error: unexpected parse success..."+item.parseString + " w/ lenient="+item.leniency+" should have failed");
14367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(p.getErrorIndex() != -1) {
14387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: parse error for string " +item.parseString + " -- idx["+p.getIndex()+"] errIdx["+p.getErrorIndex()+"]");
14397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                continue;
14407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            cal.setTime(d);
14427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            result = sdfmt.format(cal, result, new FieldPosition(0));
14437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            if(!result.toString().equalsIgnoreCase(item.expectedResult)) {
14447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                errln("error: unexpected format result. expected - " + item.expectedResult + "  but result was - " + result);
14457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            } else {
14467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert                logln("formatted results match! - " + result.toString());
14477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            }
14487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
14497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
14507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
14527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public void TestT10906()
14537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  {
14547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      String pattern = new String("MM-dd-yyyy");
14557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      String text = new String("06-10-2014");
14567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      SimpleDateFormat format = new SimpleDateFormat(pattern);
14577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      ParsePosition pp = new ParsePosition(-1);
14587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      try {
14597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          format.parse(text, pp);
14607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          int errorIdx = pp.getErrorIndex();
14617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          if (errorIdx == -1) {
14627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert              errln("failed to report invalid (negative) starting parse position");
14637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          }
14647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      } catch(StringIndexOutOfBoundsException e) {
14657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert          errln("failed to fix invalid (negative) starting parse position");
14667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
14677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
14687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1469f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1470f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    // Test case for numeric field format threading problem
14712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert    @Test
1472f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    public void TestT11363() {
1473f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1474f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        class TestThread extends Thread {
1475f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            SimpleDateFormat fmt;
1476f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Date d;
1477f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1478f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            TestThread(SimpleDateFormat fmt, Date d) {
1479f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                this.fmt = fmt;
1480f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                this.d = d;
1481f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1482f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1483f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            public void run() {
1484f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                String s0 = fmt.format(d);
1485f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                for (int i = 0; i < 1000; i++) {
1486f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    String s = fmt.format(d);
1487f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    if (!s0.equals(s)) {
1488f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                        errln("Result: " + s + ", Expected: " + s0);
1489f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                    }
1490f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                }
1491f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1492f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1493f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1494f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        SimpleDateFormat fmt0 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
1495f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1496f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        Thread[] threads = new Thread[10];
1497f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1498f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        GregorianCalendar cal = new GregorianCalendar(2014, Calendar.NOVEMBER, 5, 12, 34, 56);
1499f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        cal.set(Calendar.MILLISECOND, 777);
1500f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1501f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // calls format() once on the base object to trigger
1502f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        // lazy initialization stuffs.
1503f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        fmt0.format(cal.getTime());
1504f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1505f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (int i = 0; i < threads.length; i++) {
1506f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            // Add 1 to all fields to use different numbers in each thread
1507f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            cal.add(Calendar.YEAR, 1);
1508f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            cal.add(Calendar.MONTH, 1);
1509f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            cal.add(Calendar.DAY_OF_MONTH, 1);
1510f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            cal.add(Calendar.HOUR_OF_DAY, 1);
1511f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            cal.add(Calendar.MINUTE, 1);
1512f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            cal.add(Calendar.SECOND, 1);
1513f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            cal.add(Calendar.MILLISECOND, 1);
1514f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            Date d = cal.getTime();
1515f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            SimpleDateFormat fmt = (SimpleDateFormat)fmt0.clone();
1516f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            threads[i] = new TestThread(fmt, d);
1517f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1518f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1519f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Thread t : threads) {
1520f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            t.start();
1521f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1522f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert
1523f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        for (Thread t : threads) {
1524f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            try {
1525f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                t.join();
1526f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            } catch (InterruptedException e) {
1527f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert                errln(e.toString());
1528f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert            }
1529f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert        }
1530f716bda031dccdec5e47bb40e758c5901d209729Fredrik Roubert    }
15317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
1532