/*
 * Copyright (c) 1998, 2025, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @bug 4031502 4035301 4040996 4051765 4059654 4061476 4070502 4071197 4071385
 * 4073929 4083167 4086724 4092362 4095407 4096231 4096539 4100311 4103271
 * 4106136 4108764 4114578 4118384 4125881 4125892 4136399 4141665 4142933
 * 4145158 4145983 4147269 4149677 4162587 4165343 4166109 4167060 4173516
 * 4174361 4177484 4197699 4209071 4288792 4328747 4413980 4546637 4623997
 * 4685354 4655637 4683492 4080631 4080631 4167995 4340146 4639407
 * 4652815 4652830 4740554 4936355 4738710 4633646 4846659 4822110 4960642
 * 4973919 4980088 4965624 5013094 5006864 8152077 8347841 8347955
 * @library /java/text/testlib
 * @run junit CalendarRegression
 */
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
import java.util.function.Predicate;

import static java.util.Calendar.*;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.fail;

public class CalendarRegression {

    /*
    Synopsis: java.sql.Timestamp constructor works wrong on Windows 95

    ==== Here is the test ====
    ==== Here is the output of the test on Solaris or NT ====
    expected=1901-04-05 05:08:13.1234567
    result=1901-04-05 05:08:13.1234567

    ==== Here is the output of the test on Windows95 ====
    expected=1901-04-05 05:08:13.1234567
    result=1901-04-05 06:08:13.1234567
     */
    @Test
    public void Test4031502() {
        // This bug actually occurs on Windows NT as well, and doesn't
        // require the host zone to be set; it can be set in Java.
        String[] ids = TimeZone.availableIDs()
                .filter(Predicate.not(ZoneId.SHORT_IDS::containsKey))
                .toArray(String[]::new);
        boolean bad = false;
        for (int i = 0; i < ids.length; ++i) {
            TimeZone zone = TimeZone.getTimeZone(ids[i]);
            GregorianCalendar cal = new GregorianCalendar(zone);
            cal.clear();
            cal.set(1900, 15, 5, 5, 8, 13);
            if (cal.get(HOUR) != 5) {
                System.out.println(zone.getID() + " "
                        + //zone.useDaylightTime() + " "
                        + cal.get(DST_OFFSET) / (60 * 60 * 1000) + " "
                        + zone.getRawOffset() / (60 * 60 * 1000)
                        + ": HOUR = " + cal.get(HOUR));
                bad = true;
            }
        }
        if (bad) {
            fail("TimeZone problems with GC");
        }
    }

    @Test
    public void Test4035301() {
        GregorianCalendar c = new GregorianCalendar(98, 8, 7);
        GregorianCalendar d = new GregorianCalendar(98, 8, 7);
        if (c.after(d)
                || c.after(c)
                || c.before(d)
                || c.before(c)
                || !c.equals(c)
                || !c.equals(d)) {
            fail("Fail");
        }
    }

    @Test
    public void Test4040996() {
        String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
        SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);
        pdt.setStartRule(APRIL, 1, SUNDAY, 2 * 60 * 60 * 1000);
        pdt.setEndRule(OCTOBER, -1, SUNDAY, 2 * 60 * 60 * 1000);
        Calendar calendar = new GregorianCalendar(pdt);

        calendar.set(MONTH, 3);
        calendar.set(DAY_OF_MONTH, 18);
        calendar.set(SECOND, 30);

        System.out.println("MONTH: " + calendar.get(MONTH));
        System.out.println("DAY_OF_MONTH: "
                + calendar.get(DAY_OF_MONTH));
        System.out.println("MINUTE: " + calendar.get(MINUTE));
        System.out.println("SECOND: " + calendar.get(SECOND));

        calendar.add(SECOND, 6);
        //This will print out todays date for MONTH and DAY_OF_MONTH
        //instead of the date it was set to.
        //This happens when adding MILLISECOND or MINUTE also
        System.out.println("MONTH: " + calendar.get(MONTH));
        System.out.println("DAY_OF_MONTH: "
                + calendar.get(DAY_OF_MONTH));
        System.out.println("MINUTE: " + calendar.get(MINUTE));
        System.out.println("SECOND: " + calendar.get(SECOND));
        if (calendar.get(MONTH) != 3
                || calendar.get(DAY_OF_MONTH) != 18
                || calendar.get(SECOND) != 36) {
            fail("Fail: Calendar.add misbehaves");
        }
    }

    @Test
    public void Test4051765() {
        Calendar cal = Calendar.getInstance();
        cal.setLenient(false);
        cal.set(DAY_OF_WEEK, 0);
        try {
            cal.getTime();
            fail("Fail: DAY_OF_WEEK 0 should be disallowed");
        } catch (IllegalArgumentException e) {
            return;
        }
    }

    /* User error - no bug here
    @Test
    public void Test4059524() {
        // Create calendar for April 10, 1997
        GregorianCalendar calendar  = new GregorianCalendar();
        // print out a bunch of interesting things
        System.out.println("ERA: " + calendar.get(calendar.ERA));
        System.out.println("YEAR: " + calendar.get(calendar.YEAR));
        System.out.println("MONTH: " + calendar.get(calendar.MONTH));
        System.out.println("WEEK_OF_YEAR: " +
                           calendar.get(calendar.WEEK_OF_YEAR));
        System.out.println("WEEK_OF_MONTH: " +
                           calendar.get(calendar.WEEK_OF_MONTH));
        System.out.println("DATE: " + calendar.get(calendar.DATE));
        System.out.println("DAY_OF_MONTH: " +
                           calendar.get(calendar.DAY_OF_MONTH));
        System.out.println("DAY_OF_YEAR: " + calendar.get(calendar.DAY_OF_YEAR));
        System.out.println("DAY_OF_WEEK: " + calendar.get(calendar.DAY_OF_WEEK));
        System.out.println("DAY_OF_WEEK_IN_MONTH: " +
                           calendar.get(calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println("AM_PM: " + calendar.get(calendar.AM_PM));
        System.out.println("HOUR: " + calendar.get(calendar.HOUR));
        System.out.println("HOUR_OF_DAY: " + calendar.get(calendar.HOUR_OF_DAY));
        System.out.println("MINUTE: " + calendar.get(calendar.MINUTE));
        System.out.println("SECOND: " + calendar.get(calendar.SECOND));
        System.out.println("MILLISECOND: " + calendar.get(calendar.MILLISECOND));
        System.out.println("ZONE_OFFSET: "
                           + (calendar.get(calendar.ZONE_OFFSET)/(60*60*1000)));
        System.out.println("DST_OFFSET: "
                           + (calendar.get(calendar.DST_OFFSET)/(60*60*1000)));
        calendar  = new GregorianCalendar(1997,3,10);
        calendar.getTime();
        System.out.println("April 10, 1997");
        System.out.println("ERA: " + calendar.get(calendar.ERA));
        System.out.println("YEAR: " + calendar.get(calendar.YEAR));
        System.out.println("MONTH: " + calendar.get(calendar.MONTH));
        System.out.println("WEEK_OF_YEAR: " +
                           calendar.get(calendar.WEEK_OF_YEAR));
        System.out.println("WEEK_OF_MONTH: " +
                           calendar.get(calendar.WEEK_OF_MONTH));
        System.out.println("DATE: " + calendar.get(calendar.DATE));
        System.out.println("DAY_OF_MONTH: " +
                           calendar.get(calendar.DAY_OF_MONTH));
        System.out.println("DAY_OF_YEAR: " + calendar.get(calendar.DAY_OF_YEAR));
        System.out.println("DAY_OF_WEEK: " + calendar.get(calendar.DAY_OF_WEEK));
        System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(calendar.DAY_OF_WEEK_IN_MONTH));
        System.out.println("AM_PM: " + calendar.get(calendar.AM_PM));
        System.out.println("HOUR: " + calendar.get(calendar.HOUR));
        System.out.println("HOUR_OF_DAY: " + calendar.get(calendar.HOUR_OF_DAY));
        System.out.println("MINUTE: " + calendar.get(calendar.MINUTE));
        System.out.println("SECOND: " + calendar.get(calendar.SECOND));
        System.out.println("MILLISECOND: " + calendar.get(calendar.MILLISECOND));
        System.out.println("ZONE_OFFSET: "
                           + (calendar.get(calendar.ZONE_OFFSET)/(60*60*1000))); // in hours
        System.out.println("DST_OFFSET: "
                           + (calendar.get(calendar.DST_OFFSET)/(60*60*1000))); // in hours
    }
     */
    @Test
    public void Test4059654() {
        GregorianCalendar gc = new GregorianCalendar();

        gc.set(1997, 3, 1, 15, 16, 17); // April 1, 1997

        gc.set(HOUR, 0);
        gc.set(AM_PM, AM);
        gc.set(MINUTE, 0);
        gc.set(SECOND, 0);
        gc.set(MILLISECOND, 0);

        Date cd = gc.getTime();
        @SuppressWarnings("deprecation")
        Date exp = new Date(97, 3, 1, 0, 0, 0);
        if (!cd.equals(exp)) {
            fail("Fail: Calendar.set broken. Got " + cd + " Want " + exp);
        }
    }

    @Test
    public void Test4061476() {
        SimpleDateFormat fmt = new SimpleDateFormat("ddMMMyy", Locale.UK);
        Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT"),
                Locale.UK);
        fmt.setCalendar(cal);
        try {
            Date date = fmt.parse("29MAY97");
            cal.setTime(date);
        } catch (Exception e) {
        }
        cal.set(HOUR_OF_DAY, 13);
        System.out.println("Hour: " + cal.get(HOUR_OF_DAY));
        cal.add(HOUR_OF_DAY, 6);
        System.out.println("Hour: " + cal.get(HOUR_OF_DAY));
        if (cal.get(HOUR_OF_DAY) != 19) {
            fail("Fail: Want 19 Got " + cal.get(HOUR_OF_DAY));
        }
    }

    @Test
    public void Test4070502() {
        @SuppressWarnings("deprecation")
        Date d = getAssociatedDate(new Date(98, 0, 30));
        Calendar cal = new GregorianCalendar();
        cal.setTime(d);
        if (cal.get(DAY_OF_WEEK) == SATURDAY
                || cal.get(DAY_OF_WEEK) == SUNDAY) {
            fail("Fail: Want weekday Got " + d);
        }
    }

    /**
     * Get the associated date starting from a specified date
     * NOTE: the unnecessary "getTime()'s" below are a work-around for a
     * bug in jdk 1.1.3 (and probably earlier versions also)
     * <p>
     * @param date The date to start from
     */
    public static Date getAssociatedDate(Date d) {
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(d);
        //cal.add(field, amount); //<-- PROBLEM SEEN WITH field = DATE,MONTH
        // cal.getTime();  // <--- REMOVE THIS TO SEE BUG
        while (true) {
            int wd = cal.get(DAY_OF_WEEK);
            if (wd == SATURDAY || wd == SUNDAY) {
                cal.add(DATE, 1);
                // cal.getTime();
            } else {
                break;
            }
        }
        return cal.getTime();
    }

    @Test
    public void Test4071197() {
        dowTest(false);
        dowTest(true);
    }

    void dowTest(boolean lenient) {
        GregorianCalendar cal = new GregorianCalendar();
        cal.set(1997, AUGUST, 12); // Wednesday
        // cal.getTime(); // Force update
        cal.setLenient(lenient);
        cal.set(1996, DECEMBER, 1); // Set the date to be December 1, 1996
        int dow = cal.get(DAY_OF_WEEK);
        int min = cal.getMinimum(DAY_OF_WEEK);
        int max = cal.getMaximum(DAY_OF_WEEK);
        System.out.println(cal.getTime().toString());
        if (min != SUNDAY || max != SATURDAY) {
            fail("FAIL: Min/max bad");
        }
        if (dow < min || dow > max) {
            fail("FAIL: Day of week " + dow + " out of range");
        }
        if (dow != SUNDAY) {
            fail("FAIL: Day of week should be SUNDAY Got " + dow);
        }
    }

    @SuppressWarnings("deprecation")
    @Test
    public void Test4071385() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(98, JUNE, 24));
        cal.set(MONTH, NOVEMBER); // change a field
        System.out.println(cal.getTime().toString());
        if (!cal.getTime().equals(new Date(98, NOVEMBER, 24))) {
            fail("Fail");
        }
    }

    @Test
    public void Test4073929() {
        GregorianCalendar foo1 = new GregorianCalendar(1997, 8, 27);
        foo1.add(DAY_OF_MONTH, +1);
        int testyear = foo1.get(YEAR);
        int testmonth = foo1.get(MONTH);
        int testday = foo1.get(DAY_OF_MONTH);
        if (testyear != 1997
                || testmonth != 8
                || testday != 28) {
            fail("Fail: Calendar not initialized");
        }
    }

    @Test
    public void Test4083167() {
        TimeZone saveZone = TimeZone.getDefault();
        try {
            TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
            Date firstDate = new Date();
            Calendar cal = new GregorianCalendar();
            cal.setTime(firstDate);
            long firstMillisInDay = cal.get(HOUR_OF_DAY) * 3600000L
                    + cal.get(MINUTE) * 60000L
                    + cal.get(SECOND) * 1000L
                    + cal.get(MILLISECOND);

            System.out.println("Current time: " + firstDate.toString());

            for (int validity = 0; validity < 30; validity++) {
                Date lastDate = new Date(firstDate.getTime()
                        + (long) validity * 1000 * 24 * 60 * 60);
                cal.setTime(lastDate);
                long millisInDay = cal.get(HOUR_OF_DAY) * 3600000L
                        + cal.get(MINUTE) * 60000L
                        + cal.get(SECOND) * 1000L
                        + cal.get(MILLISECOND);
                if (firstMillisInDay != millisInDay) {
                    fail("Day has shifted " + lastDate);
                }
            }
        } finally {
            TimeZone.setDefault(saveZone);
        }
    }

    @Test
    public void Test4086724() {
        SimpleDateFormat date;
        TimeZone saveZone = TimeZone.getDefault();
        Locale saveLocale = Locale.getDefault();

        String summerTime = "British Summer Time";
        String standardTime = "Greenwich Mean Time";
        try {
            Locale.setDefault(Locale.UK);
            TimeZone.setDefault(TimeZone.getTimeZone("Europe/London"));
            date = new SimpleDateFormat("zzzz");

            Calendar cal = Calendar.getInstance();
            cal.set(1997, SEPTEMBER, 30);
            Date now = cal.getTime();
            String formattedDate = date.format(now);
            if (!formattedDate.equals(summerTime)) {
                fail("Wrong display name \"" + formattedDate
                        + "\" for <" + now + ">");
            }
            int weekOfYear = cal.get(WEEK_OF_YEAR);
            if (weekOfYear != 40) {
                fail("Wrong week-of-year " + weekOfYear
                        + " for <" + now + ">");
            }

            cal.set(1996, DECEMBER, 31);
            now = cal.getTime();
            formattedDate = date.format(now);
            if (!formattedDate.equals(standardTime)) {
                fail("Wrong display name \"" + formattedDate
                        + "\" for <" + now + ">");
            }
            weekOfYear = cal.get(WEEK_OF_YEAR);
            if (weekOfYear != 1) {
                fail("Wrong week-of-year " + weekOfYear
                        + " for <" + now + ">");
            }

            cal.set(1997, JANUARY, 1);
            now = cal.getTime();
            formattedDate = date.format(now);
            if (!formattedDate.equals(standardTime)) {
                fail("Wrong display name \"" + formattedDate
                        + "\" for <" + now + ">");
            }
            weekOfYear = cal.get(WEEK_OF_YEAR);
            if (weekOfYear != 1) {
                fail("Wrong week-of-year " + weekOfYear
                        + " for <" + now + ">");
            }

            cal.set(1997, JANUARY, 8);
            now = cal.getTime();
            formattedDate = date.format(now);
            if (!formattedDate.equals(standardTime)) {
                fail("Wrong display name \"" + formattedDate
                        + "\" for <" + now + ">");
            }
            weekOfYear = cal.get(WEEK_OF_YEAR);
            if (weekOfYear != 2) {
                fail("Wrong week-of-year " + weekOfYear
                        + " for <" + now + ">");
            }

        } finally {
            Locale.setDefault(saveLocale);
            TimeZone.setDefault(saveZone);
        }
    }

    @Test
    public void Test4092362() {
        GregorianCalendar cal1 = new GregorianCalendar(1997, 10, 11, 10, 20, 40);
        /*cal1.set( Calendar.YEAR, 1997 );
        cal1.set( Calendar.MONTH, 10 );
        cal1.set( Calendar.DATE, 11 );
        cal1.set( Calendar.HOUR, 10 );
        cal1.set( Calendar.MINUTE, 20 );
        cal1.set( Calendar.SECOND, 40 ); */

        System.out.println(" Cal1 = " + cal1.getTime().getTime());
        System.out.println(" Cal1 time in ms = " + cal1.get(MILLISECOND));
        for (int k = 0; k < 100; k++);

        GregorianCalendar cal2 = new GregorianCalendar(1997, 10, 11, 10, 20, 40);
        /*cal2.set( Calendar.YEAR, 1997 );
        cal2.set( Calendar.MONTH, 10 );
        cal2.set( Calendar.DATE, 11 );
        cal2.set( Calendar.HOUR, 10 );
        cal2.set( Calendar.MINUTE, 20 );
        cal2.set( Calendar.SECOND, 40 ); */

        System.out.println(" Cal2 = " + cal2.getTime().getTime());
        System.out.println(" Cal2 time in ms = " + cal2.get(MILLISECOND));
        if (!cal1.equals(cal2)) {
            fail("Fail: Milliseconds randomized");
        }
    }

    @Test
    public void Test4095407() {
        GregorianCalendar a = new GregorianCalendar(1997, NOVEMBER, 13);
        int dow = a.get(DAY_OF_WEEK);
        if (dow != THURSDAY) {
            fail("Fail: Want THURSDAY Got " + dow);
        }
    }

    @Test
    public void Test4096231() {
        TimeZone GMT = TimeZone.getTimeZone("GMT");
        TimeZone PST = TimeZone.getTimeZone("America/Los_Angeles");
        int sec = 0, min = 0, hr = 0, day = 1, month = 10, year = 1997;

        Calendar cal1 = new GregorianCalendar(PST);
        cal1.setTime(new Date(880698639000L));
        int p;
        System.out.println("PST 1 is: " + (p = cal1.get(HOUR_OF_DAY)));
        cal1.setTimeZone(GMT);
        // Issue 1: Changing the timezone doesn't change the
        //          represented time.
        int h1, h2;
        System.out.println("GMT 1 is: " + (h1 = cal1.get(HOUR_OF_DAY)));
        cal1.setTime(new Date(880698639000L));
        System.out.println("GMT 2 is: " + (h2 = cal1.get(HOUR_OF_DAY)));
        // Note: This test had a bug in it.  It wanted h1!=h2, when
        // what was meant was h1!=p.  Fixed this concurrent with fix
        // to 4177484.
        if (p == h1 || h1 != h2) {
            fail("Fail: Hour same in different zones");
        }

        Calendar cal2 = new GregorianCalendar(GMT);
        Calendar cal3 = new GregorianCalendar(PST);
        cal2.set(MILLISECOND, 0);
        cal3.set(MILLISECOND, 0);

        cal2.set(cal1.get(YEAR),
                cal1.get(MONTH),
                cal1.get(DAY_OF_MONTH),
                cal1.get(HOUR_OF_DAY),
                cal1.get(MINUTE),
                cal1.get(SECOND));

        long t1, t2, t3, t4;
        System.out.println("RGMT 1 is: " + (t1 = cal2.getTime().getTime()));
        cal3.set(year, month, day, hr, min, sec);
        System.out.println("RPST 1 is: " + (t2 = cal3.getTime().getTime()));
        cal3.setTimeZone(GMT);
        System.out.println("RGMT 2 is: " + (t3 = cal3.getTime().getTime()));
        cal3.set(cal1.get(YEAR),
                cal1.get(MONTH),
                cal1.get(DAY_OF_MONTH),
                cal1.get(HOUR_OF_DAY),
                cal1.get(MINUTE),
                cal1.get(SECOND));
        // Issue 2: Calendar continues to use the timezone in its
        //          constructor for set() conversions, regardless
        //          of calls to setTimeZone()
        System.out.println("RGMT 3 is: " + (t4 = cal3.getTime().getTime()));
        if (t1 == t2
                || t1 != t4
                || t2 != t3) {
            fail("Fail: Calendar zone behavior faulty");
        }
    }

    @Test
    public void Test4096539() {
        int[] y = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        for (int x = 0; x < 12; x++) {
            GregorianCalendar gc = new GregorianCalendar(1997, x, y[x]);
            int m1, m2;
            System.out.println((m1 = gc.get(MONTH) + 1) + "/"
                    + gc.get(DATE) + "/" + gc.get(YEAR)
                    + " + 1mo = ");

            gc.add(MONTH, 1);
            System.out.println((m2 = gc.get(MONTH) + 1) + "/"
                    + gc.get(DATE) + "/" + gc.get(YEAR)
            );
            int m = (m1 % 12) + 1;
            if (m2 != m) {
                fail("Fail: Want " + m + " Got " + m2);
            }
        }

    }

    @Test
    public void Test4100311() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesGregorianCalendar(locale)) {
            System.out.println("Skipping this test because locale is " + locale);
            return;
        }

        GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance();
        cal.set(YEAR, 1997);
        cal.set(DAY_OF_YEAR, 1);
        Date d = cal.getTime();             // Should be Jan 1
        System.out.println(d.toString());
        if (cal.get(DAY_OF_YEAR) != 1) {
            fail("Fail: DAY_OF_YEAR not set");
        }
    }

    @Test
    public void Test4103271() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesGregorianCalendar(locale)) {
            System.out.println("Skipping this test because locale is " + locale);
            return;
        }

        SimpleDateFormat sdf = new SimpleDateFormat();
        int numYears = 40, startYear = 1997, numDays = 15;
        String output, testDesc;
        GregorianCalendar testCal = (GregorianCalendar) Calendar.getInstance();
        testCal.clear();
        sdf.setCalendar(testCal);
        sdf.applyPattern("d MMM yyyy");
        boolean fail = false;
        for (int firstDay = 1; firstDay <= 2; firstDay++) {
            for (int minDays = 1; minDays <= 7; minDays++) {
                testCal.setMinimalDaysInFirstWeek(minDays);
                testCal.setFirstDayOfWeek(firstDay);
                testDesc = ("Test" + String.valueOf(firstDay) + String.valueOf(minDays));
                System.out.println(testDesc + " => 1st day of week="
                        + String.valueOf(firstDay)
                        + ", minimum days in first week="
                        + String.valueOf(minDays));
                for (int j = startYear; j <= startYear + numYears; j++) {
                    testCal.set(j, 11, 25);
                    for (int i = 0; i < numDays; i++) {
                        testCal.add(DATE, 1);
                        String calWOY;
                        int actWOY = testCal.get(WEEK_OF_YEAR);
                        if (actWOY < 1 || actWOY > 53) {
                            Date d = testCal.getTime();
                            calWOY = String.valueOf(actWOY);
                            output = testDesc + " - " + sdf.format(d) + "\t";
                            output = output + "\t" + calWOY;
                            System.out.println(output);
                            fail = true;
                        }
                    }
                }
            }
        }

        int[] DATA = {
            3, 52, 52, 52, 52, 52, 52, 52,
            1, 1, 1, 1, 1, 1, 1,
            2, 2, 2, 2, 2, 2, 2,
            4, 52, 52, 52, 52, 52, 52, 52,
            53, 53, 53, 53, 53, 53, 53,
            1, 1, 1, 1, 1, 1, 1};
        testCal.setFirstDayOfWeek(SUNDAY);
        for (int j = 0; j < DATA.length; j += 22) {
            System.out.println("Minimal days in first week = " + DATA[j]
                    + "  Week starts on Sunday");
            testCal.setMinimalDaysInFirstWeek(DATA[j]);
            testCal.set(1997, DECEMBER, 21);
            for (int i = 0; i < 21; ++i) {
                int woy = testCal.get(WEEK_OF_YEAR);
                System.out.println("\t" + testCal.getTime() + " " + woy);
                if (woy != DATA[j + 1 + i]) {
                    System.out.println(" ERROR");
                    fail = true;
                } else {
                    System.out.println(" OK");
                }

                // Now compute the time from the fields, and make sure we
                // get the same answer back.  This is a round-trip test.
                Date save = testCal.getTime();
                testCal.clear();
                testCal.set(YEAR, DATA[j + 1 + i] < 25 ? 1998 : 1997);
                testCal.set(WEEK_OF_YEAR, DATA[j + 1 + i]);
                testCal.set(DAY_OF_WEEK, (i % 7) + SUNDAY);
                if (!testCal.getTime().equals(save)) {
                    System.out.println("  Parse failed: " + testCal.getTime());
                    fail = true;
                } else {
                    System.out.println("  Passed");
                }

                testCal.setTime(save);
                testCal.add(DAY_OF_MONTH, 1);
            }
        }

        // Test field disambiguation with a few special hard-coded cases.
        // This shouldn't fail if the above cases aren't failing.
        @SuppressWarnings("deprecation")
        Object[] DISAM = {
            1998, 1, SUNDAY,
            new Date(97, DECEMBER, 28),
            1998, 2, SATURDAY,
            new Date(98, JANUARY, 10),
            1998, 53, THURSDAY,
            new Date(98, DECEMBER, 31),
            1998, 53, FRIDAY,
            new Date(99, JANUARY, 1)};
        testCal.setMinimalDaysInFirstWeek(3);
        testCal.setFirstDayOfWeek(SUNDAY);
        for (int i = 0; i < DISAM.length; i += 4) {
            int y = (Integer) DISAM[i];
            int woy = (Integer) DISAM[i + 1];
            int dow = (Integer) DISAM[i + 2];
            Date exp = (Date) DISAM[i + 3];
            testCal.clear();
            testCal.set(YEAR, y);
            testCal.set(WEEK_OF_YEAR, woy);
            testCal.set(DAY_OF_WEEK, dow);
            System.out.println(y + "-W" + woy + "-DOW" + dow);
            if (!testCal.getTime().equals(exp)) {
                System.out.println("  FAILED expect: " + exp + "\n            got: " + testCal.getTime());
                fail = true;
            } else {
                System.out.println("  OK");
            }
        }

        // Now try adding and rolling
        Object ADD = new Object();
        Object ROLL = new Object();
        @SuppressWarnings("deprecation")
        Object[] ADDROLL = {
            ADD, 1, new Date(98, DECEMBER, 25), new Date(99, JANUARY, 1),
            ADD, 1, new Date(97, DECEMBER, 28), new Date(98, JANUARY, 4),
            ROLL, 1, new Date(98, DECEMBER, 27), new Date(98, JANUARY, 4),
            ROLL, 1, new Date(99, DECEMBER, 24), new Date(99, DECEMBER, 31),
            ROLL, 1, new Date(99, DECEMBER, 25), new Date(99, JANUARY, 9)};
        testCal.setMinimalDaysInFirstWeek(3);
        testCal.setFirstDayOfWeek(SUNDAY);
        for (int i = 0; i < ADDROLL.length; i += 4) {
            int amount = (Integer) ADDROLL[i + 1];
            Date before = (Date) ADDROLL[i + 2];
            Date after = (Date) ADDROLL[i + 3];

            testCal.setTime(before);
            if (ADDROLL[i] == ADD) {
                testCal.add(WEEK_OF_YEAR, amount);
            } else {
                testCal.roll(WEEK_OF_YEAR, amount);
            }
            System.out.println((ADDROLL[i] == ADD ? "add(WOY," : "roll(WOY,")
                    + amount + ")\t     " + before
                    + "\n\t\t  => " + testCal.getTime());
            if (!after.equals(testCal.getTime())) {
                System.out.println("\tFAIL\n\t\texp: " + after);
                fail = true;
            } else {
                System.out.println("  OK");
            }

            testCal.setTime(after);
            if (ADDROLL[i] == ADD) {
                testCal.add(WEEK_OF_YEAR, -amount);
            } else {
                testCal.roll(WEEK_OF_YEAR, -amount);
            }
            System.out.println((ADDROLL[i] == ADD ? "add(WOY," : "roll(WOY,")
                    + (-amount) + ")     " + after
                    + "\n\t\t  => " + testCal.getTime());
            if (!before.equals(testCal.getTime())) {
                System.out.println("\tFAIL\n\t\texp: " + before);
                fail = true;
            } else {
                System.out.println("\tOK");
            }
        }

        if (fail) {
            fail("Fail: Week of year misbehaving");
        }
    }

    @Test
    public void Test4106136() {
        Locale saveLocale = Locale.getDefault();
        try {
            Locale[] locales = {Locale.CHINESE, Locale.CHINA};
            for (int i = 0; i < locales.length; ++i) {
                Locale.setDefault(locales[i]);
                int[] n = {
                    getAvailableLocales().length,
                    DateFormat.getAvailableLocales().length,
                    NumberFormat.getAvailableLocales().length};
                for (int j = 0; j < n.length; ++j) {
                    if (n[j] == 0) {
                        fail("Fail: No locales for " + locales[i]);
                    }
                }
            }
        } finally {
            Locale.setDefault(saveLocale);
        }
    }

    @SuppressWarnings("deprecation")
    @Test
    public void Test4108764() {
        Date d00 = new Date(97, MARCH, 15, 12, 00, 00);
        Date d01 = new Date(97, MARCH, 15, 12, 00, 56);
        Date d10 = new Date(97, MARCH, 15, 12, 34, 00);
        Date d11 = new Date(97, MARCH, 15, 12, 34, 56);
        Date epoch = new Date(70, JANUARY, 1);

        Calendar cal = Calendar.getInstance();
        cal.setTime(d11);

        cal.clear(MINUTE);
        System.out.println(cal.getTime().toString());
        if (!cal.getTime().equals(d01)) {
            fail("Fail: clear(MINUTE) broken");
        }

        cal.set(SECOND, 0);
        System.out.println(cal.getTime().toString());
        if (!cal.getTime().equals(d00)) {
            fail("Fail: set(SECOND, 0) broken");
        }

        cal.setTime(d11);
        cal.set(SECOND, 0);
        System.out.println(cal.getTime().toString());
        if (!cal.getTime().equals(d10)) {
            fail("Fail: set(SECOND, 0) broken #2");
        }

        cal.clear(MINUTE);
        System.out.println(cal.getTime().toString());
        if (!cal.getTime().equals(d00)) {
            fail("Fail: clear(MINUTE) broken #2");
        }

        cal.clear();
        System.out.println(cal.getTime().toString());
        if (!cal.getTime().equals(epoch)) {
            fail("Fail: clear() broken Want " + epoch);
        }
    }

    @SuppressWarnings("deprecation")
    @Test
    public void Test4114578() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesGregorianCalendar(locale)) {
            System.out.println("Skipping this test because locale is " + locale);
            return;
        }

        int ONE_HOUR = 60 * 60 * 1000;
        TimeZone saveZone = TimeZone.getDefault();
        boolean fail = false;
        try {
            TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
            Calendar cal = Calendar.getInstance();
            long onset = new Date(98, APRIL, 5, 1, 0).getTime() + ONE_HOUR;
            long cease = new Date(98, OCTOBER, 25, 0, 0).getTime() + 2 * ONE_HOUR;

            final int ADD = 1;
            final int ROLL = 2;

            long[] DATA = {
                // Start            Action   Amt    Expected_change
                onset - ONE_HOUR,   ADD,      1,     ONE_HOUR,
                onset,              ADD,     -1,    -ONE_HOUR,
                onset - ONE_HOUR,   ROLL,     1,     ONE_HOUR,
                onset,              ROLL,    -1,    -ONE_HOUR,
                cease - ONE_HOUR,   ADD,      1,     ONE_HOUR,
                cease,              ADD,     -1,    -ONE_HOUR,
                // roll() was changed to support wall-clock-based roll (JDK-8152077). The
                // time value may jump 2 hours by skipping non-existent wall-clock time.
                // Note that JDK-4114578 was a problem of add(), not roll().
                cease - ONE_HOUR,   ROLL,     1,     ONE_HOUR * 2,
                cease,              ROLL,    -1,    -ONE_HOUR * 2};

            for (int i = 0; i < DATA.length; i += 4) {
                Date date = new Date(DATA[i]);
                int amt = (int) DATA[i + 2];
                long expectedChange = DATA[i + 3];

                System.out.println(date.toString());
                cal.setTime(date);

                switch ((int) DATA[i + 1]) {
                    case ADD:
                        System.out.println(" add (HOUR," + (amt < 0 ? "" : "+") + amt + ")= ");
                        cal.add(HOUR, amt);
                        break;
                    case ROLL:
                        System.out.println(" roll(HOUR," + (amt < 0 ? "" : "+") + amt + ")= ");
                        cal.roll(HOUR, amt);
                        break;
                }

                System.out.println(cal.getTime().toString());

                long change = cal.getTime().getTime() - date.getTime();
                if (change != expectedChange) {
                    fail = true;
                    System.out.println(" FAIL");
                } else {
                    System.out.println(" OK");
                }
            }
        } finally {
            TimeZone.setDefault(saveZone);
        }

        if (fail) {
            fail("Fail: roll/add misbehaves around DST onset/cease");
        }
    }

    /**
     * Make sure maximum for HOUR field is 11, not 12.
     */
    @Test
    public void Test4118384() {
        Calendar cal = Calendar.getInstance();
        if (cal.getMaximum(HOUR) != 11
                || cal.getLeastMaximum(HOUR) != 11
                || cal.getActualMaximum(HOUR) != 11) {
            fail("Fail: maximum of HOUR field should be 11");
        }
    }

    /**
     * Check isLeapYear for BC years.
     */
    @Test
    public void Test4125881() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesGregorianCalendar(locale)) {
            System.out.println("Skipping this test because locale is " + locale);
            return;
        }

        GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance();
        DateFormat fmt = new SimpleDateFormat("MMMM d, yyyy G");
        cal.clear();
        for (int y = -20; y <= 10; ++y) {
            cal.set(ERA, y < 1 ? GregorianCalendar.BC : GregorianCalendar.AD);
            cal.set(YEAR, y < 1 ? 1 - y : y);
            System.out.println(y + " = " + fmt.format(cal.getTime()) + " "
                    + cal.isLeapYear(y));
            if (cal.isLeapYear(y) != ((y + 40) % 4 == 0)) {
                fail("Leap years broken");
            }
        }
    }

    /**
     * Prove that GregorianCalendar is proleptic (it used to cut off
     * at 45 BC, and not have leap years before then).
     */
    @Test
    public void Test4125892() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesGregorianCalendar(locale)) {
            System.out.println("Skipping this test because locale is " + locale);
            return;
        }

        GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance();
        DateFormat fmt = new SimpleDateFormat("MMMM d, yyyy G");
        cal.clear();
        cal.set(ERA, GregorianCalendar.BC);
        cal.set(YEAR, 81); // 81 BC is a leap year (proleptically)
        cal.set(MONTH, FEBRUARY);
        cal.set(DATE, 28);
        cal.add(DATE, 1);
        if (cal.get(DATE) != 29
                || !cal.isLeapYear(-80)) { // -80 == 81 BC
            fail("Calendar not proleptic");
        }
    }

    /**
     * Calendar and GregorianCalendar hashCode() methods need improvement.
     * Calendar needs a good implementation that subclasses can override,
     * and GregorianCalendar should use that implementation.
     */
    @Test
    public void Test4136399() {
        /* Note: This test is actually more strict than it has to be.
        * Technically, there is no requirement that unequal objects have
        * unequal hashes.  We only require equal objects to have equal hashes.
        * It is desirable for unequal objects to have distributed hashes, but
        * there is no hard requirement here.
        *
        * In this test we make assumptions about certain attributes of calendar
        * objects getting represented in the hash, which need not always be the
        * case (although it does work currently with the given test). */
        Calendar a = Calendar.getInstance();
        Calendar b = (Calendar) a.clone();
        if (a.hashCode() != b.hashCode()) {
            fail("Calendar hash code unequal for cloned objects");
        }

        b.setMinimalDaysInFirstWeek(7 - a.getMinimalDaysInFirstWeek());
        if (a.hashCode() == b.hashCode()) {
            fail("Calendar hash code ignores minimal days in first week");
        }
        b.setMinimalDaysInFirstWeek(a.getMinimalDaysInFirstWeek());

        b.setFirstDayOfWeek((a.getFirstDayOfWeek() % 7) + 1); // Next day
        if (a.hashCode() == b.hashCode()) {
            fail("Calendar hash code ignores first day of week");
        }
        b.setFirstDayOfWeek(a.getFirstDayOfWeek());

        b.setLenient(!a.isLenient());
        if (a.hashCode() == b.hashCode()) {
            fail("Calendar hash code ignores lenient setting");
        }
        b.setLenient(a.isLenient());

        // Assume getTimeZone() returns a reference, not a clone
        // of a reference -- this is true as of this writing
        b.getTimeZone().setRawOffset(a.getTimeZone().getRawOffset() + 60 * 60 * 1000);
        if (a.hashCode() == b.hashCode()) {
            fail("Calendar hash code ignores zone");
        }
        b.getTimeZone().setRawOffset(a.getTimeZone().getRawOffset());

        GregorianCalendar c = new GregorianCalendar();
        GregorianCalendar d = (GregorianCalendar) c.clone();
        if (c.hashCode() != d.hashCode()) {
            fail("GregorianCalendar hash code unequal for clones objects");
        }
        Date cutover = c.getGregorianChange();
        d.setGregorianChange(new Date(cutover.getTime() + 24 * 60 * 60 * 1000));
        if (c.hashCode() == d.hashCode()) {
            fail("GregorianCalendar hash code ignores cutover");
        }
    }

    /**
     * GregorianCalendar.equals() ignores cutover date
     */
    @Test
    public void Test4141665() {
        GregorianCalendar cal = new GregorianCalendar();
        GregorianCalendar cal2 = (GregorianCalendar) cal.clone();
        Date cut = cal.getGregorianChange();
        Date cut2 = new Date(cut.getTime() + 100 * 24 * 60 * 60 * 1000L); // 100 days later
        if (!cal.equals(cal2)) {
            fail("Cloned GregorianCalendars not equal");
        }
        cal2.setGregorianChange(cut2);
        if (cal.equals(cal2)) {
            fail("GregorianCalendar.equals() ignores cutover");
        }
    }

    /**
     * Bug states that ArrayIndexOutOfBoundsException is thrown by GregorianCalendar.roll()
     * when IllegalArgumentException should be.
     */
    @Test
    public void Test4142933() {
        GregorianCalendar calendar = new GregorianCalendar();
        try {
            calendar.roll(-1, true);
            fail("Test failed, no exception trown");
        } catch (IllegalArgumentException e) {
            // OK: Do nothing
            // logln("Test passed");
        } catch (Exception e) {
            fail("Test failed. Unexpected exception is thrown: " + e);
            e.printStackTrace();
        }
    }

    /**
     * GregorianCalendar handling of Dates Long.MIN_VALUE and Long.MAX_VALUE is
     * confusing; unless the time zone has a raw offset of zero, one or the
     * other of these will wrap.  We've modified the test given in the bug
     * report to therefore only check the behavior of a calendar with a zero raw
     * offset zone.
     */
    @Test
    public void Test4145158() {
        GregorianCalendar calendar = new GregorianCalendar();

        calendar.setTimeZone(TimeZone.getTimeZone("GMT"));

        calendar.setTime(new Date(Long.MIN_VALUE));
        int year1 = calendar.get(YEAR);
        int era1 = calendar.get(ERA);

        calendar.setTime(new Date(Long.MAX_VALUE));
        int year2 = calendar.get(YEAR);
        int era2 = calendar.get(ERA);

        if (year1 == year2 && era1 == era2) {
            fail("Fail: Long.MIN_VALUE or Long.MAX_VALUE wrapping around");
        }
    }

    /**
     * Maximum value for YEAR field wrong.
     */
    @Test
    public void Test4145983() {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
        Date[] DATES = {new Date(Long.MAX_VALUE), new Date(Long.MIN_VALUE)};
        for (int i = 0; i < DATES.length; ++i) {
            calendar.setTime(DATES[i]);
            int year = calendar.get(YEAR);
            int maxYear = calendar.getMaximum(YEAR);
            if (year > maxYear) {
                fail("Failed for " + DATES[i].getTime() + " ms: year="
                        + year + ", maxYear=" + maxYear);
            }
        }
    }

    /**
     * This is a bug in the validation code of GregorianCalendar.  As reported,
     * the bug seems worse than it really is, due to a bug in the way the bug
     * report test was written.  In reality the bug is restricted to the DAY_OF_YEAR
     * field. - liu 6/29/98
     */
    @Test
    public void Test4147269() {
        final String[] fieldName = {
            "ERA",
            "YEAR",
            "MONTH",
            "WEEK_OF_YEAR",
            "WEEK_OF_MONTH",
            "DAY_OF_MONTH",
            "DAY_OF_YEAR",
            "DAY_OF_WEEK",
            "DAY_OF_WEEK_IN_MONTH",
            "AM_PM",
            "HOUR",
            "HOUR_OF_DAY",
            "MINUTE",
            "SECOND",
            "MILLISECOND",
            "ZONE_OFFSET",
            "DST_OFFSET"};
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setLenient(false);
        @SuppressWarnings("deprecation")
        Date date = new Date(1996 - 1900, JANUARY, 3); // Arbitrary date
        for (int field = 0; field < FIELD_COUNT; field++) {
            calendar.setTime(date);
            // Note: In the bug report, getActualMaximum() was called instead
            // of getMaximum() -- this was an error.  The validation code doesn't
            // use getActualMaximum(), since that's too costly.
            int max = calendar.getMaximum(field);
            int value = max + 1;
            calendar.set(field, value);
            try {
                calendar.getTime(); // Force time computation
                // We expect an exception to be thrown. If we fall through
                // to the next line, then we have a bug.
                fail("Test failed with field " + fieldName[field]
                        + ", date before: " + date
                        + ", date after: " + calendar.getTime()
                        + ", value: " + value + " (max = " + max + ")");
            } catch (IllegalArgumentException e) {
            }
        }
    }

    /**
     * Reported bug is that a GregorianCalendar with a cutover of Date(Long.MAX_VALUE)
     * doesn't behave as a pure Julian calendar.
     * CANNOT REPRODUCE THIS BUG
     */
    @Test
    public void Test4149677() {
        TimeZone[] zones = {TimeZone.getTimeZone("GMT"),
            TimeZone.getTimeZone("America/Los_Angeles"),
            TimeZone.getTimeZone("Africa/Addis_Ababa")};
        for (int i = 0; i < zones.length; ++i) {
            GregorianCalendar calendar = new GregorianCalendar(zones[i]);

            // Make sure extreme values don't wrap around
            calendar.setTime(new Date(Long.MIN_VALUE));
            if (calendar.get(ERA) != GregorianCalendar.BC) {
                fail("Fail: Date(Long.MIN_VALUE) has an AD year in " + zones[i]);
            }
            calendar.setTime(new Date(Long.MAX_VALUE));
            if (calendar.get(ERA) != GregorianCalendar.AD) {
                fail("Fail: Date(Long.MAX_VALUE) has a BC year in " + zones[i]);
            }

            calendar.setGregorianChange(new Date(Long.MAX_VALUE));
            // to obtain a pure Julian calendar

            boolean is100Leap = calendar.isLeapYear(100);
            if (!is100Leap) {
                fail("test failed with zone " + zones[i].getID()
                + "\n cutover date is Date(Long.MAX_VALUE)"
                + "\n isLeapYear(100) returns: " + is100Leap);
            }
        }
    }

    /**
     * Calendar and Date HOUR broken.  If HOUR is out-of-range, Calendar
     * and Date classes will misbehave.
     */
    @Test
    public void Test4162587() {
        TimeZone savedTz = TimeZone.getDefault();
        TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
        TimeZone.setDefault(tz);
        GregorianCalendar cal = new GregorianCalendar(tz);
        Date d;

        try {
            for (int i = 0; i < 5; ++i) {
                if (i > 0) {
                    System.out.println("---");
                }

                cal.clear();
                cal.set(1998, APRIL, 5, i, 0);
                d = cal.getTime();
                String s0 = d.toString();
                System.out.println("0 " + i + ": " + s0);

                cal.clear();
                cal.set(1998, APRIL, 4, i + 24, 0);
                d = cal.getTime();
                String sPlus = d.toString();
                System.out.println("+ " + i + ": " + sPlus);

                cal.clear();
                cal.set(1998, APRIL, 6, i - 24, 0);
                d = cal.getTime();
                String sMinus = d.toString();
                System.out.println("- " + i + ": " + sMinus);

                if (!s0.equals(sPlus) || !s0.equals(sMinus)) {
                    fail("Fail: All three lines must match");
                }
            }
        } finally {
            TimeZone.setDefault(savedTz);
        }
    }

    /**
     * Adding 12 months behaves differently from adding 1 year
     */
    @Test
    public void Test4165343() {
        GregorianCalendar calendar = new GregorianCalendar(1996, FEBRUARY, 29);
        Date start = calendar.getTime();
        System.out.println("init date: " + start);
        calendar.add(MONTH, 12);
        Date date1 = calendar.getTime();
        System.out.println("after adding 12 months: " + date1);
        calendar.setTime(start);
        calendar.add(YEAR, 1);
        Date date2 = calendar.getTime();
        System.out.println("after adding one year : " + date2);
        if (date1.equals(date2)) {
            System.out.println("Test passed");
        } else {
            fail("Test failed");
        }
    }

    /**
     * GregorianCalendar.getActualMaximum() does not account for first day of week.
     */
    @Test
    public void Test4166109() {
        /* Test month:
        *
        *      March 1998
        * Su Mo Tu We Th Fr Sa
        *  1  2  3  4  5  6  7
        *  8  9 10 11 12 13 14
        * 15 16 17 18 19 20 21
        * 22 23 24 25 26 27 28
        * 29 30 31
         */
        boolean passed = true;
        int field = WEEK_OF_MONTH;

        GregorianCalendar calendar = new GregorianCalendar(Locale.US);
        calendar.set(1998, MARCH, 1);
        calendar.setMinimalDaysInFirstWeek(1);
        System.out.println("Date:  " + calendar.getTime());

        int firstInMonth = calendar.get(DAY_OF_MONTH);

        for (int firstInWeek = SUNDAY; firstInWeek <= SATURDAY; firstInWeek++) {
            calendar.setFirstDayOfWeek(firstInWeek);
            int returned = calendar.getActualMaximum(field);
            int expected = (31 + ((firstInMonth - firstInWeek + 7) % 7) + 6) / 7;

            System.out.println("First day of week = " + firstInWeek
                    + "  getActualMaximum(WEEK_OF_MONTH) = " + returned
                    + "  expected = " + expected
                    + ((returned == expected) ? "  ok" : "  FAIL"));

            if (returned != expected) {
                passed = false;
            }
        }
        if (!passed) {
            fail("Test failed");
        }
    }

    /**
     * Calendar.getActualMaximum(YEAR) works wrong.
     *
     * Note: Before 1.5, this test case assumed that
     * setGregorianChange didn't change object's date. But it was
     * changed. See 4928615.
     */
    @Test
    public void Test4167060() {
        int field = YEAR;
        DateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy G",
                Locale.US);

        int[][] dates = {
            // year, month, day of month
            {100, NOVEMBER, 1},
            {-99 /*100BC*/, JANUARY, 1},
            {1996, FEBRUARY, 29}};

        String[] id = {"Hybrid", "Gregorian", "Julian"};

        for (int k = 0; k < 3; ++k) {
            System.out.println("--- " + id[k] + " ---");

            for (int j = 0; j < dates.length; ++j) {
                GregorianCalendar calendar = new GregorianCalendar();
                if (k == 1) {
                    calendar.setGregorianChange(new Date(Long.MIN_VALUE));
                } else if (k == 2) {
                    calendar.setGregorianChange(new Date(Long.MAX_VALUE));
                }
                calendar.set(dates[j][0], dates[j][1], dates[j][2]);
                format.setCalendar((Calendar) calendar.clone());

                Date dateBefore = calendar.getTime();

                int maxYear = calendar.getActualMaximum(field);
                System.out.println("maxYear: " + maxYear + " for " + format.format(calendar.getTime()));
                System.out.println("date before: " + format.format(dateBefore));

                int[] years = {2000, maxYear - 1, maxYear, maxYear + 1};

                for (int i = 0; i < years.length; i++) {
                    boolean valid = years[i] <= maxYear;
                    calendar.set(field, years[i]);
                    Date dateAfter = calendar.getTime();
                    int newYear = calendar.get(field);
                    calendar.setTime(dateBefore); // restore calendar for next use

                    System.out.println(" Year " + years[i] + (valid ? " ok " : " bad")
                            + " => " + format.format(dateAfter));
                    if (valid && newYear != years[i]) {
                        fail("  FAIL: " + newYear + " should be valid; date, month and time shouldn't change");
                    } else if (!valid && newYear == years[i]) {
                        fail("  FAIL: " + newYear + " should be invalid");
                    }
                }
            }
        }
    }

    /**
     * Calendar.roll broken
     * This bug relies on the TimeZone bug 4173604 to also be fixed.
     */
    @Test
    public void Test4173516() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesGregorianCalendar(locale)) {
            System.out.println("Skipping this test because locale is " + locale);
            return;
        }

        int[][] fieldsList = {
            {1997, FEBRUARY, 1, 10, 45, 15, 900},
            {1999, DECEMBER, 22, 23, 59, 59, 999},
            // test case for 4960642 with default cutover
            {1582, OCTOBER, 4, 23, 59, 59, 999}};
        String[] fieldNames = {
            "ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH",
            "DAY_OF_MONTH", "DAY_OF_YEAR", "DAY_OF_WEEK", "DAY_OF_WEEK_IN_MONTH",
            "AM_PM", "HOUR", "HOUR_OF_DAY", "MINUTE", "SECOND", "MILLISECOND",
            "ZONE_OFFSET", "DST_OFFSET"};

        Locale savedLocale = Locale.getDefault();
        Locale.setDefault(Locale.US);
        int limit = 40;

        try {
            GregorianCalendar cal = new GregorianCalendar();

            cal.setTime(new Date(0));
            cal.roll(HOUR, 0x7F000000);
            cal.roll(HOUR, -0x7F000000);
            if (cal.getTime().getTime() != 0) {
                fail("Hour rolling broken. expected 0, got " + cal.getTime().getTime());
            }

            for (int op = 0; op < 2; ++op) {
                System.out.println("Testing GregorianCalendar " + (op == 0 ? "add" : "roll"));

                for (int field = 0; field < FIELD_COUNT; ++field) {
                    if (field != ZONE_OFFSET
                            && field != DST_OFFSET) {
                        for (int j = 0; j < fieldsList.length; ++j) {
                            int[] fields = fieldsList[j];
                            cal.clear();
                            cal.set(fields[0], fields[1], fields[2],
                                    fields[3], fields[4], fields[5]);
                            cal.set(MILLISECOND, fields[6]);
                            for (int i = 0; i < 2 * limit; i++) {
                                if (op == 0) {
                                    cal.add(field, i < limit ? 1 : -1);
                                } else {
                                    cal.roll(field, i < limit ? 1 : -1);
                                }
                            }

                            if (cal.get(YEAR) != fields[0]
                                    || cal.get(MONTH) != fields[1]
                                    || cal.get(DATE) != fields[2]
                                    || cal.get(HOUR_OF_DAY) != fields[3]
                                    || cal.get(MINUTE) != fields[4]
                                    || cal.get(SECOND) != fields[5]
                                    || cal.get(MILLISECOND) != fields[6]) {
                                fail("Field " + field
                                        + " (" + fieldNames[field]
                                        + ") FAIL, expected "
                                        + fields[0]
                                        + "/" + (fields[1] + 1)
                                        + "/" + fields[2]
                                        + " " + fields[3]
                                        + ":" + fields[4]
                                        + ":" + fields[5]
                                        + "." + fields[6]
                                        + ", got " + cal.get(YEAR)
                                        + "/" + (cal.get(MONTH) + 1)
                                        + "/" + cal.get(DATE)
                                        + " " + cal.get(HOUR_OF_DAY)
                                        + ":" + cal.get(MINUTE)
                                        + ":" + cal.get(SECOND)
                                        + "." + cal.get(MILLISECOND));

                                cal.clear();
                                cal.set(fields[0], fields[1], fields[2],
                                        fields[3], fields[4], fields[5]);
                                cal.set(MILLISECOND, fields[6]);
                                fail(cal.get(YEAR)
                                        + "/" + (cal.get(MONTH) + 1)
                                        + "/" + cal.get(DATE)
                                        + " " + cal.get(HOUR_OF_DAY)
                                        + ":" + cal.get(MINUTE)
                                        + ":" + cal.get(SECOND)
                                        + "." + cal.get(MILLISECOND));

                                long prev = cal.getTime().getTime();
                                for (int i = 0; i < 2 * limit; i++) {
                                    if (op == 0) {
                                        cal.add(field, i < limit ? 1 : -1);
                                    } else {
                                        cal.roll(field, i < limit ? 1 : -1);
                                    }
                                    long t = cal.getTime().getTime();
                                    long delta = t - prev;
                                    prev = t;
                                    fail((op == 0 ? "add(" : "roll(")
                                            + fieldNames[field] + ", "
                                            + (i < limit ? "+" : "-") + "1) => "
                                            + cal.get(YEAR)
                                            + "/" + (cal.get(MONTH) + 1)
                                            + "/" + cal.get(DATE)
                                            + " " + cal.get(HOUR_OF_DAY)
                                            + ":" + cal.get(MINUTE)
                                            + ":" + cal.get(SECOND)
                                            + "." + cal.get(MILLISECOND)
                                            + " d=" + delta);
                                }
                            }
                        }
                    }
                }
            }
        } finally {
            Locale.setDefault(savedLocale);
        }
    }

    @Test
    public void Test4174361() {
        GregorianCalendar calendar = new GregorianCalendar(1996, 1, 29);

        calendar.add(MONTH, 10);
        Date date1 = calendar.getTime();
        int d1 = calendar.get(DAY_OF_MONTH);

        calendar = new GregorianCalendar(1996, 1, 29);
        calendar.add(MONTH, 11);
        Date date2 = calendar.getTime();
        int d2 = calendar.get(DAY_OF_MONTH);

        if (d1 != d2) {
            fail("adding months to Feb 29 broken");
        }
    }

    /**
     * Calendar does not update field values when setTimeZone is called.
     */
    @Test
    public void Test4177484() {
        TimeZone PST = TimeZone.getTimeZone("America/Los_Angeles");
        TimeZone EST = TimeZone.getTimeZone("America/Panama");

        Calendar cal = Calendar.getInstance(PST, Locale.US);
        cal.clear();
        cal.set(1999, 3, 21, 15, 5, 0); // Arbitrary
        int h1 = cal.get(HOUR_OF_DAY);
        cal.setTimeZone(EST);
        int h2 = cal.get(HOUR_OF_DAY);
        if (h1 == h2) {
            fail("FAIL: Fields not updated after setTimeZone");
        }

        // getTime() must NOT change when time zone is changed.
        // getTime() returns zone-independent time in ms.
        cal.clear();
        cal.setTimeZone(PST);
        cal.set(HOUR_OF_DAY, 10);
        Date pst10 = cal.getTime();
        cal.setTimeZone(EST);
        Date est10 = cal.getTime();
        if (!pst10.equals(est10)) {
            fail("FAIL: setTimeZone changed time");
        }
    }

    /**
     * Week of year is wrong at the start and end of the year.
     */
    @Test
    public void Test4197699() {
        GregorianCalendar cal = new GregorianCalendar();
        cal.setFirstDayOfWeek(MONDAY);
        cal.setMinimalDaysInFirstWeek(4);
        DateFormat fmt = new SimpleDateFormat("E dd MMM yyyy  'DOY='D 'WOY='w");
        fmt.setCalendar(cal);

        int[] DATA = {
            2000, JANUARY, 1, 52,
            2001, DECEMBER, 31, 1};

        for (int i = 0; i < DATA.length;) {
            cal.set(DATA[i++], DATA[i++], DATA[i++]);
            int expWOY = DATA[i++];
            int actWOY = cal.get(WEEK_OF_YEAR);
            if (expWOY == actWOY) {
                System.out.println("Ok: " + fmt.format(cal.getTime()));
            } else {
                fail("FAIL: " + fmt.format(cal.getTime())
                        + ", expected WOY=" + expWOY);
                cal.add(DATE, -8);
                for (int j = 0; j < 14; ++j) {
                    cal.add(DATE, 1);
                    System.out.println(fmt.format(cal.getTime()));
                }
            }
        }
    }

    /**
     * Calendar DAY_OF_WEEK_IN_MONTH fields->time broken.  The problem
     * is in the field disambiguation code in GregorianCalendar.  This
     * code is supposed to choose the most recent set of fields
     * among the following:
     *
     *   MONTH + DAY_OF_MONTH
     *   MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
     *   MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
     *   DAY_OF_YEAR
     *   WEEK_OF_YEAR + DAY_OF_WEEK
     */
    @SuppressWarnings("deprecation")
    @Test
    public void Test4209071() {
        Calendar cal = Calendar.getInstance(Locale.US);

        // General field setting test
        int Y = 1995 - 1900;

        Object[] FIELD_DATA = {
            // Add new test cases as needed.

            // 0
            new int[]{}, new Date(Y, JANUARY, 1),
            // 1
            new int[]{MONTH, MARCH},
            new Date(Y, MARCH, 1),
            // 2
            new int[]{DAY_OF_WEEK, WEDNESDAY},
            new Date(Y, JANUARY, 4),
            // 3
            new int[]{DAY_OF_WEEK, THURSDAY,
                DAY_OF_MONTH, 18,},
            new Date(Y, JANUARY, 18),
            // 4
            new int[]{DAY_OF_MONTH, 18,
                DAY_OF_WEEK, THURSDAY,},
            new Date(Y, JANUARY, 18),
            // 5  (WOM -1 is in previous month)
            new int[]{DAY_OF_MONTH, 18,
                WEEK_OF_MONTH, -1,
                DAY_OF_WEEK, THURSDAY,},
            new Date(Y - 1, DECEMBER, 22),
            // 6
            new int[]{DAY_OF_MONTH, 18,
                WEEK_OF_MONTH, 4,
                DAY_OF_WEEK, THURSDAY,},
            new Date(Y, JANUARY, 26),
            // 7  (DIM -1 is in same month)
            new int[]{DAY_OF_MONTH, 18,
                DAY_OF_WEEK_IN_MONTH, -1,
                DAY_OF_WEEK, THURSDAY,},
            new Date(Y, JANUARY, 26),
            // 8
            new int[]{WEEK_OF_YEAR, 9,
                DAY_OF_WEEK, WEDNESDAY,},
            new Date(Y, MARCH, 1),
            // 9
            new int[]{MONTH, OCTOBER,
                DAY_OF_WEEK_IN_MONTH, 1,
                DAY_OF_WEEK, FRIDAY,},
            new Date(Y, OCTOBER, 6),
            // 10
            new int[]{MONTH, OCTOBER,
                WEEK_OF_MONTH, 2,
                DAY_OF_WEEK, FRIDAY,},
            new Date(Y, OCTOBER, 13),
            // 11
            new int[]{MONTH, OCTOBER,
                DAY_OF_MONTH, 15,
                DAY_OF_YEAR, 222,},
            new Date(Y, AUGUST, 10),
            // 12
            new int[]{DAY_OF_WEEK, THURSDAY,
                MONTH, DECEMBER,},
            new Date(Y, DECEMBER, 7)};

        for (int i = 0; i < FIELD_DATA.length; i += 2) {
            int[] fields = (int[]) FIELD_DATA[i];
            Date exp = (Date) FIELD_DATA[i + 1];

            cal.clear();
            cal.set(YEAR, Y + 1900);
            for (int j = 0; j < fields.length; j += 2) {
                cal.set(fields[j], fields[j + 1]);
            }

            Date act = cal.getTime();
            if (!act.equals(exp)) {
                fail("FAIL: Test " + (i / 2) + " got " + act
                        + ", want " + exp
                        + " (see test/java/util/Calendar/CalendarRegression.java");
            }
        }

        // Test specific failure reported in bug
        @SuppressWarnings("deprecation")
        Object[] DATA = {
            1, new Date(1997 - 1900, JANUARY, 5),
            4, new Date(1997 - 1900, JANUARY, 26),
            8, new Date(1997 - 1900, FEBRUARY, 23),
            -1, new Date(1997 - 1900, JANUARY, 26),
            -4, new Date(1997 - 1900, JANUARY, 5),
            -8, new Date(1996 - 1900, DECEMBER, 8)};
        for (int i = 0; i < DATA.length; i += 2) {
            cal.clear();
            cal.set(DAY_OF_WEEK_IN_MONTH,
                    ((Number) DATA[i]).intValue());
            cal.set(DAY_OF_WEEK, SUNDAY);
            cal.set(MONTH, JANUARY);
            cal.set(YEAR, 1997);
            Date actual = cal.getTime();
            if (!actual.equals(DATA[i + 1])) {
                fail("FAIL: Sunday " + DATA[i]
                        + " of Jan 1997 -> " + actual
                        + ", want " + DATA[i + 1]);
            }
        }
    }

    @Test
    public void Test4288792() throws Exception {
        TimeZone savedTZ = TimeZone.getDefault();
        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
        GregorianCalendar cal = new GregorianCalendar();
        try {
            for (int i = 1900; i < 2100; i++) {
                for (int j1 = 1; j1 <= 7; j1++) {
                    // Loop for MinimalDaysInFirstWeek: 1..7
                    for (int j = SUNDAY; j <= SATURDAY; j++) {
                        // Loop for FirstDayOfWeek: SUNDAY..SATURDAY
                        cal.clear();
                        cal.setMinimalDaysInFirstWeek(j1);
                        cal.setFirstDayOfWeek(j);
                        cal.set(YEAR, i);
                        int maxWeek = cal.getActualMaximum(WEEK_OF_YEAR);
                        cal.set(WEEK_OF_YEAR, maxWeek);
                        cal.set(DAY_OF_WEEK, j);

                        for (int k = 1; k < 7; k++) {
                            cal.add(DATE, 1);
                            int WOY = cal.get(WEEK_OF_YEAR);
                            if (WOY != maxWeek) {
                                fail(cal.getTime() + ",got=" + WOY
                                        + ",expected=" + maxWeek
                                        + ",min=" + j1 + ",first=" + j);
                            }
                        }

                        cal.add(DATE, 1);
                        int WOY = cal.get(WEEK_OF_YEAR);
                        if (WOY != 1) {
                            fail(cal.getTime() + ",got=" + WOY
                                    + ",expected=1,min=" + j1 + ",first" + j);
                        }
                    }
                }
            }
        } finally {
            TimeZone.setDefault(savedTZ);
        }
    }

    @Test
    public void Test4328747() throws Exception {
        Calendar c = Calendar.getInstance(Locale.US);
        c.clear();
        c.set(1966, 0, 1); // 1 jan 1966

        // serialize
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ObjectOutputStream s = new ObjectOutputStream(out);
        s.writeObject(c);
        s.flush();

        // deserialize
        ObjectInputStream t = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));
        Calendar result = (Calendar) t.readObject();

        // let recalculate fields with the same UTC time
        result.setTime(result.getTime());
        // Bug gives 1965 11 19
        if ((result.get(YEAR) != 1966) || (result.get(MONTH) != 0)
                || (result.get(DATE) != 1)) {
            fail("deserialized Calendar returned wrong date field(s): "
                    + result.get(YEAR) + "/" + result.get(MONTH) + "/" + result.get(DATE)
                    + ", expected 1966/0/1");
        }
    }

    /**
     * Test whether Calendar can be serialized/deserialized correctly
     * even if invalid/customized TimeZone is used.
     */
    @Test
    public void Test4413980() {
        TimeZone savedTimeZone = TimeZone.getDefault();
        try {
            boolean pass = true;
            String[] IDs = new String[]{"Undefined", "America/Los_Angeles", "US/Pacific",
                "GMT+3:00", "GMT-01:30"};
            for (int i = 0; i < IDs.length; i++) {
                TimeZone tz = TimeZone.getTimeZone(IDs[i]);
                TimeZone.setDefault(tz);

                Calendar c = Calendar.getInstance();

                // serialize
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                ObjectOutputStream s = new ObjectOutputStream(out);
                s.writeObject(c);
                s.flush();

                // deserialize
                ObjectInputStream t = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));

                if (!c.equals(t.readObject())) {
                    pass = false;
                    System.out.println("Calendar instance which uses TimeZone <"
                            + IDs[i] + "> is incorrectly serialized/deserialized.");
                } else {
                    System.out.println("Calendar instance which uses TimeZone <"
                            + IDs[i] + "> is correctly serialized/deserialized.");
                }
            }
            if (!pass) {
                fail("Fail: Calendar serialization/equality bug");
            }
        } catch (IOException | ClassNotFoundException e) {
            fail("Fail: " + e);
            e.printStackTrace();
        } finally {
            TimeZone.setDefault(savedTimeZone);
        }
    }

    /**
     * 4546637: Incorrect WEEK_OF_MONTH after changing First Day Of Week
     */
    @Test
    public void Test4546637() {
        GregorianCalendar day = new GregorianCalendar(2001, NOVEMBER, 04);
        day.setMinimalDaysInFirstWeek(1);
        int wom = day.get(WEEK_OF_MONTH);

        day.setFirstDayOfWeek(MONDAY);
        if (day.get(WEEK_OF_MONTH) != 1) {
            fail("Fail: 2001/11/4 must be the first week of the month.");
        }
    }

    /**
     * 4623997: GregorianCalendar returns bad WEEK_OF_YEAR
     */
    @Test
    public void Test4623997() {
        GregorianCalendar cal = new GregorianCalendar(2000, JANUARY, 1);

        int dow = cal.get(DAY_OF_WEEK);

        cal.setFirstDayOfWeek(MONDAY);
        cal.setMinimalDaysInFirstWeek(4);

        if (cal.get(WEEK_OF_YEAR) != 52) {
            fail("Fail: 2000/1/1 must be the 52nd week of the year.");
        }
    }

    /**
     * 4685354: Handling of Calendar fields setting state is broken
     *
     * <p>Need to use SimpleDateFormat to test because a call to
     * get(int) changes internal states of a Calendar.
     */
    @Test
    public void Test4685354() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesAsciiDigits(locale)
                || !TestUtils.usesGregorianCalendar(locale)) {
            System.out.println("Skipping this test because locale is " + locale);
            return;
        }

        Calendar calendar = Calendar.getInstance(Locale.US);
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd", Locale.US);
        String expected = "1999/12/31";
        Date t;
        String s;

        try {
            calendar.setTime(df.parse(expected));
        } catch (Exception e) {
            throw new RuntimeException("Unexpected parse exception", e);
        }

        t = calendar.getTime();
        calendar.set(DAY_OF_MONTH, 33);
        t = calendar.getTime();
        calendar.set(DAY_OF_MONTH, 0);
        s = df.format(calendar.getTime());
        if (!expected.equals(s)) {
            fail("DAY_OF_MONTH w/o ZONE_OFFSET: expected: " + expected + ", got: " + s);
        }

        // The same thing must work with ZONE_OFFSET set
        try {
            calendar.setTime(df.parse(expected));
        } catch (Exception e) {
            throw new RuntimeException("Unexpected parse exception", e);
        }
        t = calendar.getTime();
        calendar.set(ZONE_OFFSET, calendar.get(ZONE_OFFSET));
        calendar.set(DAY_OF_MONTH, 33);
        t = calendar.getTime();
        calendar.set(DAY_OF_MONTH, 0);
        s = df.format(calendar.getTime());
        if (!expected.equals(s)) {
            fail("DAY_OF_MONTH: expected: " + expected + ", got: " + s);
        }

        expected = "1999/12/24"; // 0th week of 2000
        calendar.clear();
        Date initialDate = null;
        try {
            initialDate = df.parse(expected);
            calendar.setTime(initialDate);
        } catch (Exception e) {
            throw new RuntimeException("Unexpected parse exception", e);
        }
        t = calendar.getTime();
        calendar.set(ZONE_OFFSET, calendar.get(ZONE_OFFSET));
        // jump to the next year
        calendar.set(WEEK_OF_YEAR, 100);
        t = calendar.getTime();
        calendar.set(WEEK_OF_YEAR, 0);
        s = df.format(calendar.getTime());
        if (!expected.equals(s)) {
            fail("WEEK_OF_YEAR: expected: " + expected + ", got: " + s);
        }
        // change the state back
        calendar.clear();
        calendar.setTime(initialDate);
        calendar.set(ZONE_OFFSET, calendar.get(ZONE_OFFSET));
        // jump to next month
        calendar.set(WEEK_OF_MONTH, 7);
        t = calendar.getTime();
        calendar.set(WEEK_OF_MONTH, 0);
        s = df.format(calendar.getTime());
        if (!expected.equals(s)) {
            fail("WEEK_OF_MONTH: expected: " + expected + ", got: " + s);
        }

        // Make sure the time fields work correctly.
        calendar.clear();
        df = new SimpleDateFormat("HH:mm:ss");
        TimeZone tz = TimeZone.getTimeZone("GMT");
        df.setTimeZone(tz);
        calendar.setTimeZone(tz);
        expected = "22:59:59";
        try {
            calendar.setTime(df.parse(expected));
        } catch (Exception e) {
            throw new RuntimeException("Unexpected parse exception", e);
        }
        t = calendar.getTime();
        // time should be 22:59:59.
        calendar.set(MINUTE, 61);
        // time should be 23:01:59.
        t = calendar.getTime();
        calendar.set(MINUTE, -1);
        // time should be back to 22:59:59.
        s = df.format(calendar.getTime());
        if (!expected.equals(s)) {
            fail("MINUTE: expected: " + expected + ", got: " + s);
        }
    }

    /**
     * 4655637: Calendar.set() for DAY_OF_WEEK does not return the right value
     *
     * <p>Need to use SimpleDateFormat to test because a call to
     * get(int) changes internal states of a Calendar.
     */
    @Test
    public void Test4655637() {
        Locale locale = Locale.getDefault();
        if (!TestUtils.usesGregorianCalendar(locale)) {
            System.out.println("Skipping this test because locale is " + locale);
            return;
        }

        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date(1029814211523L));
        cal.set(YEAR, 2001);
        Date t = cal.getTime();
        cal.set(MONTH, JANUARY);
        t = cal.getTime();

        cal.set(DAY_OF_MONTH, 8);
        t = cal.getTime();

        cal.set(DAY_OF_WEEK, MONDAY);
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd", Locale.US);
        String expected = "2001/01/08";
        String s = df.format(cal.getTime());
        if (!expected.equals(s)) {
            fail("expected: " + expected + ", got: " + s);
        }
    }

    /**
     * 4683492: Invalid value for MONTH in GregorianCalendar causes exception in getTime().
     *
     * <p>Need to use SimpleDateFormat to test because a call to
     * get(int) changes internal states of a Calendar.
     *
     * <p>This test case throws ArrayIndexOutOfBoundsException without the fix.
     */
    @Test
    public void Test4683492() {
        Calendar cal = new GregorianCalendar(2002, 3, 29, 10, 0, 0);
        cal.set(DAY_OF_WEEK, FRIDAY);
        cal.set(DAY_OF_WEEK_IN_MONTH, -1);
        cal.set(MONTH, 12);
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd", Locale.US);
        String expected = "2003/01/31";
        String s = df.format(cal.getTime());
        if (!expected.equals(s)) {
            fail("expected: " + expected + ", got: " + s);
        }
    }

    /**
     * 4080631: Calendar.hashCode is amazingly bad
     */
    @Test
    public void Test4080631() {
        Calendar cal = Calendar.getInstance();
        int h1 = cal.hashCode();
        cal.add(SECOND, +1);
        int h2 = cal.hashCode();
        Calendar cal2 = (Calendar) cal.clone();
        cal.add(MILLISECOND, +1);
        int h3 = cal.hashCode();
        System.out.println("hash code: h1=" + h1 + ", h2=" + h2 + ", h3=" + h3);
        if (h1 == h2 || h1 == h3 || h2 == h3) {
            fail("hash code is poor: hashCode=" + h1);
        }
        h2 = cal2.hashCode();
        cal.add(MILLISECOND, -1);
        int h4 = cal.hashCode();
        System.out.println("hash code: h2=" + h2 + ", h4=" + h4);
        if (cal.equals(cal2) && h2 != h4) {
            fail("broken hash code: h2=" + h2 + ", h4=" + h4);
        }
        int x = cal.getFirstDayOfWeek() + 3;
        if (x > SATURDAY) {
            x -= 7;
        }
        cal.setFirstDayOfWeek(x);
        int h5 = cal.hashCode();
        System.out.println("hash code: h4=" + h4 + ", h5=" + h5);
        if (h4 == h5) {
            fail("has code is poor with first day of week param: hashCode=" + h4);
        }
    }

    /**
     * 4125161: RFE: GregorianCalendar needs more era names (BCE and CE)
     */
    /*
    @Test
    public void Test4125161() throws Exception {
        Class gc = GregorianCalendar.class;
        Field f;
        int mod;
        f = gc.getDeclaredField("BCE");
        mod = f.getModifiers();
        if (!Modifier.isStatic(mod) || !Modifier.isFinal(mod)) {
            fail("BCE: wrong modifiers: " + mod);
        }
        f = gc.getDeclaredField("CE");
        mod = f.getModifiers();
        if (!Modifier.isStatic(mod) || !Modifier.isFinal(mod)) {
            fail("CE: wrong modifiers: " + mod);
        }
        if (GregorianCalendar.BCE != GregorianCalendar.BC
            || GregorianCalendar.CE != GregorianCalendar.AD) {
            fail("Wrong BCE and/or CE values");
        }
    }
     */
    /**
     * 4167995: GregorianCalendar.setGregorianChange() not to spec
     */
    @Test
    public void Test4167995() {
        Koyomi gc = new Koyomi(TimeZone.getTimeZone("GMT"));
        System.out.println("Hybrid: min date");
        gc.setTime(new Date(Long.MIN_VALUE));
        if (!gc.checkDate(292269055, DECEMBER, 2, SUNDAY)
                || !gc.checkFieldValue(ERA, GregorianCalendar.BC)) {
            fail(gc.getMessage());
        }
        System.out.println("Hybrid: max date");
        gc.setTime(new Date(Long.MAX_VALUE));
        if (!gc.checkDate(292278994, AUGUST, 17, SUNDAY)
                || !gc.checkFieldValue(ERA, GregorianCalendar.AD)) {
            fail(gc.getMessage());
        }

        gc.setGregorianChange(new Date(Long.MIN_VALUE));
        System.out.println("Gregorian: min date");
        gc.setTime(new Date(Long.MIN_VALUE));
        if (!gc.checkDate(292275056, MAY, 16, SUNDAY)
                || !gc.checkFieldValue(ERA, GregorianCalendar.BC)) {
            fail(gc.getMessage());
        }
        System.out.println("Gregorian: max date");
        gc.setTime(new Date(Long.MAX_VALUE));
        if (!gc.checkDate(292278994, AUGUST, 17, SUNDAY)
                || !gc.checkFieldValue(ERA, GregorianCalendar.AD)) {
            fail(gc.getMessage());
        }

        gc.setGregorianChange(new Date(Long.MAX_VALUE));
        System.out.println("Julian: min date");
        gc.setTime(new Date(Long.MIN_VALUE));
        if (!gc.checkDate(292269055, DECEMBER, 2, SUNDAY)
                || !gc.checkFieldValue(ERA, GregorianCalendar.BC)) {
            fail(gc.getMessage());
        }
        System.out.println("Julian: max date");
        gc.setTime(new Date(Long.MAX_VALUE));
        if (!gc.checkDate(292272993, JANUARY, 4, SUNDAY)
                || !gc.checkFieldValue(ERA, GregorianCalendar.AD)) {
            fail(gc.getMessage());
        }
    }

    /**
     * 4340146: Calendar.equals modifies state
     */
    @Test
    public void Test4340146() {
        Koyomi cal = new Koyomi();
        cal.clear();
        cal.set(2003, OCTOBER, 32);
        cal.equals(new Koyomi());
        if (!cal.checkInternalDate(2003, OCTOBER, 32)) {
            fail(cal.getMessage());
        }
        new Koyomi().equals(cal);
        if (!cal.checkInternalDate(2003, OCTOBER, 32)) {
            fail(cal.getMessage());
        }
    }

    /**
     * 4639407: GregorianCalendar doesn't work in non-lenient due to timezone bounds checking
     */
    @Test
    public void Test4639407() {
        // The following operations in non-lenient mode shouldn't
        // throw IllegalArgumentException.
        Koyomi cal = new Koyomi(TimeZone.getTimeZone("Pacific/Kiritimati"));
        cal.setLenient(false);
        cal.set(2003, OCTOBER, 10);
        cal.getTime();
        cal.setTimeZone(TimeZone.getTimeZone("Pacific/Tongatapu"));
        cal.set(2003, OCTOBER, 10);
        cal.getTime();
    }

    /**
     * 4652815: rolling week-of-year back hundreds of weeks changes year
     */
    @Test
    public void Test4652815() {
        Koyomi cal = new Koyomi(Locale.US);
        testRoll(cal, 2003, SEPTEMBER, 29);
        testRoll(cal, 2003, DECEMBER, 24);
        testRoll(cal, 1582, DECEMBER, 19);
        testRoll(cal, 1582, DECEMBER, 20);
    }

    private void testRoll(Koyomi cal, int year, int month, int dayOfMonth) {
        cal.clear();
        cal.set(year, month, dayOfMonth);
        cal.getTime(); // normalize fields
        System.out.println("Roll backwards from " + cal.toDateString());
        for (int i = 0; i < 1000; i++) {
            cal.roll(WEEK_OF_YEAR, -i);
            if (!cal.checkFieldValue(YEAR, year)) {
                fail(cal.getMessage());
            }
        }
        System.out.println("Roll forewards from " + cal.toDateString());
        for (int i = 0; i < 1000; i++) {
            cal.roll(WEEK_OF_YEAR, +i);
            if (!cal.checkFieldValue(YEAR, year)) {
                fail(cal.getMessage());
            }
        }
    }

    /**
     * 4652830: GregorianCalendar roll behaves unexpectedly for dates in BC era
     */
    @Test
    public void Test4652830() {
        Koyomi cal = new Koyomi(Locale.US);
        cal.clear();
        System.out.println("BCE 9-2-28 (leap year) roll DAY_OF_MONTH++ twice");
        cal.set(ERA, GregorianCalendar.BC);
        cal.set(9, FEBRUARY, 28);
        if (cal.getActualMaximum(DAY_OF_YEAR) != 366) {
            fail("    wrong actual max of DAY_OF_YEAR: got "
                    + cal.getActualMaximum(DAY_OF_YEAR) + " expected " + 366);
        }
        cal.roll(DAY_OF_MONTH, +1);
        if (!cal.checkFieldValue(ERA, GregorianCalendar.BC)
                || !cal.checkDate(9, FEBRUARY, 29)) {
            fail(cal.getMessage());
        }
        cal.roll(DAY_OF_MONTH, +1);
        if (!cal.checkFieldValue(ERA, GregorianCalendar.BC)
                || !cal.checkDate(9, FEBRUARY, 1)) {
            fail(cal.getMessage());
        }
    }

    /**
     * 4740554: GregorianCalendar.getActualMaximum is inconsistent with normalization
     */
    @Test
    public void Test4740554() {
        System.out.println("1999/(Feb+12)/1 should be normalized to 2000/Feb/1 for getActualMaximum");
        Koyomi cal = new Koyomi(Locale.US);
        cal.clear();
        cal.set(1999, FEBRUARY + 12, 1);
        if (!cal.checkActualMaximum(DAY_OF_YEAR, 366)) {
            fail(cal.getMessage());
        }
        if (!cal.checkActualMaximum(DAY_OF_MONTH, 29)) {
            fail(cal.getMessage());
        }
    }

    /**
     * 4936355: GregorianCalendar causes overflow/underflow with time of day calculation
     */
    @Test
    public void Test4936355() {
        Koyomi cal = new Koyomi(TimeZone.getTimeZone("GMT"));
        cal.clear();
        cal.set(1970, JANUARY, 1);
        checkTimeCalculation(cal, HOUR_OF_DAY, Integer.MAX_VALUE,
                (long) Integer.MAX_VALUE * 60 * 60 * 1000);

        cal.clear();
        cal.set(1970, JANUARY, 1);
        checkTimeCalculation(cal, HOUR, Integer.MAX_VALUE,
                (long) Integer.MAX_VALUE * 60 * 60 * 1000);

        cal.clear();
        cal.set(1970, JANUARY, 1);
        checkTimeCalculation(cal, MINUTE, Integer.MAX_VALUE,
                (long) Integer.MAX_VALUE * 60 * 1000);

        cal.clear();
        // Make sure to use Gregorian dates (before and after the
        // set() call) for testing
        cal.set(250000, JANUARY, 1);
        checkTimeCalculation(cal, HOUR_OF_DAY, Integer.MIN_VALUE,
                (long) Integer.MIN_VALUE * 60 * 60 * 1000);

        cal.clear();
        cal.set(250000, JANUARY, 1);
        checkTimeCalculation(cal, HOUR, Integer.MIN_VALUE,
                (long) Integer.MIN_VALUE * 60 * 60 * 1000);

        cal.clear();
        cal.set(250000, JANUARY, 1);
        checkTimeCalculation(cal, MINUTE, Integer.MIN_VALUE,
                (long) Integer.MIN_VALUE * 60 * 1000);
    }

    private void checkTimeCalculation(Koyomi cal, int field, int value, long expectedDelta) {
        long time = cal.getTimeInMillis();
        cal.set(field, value);
        long time2 = cal.getTimeInMillis();
        if ((time + expectedDelta) != time2) {
            String s = value == Integer.MAX_VALUE ? "Integer.MAX_VALUE" : "Integer.MIN_VALUE";
            fail("set(" + Koyomi.getFieldName(field) + ", " + s + ") failed." + " got " + time2
                    + ", expected " + (time + expectedDelta));
        }
    }

    /**
     * 4722650: Calendar.equals can throw an exception in non-lenient
     * (piggy-back tests for compareTo() which is new in 1.5)
     */
    @Test
    public void Test4722650() {
        Calendar cal1 = new GregorianCalendar();
        cal1.clear();
        Calendar cal2 = new GregorianCalendar();
        cal2.clear();
        cal2.setLenient(false);

        cal1.set(2003, OCTOBER, 31);
        cal2.set(2003, OCTOBER, 31);
        try {
            if (cal1.equals(cal2)) {
                fail("lenient and non-lenient shouldn't be equal. (2003/10/31)");
            }
            if (cal1.compareTo(cal2) != 0) {
                fail("cal1 and cal2 should represent the same time. (2003/10/31)");
            }
        } catch (IllegalArgumentException e) {
            fail("equals threw IllegalArugumentException with non-lenient");
        }

        cal1.set(2003, OCTOBER, 32);
        cal2.set(2003, OCTOBER, 32);
        try {
            if (cal1.equals(cal2)) {
                fail("lenient and non-lenient shouldn't be equal. (2003/10/32)");
            }
            if (cal1.compareTo(cal2) != 0) {
                fail("cal1 and cal2 should represent the same time. (2003/10/32)");
            }
        } catch (IllegalArgumentException e) {
            fail("equals threw IllegalArugumentException with non-lenient");
        }

        cal1 = Calendar.getInstance(Locale.of("th", "TH"));
        cal1.setTimeInMillis(0L);
        cal2 = Calendar.getInstance(Locale.US);
        cal2.setTimeInMillis(0L);
        if (cal1.equals(cal2)) {
            fail("Buddhist.equals(Gregorian) shouldn't be true. (millis=0)");
        }
        if (cal1.compareTo(cal2) != 0) {
            fail("cal1 (Buddhist) and cal2 (Gregorian) should represent the same time. (millis=0)");
        }
    }

    /**
     * 4738710: API: Calendar comparison methods should be improved
     */
    @Test
    public void Test4738710() {
        Calendar cal0 = new GregorianCalendar(2003, SEPTEMBER, 30);
        Comparable<Calendar> cal1 = new GregorianCalendar(2003, OCTOBER, 1);
        Calendar cal2 = new GregorianCalendar(2003, OCTOBER, 2);
        if (!(cal1.compareTo(cal0) > 0)) {
            fail("!(cal1 > cal0)");
        }
        if (!(cal1.compareTo(cal2) < 0)) {
            fail("!(cal1 < cal2)");
        }
        if (cal1.compareTo(new GregorianCalendar(2003, OCTOBER, 1)) != 0) {
            fail("cal1 != new GregorianCalendar(2003, OCTOBER, 1)");
        }

        if (cal0.after(cal2)) {
            fail("cal0 shouldn't be after cal2");
        }
        if (cal2.before(cal0)) {
            fail("cal2 shouldn't be before cal0");
        }

        if (cal0.after(0)) {
            fail("cal0.after() returned true with an Integer.");
        }
        if (cal0.before(0)) {
            fail("cal0.before() returned true with an Integer.");
        }
        if (cal0.after(null)) {
            fail("cal0.after() returned true with null.");
        }
        if (cal0.before(null)) {
            fail("cal0.before() returned true with null.");
        }
    }

    /**
     * 4633646: Setting WEEK_OF_MONTH to 1 results in incorrect date
     */
    @SuppressWarnings("deprecation")
    @Test
    public void Test4633646() {
        Koyomi cal = new Koyomi(Locale.US);
        cal.setTime(new Date(2002 - 1900, 1 - 1, 28));
        sub4633646(cal);

        cal.setLenient(false);
        cal.setTime(new Date(2002 - 1900, 1 - 1, 28));
        sub4633646(cal);

        cal = new Koyomi(Locale.US);
        cal.clear();
        cal.set(2002, JANUARY, 28);
        sub4633646(cal);

        cal.clear();
        cal.setLenient(false);
        cal.set(2002, JANUARY, 28);
        sub4633646(cal);
    }

    void sub4633646(Koyomi cal) {
        cal.getTime();
        cal.set(WEEK_OF_MONTH, 1);
        if (cal.isLenient()) {
            if (!cal.checkDate(2001, DECEMBER, 31)) {
                fail(cal.getMessage());
            }
            if (!cal.checkFieldValue(WEEK_OF_MONTH, 6)) {
                fail(cal.getMessage());
            }
        } else {
            try {
                Date d = cal.getTime();
                fail("didn't throw IllegalArgumentException in non-lenient");
            } catch (IllegalArgumentException e) {
            }
        }
    }

    /**
     * 4846659: Calendar: Both set() and roll() don't work for AM_PM time field
     * (Partially fixed only roll as of 1.5)
     */
    @Test
    public void Test4846659() {
        Koyomi cal = new Koyomi();
        cal.clear();
        cal.set(2003, OCTOBER, 31, 10, 30, 30);
        cal.getTime();
        // Test roll()
        cal.roll(AM_PM, +1); // should turn to PM
        if (!cal.checkFieldValue(HOUR_OF_DAY, 10 + 12)) {
            fail("roll: AM_PM didn't change to PM");
        }

        cal.clear();
        cal.set(2003, OCTOBER, 31, 10, 30, 30);
        cal.getTime();
        // Test set()
        cal.set(AM_PM, PM); // should turn to PM
        if (!cal.checkFieldValue(HOUR_OF_DAY, 10 + 12)) {
            fail("set: AM_PM didn't change to PM");
        }

        cal.clear();
        cal.set(2003, OCTOBER, 31, 10, 30, 30);
        cal.getTime();
        cal.set(AM_PM, PM);
        cal.set(HOUR, 9);
        if (!cal.checkFieldValue(HOUR_OF_DAY, 9 + 12)) {
            fail("set: both AM_PM and HOUT didn't change to PM");
        }
    }

    /**
     * 4822110: GregorianCalendar.get() returns an incorrect date after setFirstDayOfWeek()
     */
    @Test
    public void Test4822110() {
        Koyomi cal = new Koyomi(Locale.US);
        //    June 2003
        //  S  M Tu  W Th  F  S
        //  1  2  3  4  5  6  7
        //  8  9 10 11 12 13 14
        // 15 16 17 18 19 20 21
        // 22 23 24 25 26 27 28
        // 29 30
        cal.clear();
        // 6/1 to 6/7 should be the 1st week of June.
        cal.set(2003, JUNE, 2);
        cal.getTime();                  // Let cal calculate time.
        cal.setFirstDayOfWeek(MONDAY);
        // Now 6/2 to 6/8 should be the 2nd week of June. Sunday of
        // that week is 6/8.
        System.out.println("1: " + cal.get(WEEK_OF_MONTH) + ", " + cal.get(DAY_OF_MONTH));
        cal.set(DAY_OF_WEEK, SUNDAY);
        System.out.println("1st Sunday of June 2003 with FirstDayOfWeek=MONDAY");
        if (!cal.checkDate(2003, JUNE, 8)) {
            fail(cal.getMessage());
        }
    }

    /**
     * 4973919: Inconsistent GregorianCalendar hashCode before and after serialization
     */
    @Test
    public void Test4966499() throws Exception {
        GregorianCalendar date1 = new GregorianCalendar(2004, JANUARY, 7);

        // Serialize date1
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(date1);

        byte[] buffer = baos.toByteArray();

        // Deserialize it
        ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
        ObjectInputStream ois = new ObjectInputStream(bais);
        GregorianCalendar date2 = (GregorianCalendar) ois.readObject();

        if (!date1.equals(date2)) {
            fail("date1.equals(date2) != true");
        }
        if (date1.hashCode() != date2.hashCode()) {
            fail("inconsistent hashCode() value (before=0x"
                    + Integer.toHexString(date1.hashCode())
                    + ", after=0x" + Integer.toHexString(date2.hashCode()) + ")");
        }
    }

    /**
     * 4980088: GregorianCalendar.getActualMaximum doesn't throw exception
     */
    @Test
    public void Test4980088() {
        GregorianCalendar cal = new GregorianCalendar();
        try {
            int x = cal.getMaximum(100);
            fail("getMaximum(100) didn't throw an exception.");
        } catch (IndexOutOfBoundsException e) {
            System.out.println("getMaximum: " + e.getClass().getName() + ": " + e.getMessage());
        }

        try {
            int x = cal.getLeastMaximum(100);
            fail("getLeastMaximum(100) didn't throw an exception.");
        } catch (IndexOutOfBoundsException e) {
            System.out.println("getLeastMaximum: " + e.getClass().getName() + ": " + e.getMessage());
        }

        try {
            int x = cal.getActualMaximum(100);
            fail("getActualMaximum(100) didn't throw an exception.");
        } catch (IndexOutOfBoundsException e) {
            System.out.println("getActualMaximum: " + e.getClass().getName() + ": " + e.getMessage());
        }

        try {
            int x = cal.getMinimum(100);
            fail("getMinimum(100) didn't throw an exception.");
        } catch (IndexOutOfBoundsException e) {
            System.out.println("getMinimum: " + e.getClass().getName() + ": " + e.getMessage());
        }

        try {
            int x = cal.getGreatestMinimum(100);
            fail("getGreatestMinimum(100) didn't throw an exception.");
        } catch (IndexOutOfBoundsException e) {
            System.out.println("getGreatestMinimum: " + e.getClass().getName() + ": " + e.getMessage());
        }

        try {
            int x = cal.getActualMinimum(100);
            fail("getActualMinimum(100) didn't throw an exception.");
        } catch (IndexOutOfBoundsException e) {
            System.out.println("getActualMinimum: " + e.getClass().getName() + ": " + e.getMessage());
        }
    }

    /**
     * 4965624: GregorianCalendar.isLeapYear(1000) returns incorrect value
     */
    @Test
    public void Test4965624() {
        // 5013094: This test case needs to use "GMT" to specify
        // Gregorian cutover dates.
        TimeZone savedZone = TimeZone.getDefault();
        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
        try {
            Map<Date, Boolean> data = new HashMap<>();
            data.put(getGregorianDate(999, OCTOBER, 1), Boolean.FALSE);
            data.put(getGregorianDate(1000, JANUARY, 1), Boolean.FALSE);
            data.put(getGregorianDate(1000, FEBRUARY, 1), Boolean.FALSE);
            data.put(getGregorianDate(1000, FEBRUARY, 28), Boolean.FALSE);
            data.put(getGregorianDate(1000, MARCH, 1), Boolean.TRUE);
            data.put(getGregorianDate(1001, JANUARY, 1), Boolean.TRUE);
            data.put(getGregorianDate(1001, JANUARY, 6), Boolean.TRUE);
            data.put(getGregorianDate(1001, MARCH, 1), Boolean.TRUE);

            data.keySet().forEach(d -> {
                boolean expected = data.get(d);
                GregorianCalendar cal = new GregorianCalendar();
                cal.setGregorianChange(d);
                if (cal.isLeapYear(1000) != expected) {
                    fail("isLeapYear(1000) returned " + cal.isLeapYear(1000)
                            + " with cutover date (Julian) " + d);
                }
            });
        } finally {
            TimeZone.setDefault(savedZone);
        }
    }

    // Note that we can't use Date to produce Gregorian calendar dates
    // before the default cutover date.
    static Date getGregorianDate(int year, int month, int dayOfMonth) {
        GregorianCalendar g = new GregorianCalendar();
        // Make g a pure Gregorian calendar
        g.setGregorianChange(new Date(Long.MIN_VALUE));
        g.clear();
        g.set(year, month, dayOfMonth);
        return g.getTime();
    }

    /**
     * 5006864: Define the minimum value of DAY_OF_WEEK_IN_MONTH as 1
     */
    @Test
    public void Test5006864() {
        GregorianCalendar cal = new GregorianCalendar();
        int min = cal.getMinimum(DAY_OF_WEEK_IN_MONTH);
        if (min != 1) {
            fail("GregorianCalendar.getMinimum(DAY_OF_WEEK_IN_MONTH) returned "
                    + min + ", expected 1.");
        }
        min = cal.getGreatestMinimum(DAY_OF_WEEK_IN_MONTH);
        if (min != 1) {
            fail("GregorianCalendar.getGreatestMinimum(DAY_OF_WEEK_IN_MONTH) returned "
                    + min + ", expected 1.");
        }
    }
}
