/*
 * 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 4023247 4027685 4032037 4072029 4073003 4118010 4120606 4133833
 *      4136916 6274757 6314387 8347841
 * @run junit DateRegression
 */

import java.util.*;

import org.junit.jupiter.api.Test;

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

@SuppressWarnings("deprecation")
public class DateRegression {

    /**
     * @bug 4023247
     */
    @Test
    public void Test4023247() {
        Date d1 = new Date(0);
        Date d2 = new Date(0);

        d1.setYear(96);
        d1.setMonth(11);
        d1.setDate(22);
        d1.setHours(0);
        d1.setMinutes(0);
        d1.setSeconds(0);

        d2.setYear(96);
        d2.setMonth(11);
        d2.setDate(22);
        d2.setHours(0);
        d2.setMinutes(0);
        d2.setSeconds(0);

        if (d1.hashCode() != d2.hashCode())
            fail("Fail: Date hashCode misbehaves");
    }

    /**
     * @bug 4027685
     */
    @Test
    public void Test4027685() {
        // Should be 01/16/97 00:00:00
        Date nite = new Date("16-JAN-97 12:00 AM");
        // Should be 01/16/97 12:00:00
        Date noon = new Date("16-JAN-97 12:00 PM");

        System.out.println("Midnight = " + nite + ", Noon = " + noon);
        if (!nite.equals(new Date(97, Calendar.JANUARY, 16, 0, 0)) ||
            !noon.equals(new Date(97, Calendar.JANUARY, 16, 12, 0)))
            fail("Fail: Nite/Noon confused");
    }

    /**
     * @bug 4032037
     */
    @Test
    public void Test4032037() {
        Date ref = new Date(97, 1, 10);
        Date d = new Date(Date.parse("2/10/97"));
        System.out.println("Date.parse(2/10/97) => " + d);
        if (!d.equals(ref)) fail("Fail: Want " + ref + " Got " + d);
        d = new Date(Date.parse("10 feb 1997"));
        System.out.println("Date.parse(10 feb 1997) => " + d);
        if (!d.equals(ref)) fail("Fail: Want " + ref + " Got " + d);
        d = new Date("2/10/97");
        System.out.println("Date(2/10/97) => " + d);
        if (!d.equals(ref)) fail("Fail: Want " + ref + " Got " + d);
        d = new Date("10 feb 1997");
        System.out.println("Date(10 feb 1997) => " + d);
        if (!d.equals(ref)) fail("Fail: Want " + ref + " Got " + d);
    }

    /**
     * @bug 4072029
     */
    @Test
    public void Test4072029() {
        TimeZone saveZone = TimeZone.getDefault();

        try {
            TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
            Date now = new Date();
            String s = now.toString();
            Date now2 = new Date(now.toString());
            String s2 = now2.toString(); // An hour's difference

            if (!s.equals(s2) ||
                Math.abs(now.getTime() - now2.getTime()) > 60000 /*one min*/) {
                fail("Fail: Roundtrip toString/parse");
            }
        }
        finally {
            TimeZone.setDefault(saveZone);
        }
    }

    /**
     * @bug 4073003
     */
    @Test
    public void Test4073003() {
        Date d = new Date(Date.parse("01/02/1984"));
        if (!d.equals(new Date(84, 0, 2)))
            fail("Fail: Want 1/2/1984 Got " + d);
        d = new Date(Date.parse("02/03/2012"));
        if (!d.equals(new Date(112, 1, 3)))
            fail("Fail: Want 2/3/2012 Got " + d);
        d = new Date(Date.parse("03/04/15"));
        if (!d.equals(new Date(115, 2, 4)))
            fail("Fail: Want 3/4/2015 Got " + d);
    }

    /**
     * @bug 4118010
     * Regress bug:
     * Feb. 2000 has 29 days, but Date(2000, 1, 29) returns March 01, 2000
     * NOTE: This turned out to be a user error (passing in 2000 instead
     * of 2000-1900 to the Date constructor).
     */
    @Test
    public void Test4118010() {
        Date d=new java.util.Date(2000-1900, Calendar.FEBRUARY, 29);
        int m=d.getMonth();
        int date=d.getDate();
        if (m != Calendar.FEBRUARY ||
            date != 29)
            fail("Fail: Want Feb 29, got " + d);
    }

    /**
     * @bug 4120606
     * Date objects share state after cloning.
     */
    @Test
    public void Test4120606() {
        Date d = new Date(98, Calendar.JUNE, 24);
        d.setMonth(Calendar.MAY);
        Date e = (Date)d.clone();
        d.setMonth(Calendar.FEBRUARY);
        if (e.getMonth() != Calendar.MAY) {
            fail("Cloned Date objects share state");
        }
    }

    /**
     * @bug 4133833
     * Date constructor crashes with parameters out of range, when it should
     * normalize.
     */
    @Test
    public void Test4133833() {
        Date date = new java.util.Date(12,15,19);
        Date exp  = new Date(1913-1900, Calendar.APRIL, 19);
        if (!date.equals(exp))
            fail("Fail: Want " + exp +
                                "; got " + date);
    }

    /**
     * @bug 4136916
     * Date.toString() throws exception in 1.2b4-E
     * CANNOT REPRODUCE this bug
     */
    @Test
    public void Test4136916() {
        Date time = new Date();
        System.out.println(time.toString());
    }

    /**
     * @bug 6274757
     * Date getTime and toString interaction for some time values
     */
    @Test
    public void Test6274757() {
        TimeZone savedTz = TimeZone.getDefault();
        try {
            // Use a time zone west of GMT.
            TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
            TimeZone jdkGMT = TimeZone.getTimeZone("GMT");
            Calendar jdkCal = Calendar.getInstance(jdkGMT);
            jdkCal.clear();
            jdkCal.set(1582, Calendar.OCTOBER, 15);
            System.out.println("JDK time: " + jdkCal.getTime().getTime() );
            System.out.println("JDK time (str): " + jdkCal.getTime() );
            System.out.println("Day of month: " + jdkCal.get(Calendar.DAY_OF_MONTH));
            Date co = jdkCal.getTime();
            System.out.println("Change over (Oct 15 1582) = " + co + " (" +
                  co.getTime() + ")");
            long a = jdkCal.getTime().getTime();
            Date c = jdkCal.getTime();
            c.toString();
            long b = c.getTime();

            if (a != b) {
                fail("ERROR: " + a + " != " + b);
            } else {
                System.out.println(a + " = " + b);
            }
        } finally {
            TimeZone.setDefault(savedTz);
        }
    }

    /**
     * @bug 6314387
     * JCK6.0: api/java_util/Date/index.html#misc fails, mustang
     */
    @Test
    public void Test6314387() {
        Date d = new Date(Long.MAX_VALUE);
        int y = d.getYear();
        if (y != 292277094) {
            fail("yesr: got " + y + ", expected 292277094");
        }
        d = new Date(Long.MIN_VALUE);
        y = d.getYear();
        if (y != 292267155) {
            fail("yesr: got " + y + ", expected 292267155");
        }
    }
}

//eof
