/*
 * Copyright 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.emultest.java.util;

import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.testing.TestUtils;

import java.util.ArrayList;
import java.util.Date;

/**
 * Tests for GWT's emulation of the JRE Date class.
 */
@SuppressWarnings("deprecation")
public class DateTest extends GWTTestCase {
  public static final String CURRENT = "CURRENT";
  public static final String TO_STRING_PATTERN = "\\w{3} \\w{3} \\d{2} \\d{2}:\\d{2}:\\d{2}( .+)? \\d{4}";
  public static final long DAY_MILLISECONDS_SHIFT = 27;
  public static final String FUTURE = "FUTURE";
  public static final String PAST = "PAST";
  public static final long SECOND_MILLISECONDS_SHIFT = 10;

  Date theDate = new Date();

  /**
   * Sets module name so that javascript compiler can operate.
   */
  @Override
  public String getModuleName() {
    return "com.google.gwt.emultest.EmulSuite";
  }

  /** Testing for public boolean java.util.Date.after(java.util.Date). */
  public void testAfter() {

    // /////////////////////////////
    // Current
    // /////////////////////////////
    Date accum0 = create();
    Date arg10 = create();
    boolean a0 = accum0.after(arg10);
    assertFalse(a0);
    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    Date arg20 = create();
    boolean a1 = accum1.after(arg20);
    assertFalse(a1);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    Date arg30 = create();
    boolean a2 = accum2.after(arg30);
    assertTrue(a2);
  }

  /** Testing for public boolean java.util.Date.before(java.util.Date). */
  public void testBefore() {

    // /////////////////////////////
    // Current
    // /////////////////////////////
    Date accum0 = create();
    Date arg10 = create();
    boolean a0 = accum0.before(arg10);
    assertFalse(a0);
    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    Date arg20 = create();
    boolean a1 = accum1.before(arg20);
    assertTrue(a1);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    Date arg30 = create();
    boolean a2 = accum2.before(arg30);
    assertFalse(a2);
  }

  /**
   * Tests that if daylight savings time occurs tomorrow, the current date isn't
   * affected.
   */
  public void testClockForwardNextDay() {
    int[] monthDayHour = new int[3];
    if (!findClockForwardTime(2009, monthDayHour)) {
      return;
    }

    int month = monthDayHour[0];
    int day = monthDayHour[1] - 1; // Day before.
    int hour = monthDayHour[2];
    Date d = new Date(2009 - 1900, month, day, hour, 0, 0);
    assertEquals(day, d.getDate());
    assertEquals(hour, d.getHours());

    // Change the minutes, which triggers fixDaylightSavings.
    d.setMinutes(10);
    assertEquals(day, d.getDate());
    assertEquals(hour, d.getHours());

    // Change the seconds, which triggers fixDaylightSavings.
    d.setSeconds(10);
    assertEquals(day, d.getDate());
    assertEquals(hour, d.getHours());

    // Change the minutes by more than an hour.
    d.setMinutes(80);
    assertEquals(day, d.getDate());
    assertEquals(hour + 1, d.getHours());
  }

  /** Testing for public java.lang.Object java.util.Date.clone(). */
  public void testClone() {

    // /////////////////////////////
    // Current
    // /////////////////////////////
    Date accum0 = create();
    Object a0 = accum0.clone();
    assertFalse(a0 == accum0);
    assertEquals(a0, accum0);
    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    Object a1 = accum1.clone();
    assertFalse(a1 == accum1);
    assertEquals(a1, accum1);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    Object a2 = accum2.clone();
    assertFalse(a2 == accum2);
    assertEquals(a2, accum2);
  }

  /** Testing for public int java.util.Date.compareTo(java.util.Date). */
  public void testCompareTo() {

    // /////////////////////////////
    // Current
    // /////////////////////////////
    Date accum0 = create();
    Date arg10 = create();
    int a0 = accum0.compareTo(arg10);
    assertEquals(0, a0);
    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create();
    Date arg20 = create(PAST);
    int a1 = accum1.compareTo(arg20);
    assertEquals(1, a1);
    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create();
    Date arg30 = create(FUTURE);
    int a2 = accum2.compareTo(arg30);
    assertEquals(-1, a2);
  }

  /** Testing for public int java.util.Date.getDate(). */
  public void testGetDate() {

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    int a1 = accum1.getDate();
    int expectedValue = 5;
    if (needsToChangeDate(accum1, 0)) {
      expectedValue--;
    }
    assertEquals(expectedValue, a1);
    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    int a2 = accum2.getDate();
    expectedValue = 30;
    if (needsToChangeDate(accum2, 3 * 60 + 4)) {
      expectedValue--;
    }
    assertEquals(expectedValue, a2);
  }

  private boolean needsToChangeDate(Date d, int minuteOffset) {
    int timezoneOffset = d.getTimezoneOffset();
    return timezoneOffset > minuteOffset;
  }

  /** Testing for public int java.util.Date.getDay(). */
  public void testGetDay() {

    // /////////////////////////////
    // Current
    // /////////////////////////////
    Date accum0 = create();
    int a0 = accum0.getDay();

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    int a1 = accum1.getDay();

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    int a2 = accum2.getDay();
  }

  /** Testing for public int java.util.Date.getHours(). */
  public void testGetHours() {
    // Cannot be done because each time zone will give a different
    // answer
  }

  /** Testing for public int java.util.Date.getMinutes(). */
  public void testGetMinutes() {

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    int a1 = accum1.getMinutes();
    assertEquals(0, a1);
    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    int a2 = accum2.getMinutes();
    assertEquals(4, a2);
  }

  /** Testing for public int java.util.Date.getMonth(). */
  public void testGetMonth() {

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    int a1 = accum1.getMonth();
    assertEquals(0, a1);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    int a2 = accum2.getMonth();
    assertEquals(11, a2);
  }

  /** Testing for public int java.util.Date.getSeconds(). */
  public void testGetSeconds() {

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    int a1 = accum1.getSeconds();
    assertEquals(0, a1);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    int a2 = accum2.getSeconds();
    assertEquals(5, a2);
  }

  /** Testing for public long java.util.Date.getTime(). */
  public void testGetTime() {

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    long a1 = accum1.getTime();
    assertEquals(-2524176000000L, a1);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    long a2 = accum2.getTime();
    assertEquals(1924830245000L, a2);
  }

  /** Testing for public int java.util.Date.getTimezoneOffset(). */
  public void testGetTimezoneOffset() {

    // /////////////////////////////
    // Current
    // /////////////////////////////
    Date accum0 = create();
    int a0 = accum0.getTimezoneOffset();

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    int a1 = accum1.getTimezoneOffset();

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    int a2 = accum2.getTimezoneOffset();
  }

  /** Testing for public int java.util.Date.getYear(). */
  public void testGetYear() {

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    int a1 = accum1.getYear();
    assertEquals(-10, a1);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    int a2 = accum2.getYear();
    assertEquals(130, a2);
  }

  /**
   * Testing to that if we set the day number to 31 for a month that only has 30
   * days in it, that the date rolls over to the first day of the next month in
   * sequence.
   */
  public void testInvalidDateForMonth() {
    int monthNum = 3; // April
    int numDaysInOldMonth = 30;
    int newDayNum = 31;
    Date dateWithThirtyDays = new Date(2006, monthNum, 30);
    dateWithThirtyDays.setDate(newDayNum);
    assertEquals(dateWithThirtyDays.getMonth(), monthNum + 1);
    assertEquals(dateWithThirtyDays.getDate(), newDayNum - numDaysInOldMonth);
  }

  /** Testing for public static long java.util.Date.parse(java.lang.String). */
  public void testParse() {
    try {
      Date.parse(null);
      fail("Should have thrown exception");
    } catch (IllegalArgumentException e) {
      // Expected
    }

    try {
      Date.parse("");
    } catch (IllegalArgumentException e) {
      // Expected
    }

    // /////////////////////////////
    // Current
    // /////////////////////////////
    Date accum0 = create();
    String arg10 = createString(CURRENT);
    long a0 = Date.parse(arg10);
    assertEquals(roundToDay(accum0.getTime()), roundToDay(a0));
    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    String arg20 = createString(PAST);
    long a1 = Date.parse(arg20);
    assertEquals(-2524521600000L, a1);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    String arg30 = createString(FUTURE);
    long a2 = Date.parse(arg30);
    assertEquals(1924830245000L, a2);
  }

  /** Testing for public void java.util.Date.setDate(int). */
  public void testSetDate() {
    // We only go through dates from 0-28 here. There are some months that do
    // not
    // have 29, 30, or 31 days - so our assertion would be wrong in the cases
    // where
    // the current month did not have 29,30,or 31 days
    for (int i = 1; i < 29; i++) {
      Date accum0 = create();
      accum0.setDate(i);
      assertEquals(accum0.getDate(), i);
    }
  }

  /** Testing for public void java.util.Date.setHours(int). */
  public void testSetHours() {
    for (int i = 0; i < 24; i++) {
      Date accum0 = create();
      if (isDst(accum0)) {
        // This test fails on the day of DST, so skip it.
        return;
      }
      accum0.setHours(i);
      assertEquals(accum0.getHours(), i);
    }
  }

  /**
   * We want to test to see that if we are currently in a month with 31 days and
   * we set the month to one which has less than 31 days, that the month
   * returned by the date class will be one higher than the month that we
   * originally set (according to the spec of java.util.date).
   */
  public void testSetInvalidMonthForDate() {
    int dayNum = 31;
    int newMonthNum = 1;
    int numDaysInNewMonth = 28;
    Date dateWithThirtyOneDays = new Date(2006, 12, dayNum);
    dateWithThirtyOneDays.setMonth(newMonthNum);
    assertEquals(dateWithThirtyOneDays.getMonth(), newMonthNum + 1);
    assertEquals(dateWithThirtyOneDays.getDate(), dayNum - numDaysInNewMonth);
  }

  /**
   * We want to test to see that if the date is Feb 29th (in a leap year) and we
   * set the year to a non-leap year, that the month and day will roll over to
   * March 1st.
   */
  public void testSetInvalidYearForDate() {
    int dayNum = 29;
    int monthNum = 1; // February
    int newYearNum = 2005;
    int numDaysInFebInNewYear = 28;
    Date leapYearDate = new Date(2004, monthNum, dayNum);
    leapYearDate.setYear(newYearNum);
    assertEquals(leapYearDate.getYear(), newYearNum);
    assertEquals(leapYearDate.getMonth(), monthNum + 1);
    assertEquals(leapYearDate.getDate(), dayNum - numDaysInFebInNewYear);
  }

  /** Testing for public void java.util.Date.setMinutes(int). */
  public void testSetMinutes() {
    for (int i = 0; i < 24; i++) {
      Date accum0 = create();
      accum0.setMinutes(i);
      assertEquals(accum0.getMinutes(), i);
    }
  }

  /** Testing for public void java.util.Date.setMonth(int). */
  public void testSetMonth() {
    for (int i = 0; i < 12; i++) {
      // We want to use a fixed date here. If we use the current date, the
      // assertion may fail
      // when the date is the 29th, 30th, or 31st, and we set the month to one
      // which does
      // not have 29, 30, or 31 days in it, respectively.
      Date accum0 = new Date(2006, 12, 1);
      accum0.setMonth(i);
      assertEquals(accum0.getMonth(), i);
    }
  }

  /** Testing for public void java.util.Date.setSeconds(int). */
  public void testSetSeconds() {
    for (int i = 0; i < 24; i++) {
      Date accum0 = create();
      accum0.setSeconds(i);
      assertEquals(accum0.getSeconds(), i);
    }
  }

  /** Testing for public void java.util.Date.setTime(long). */
  public void testSetTime() {
    long[] values = new long[] {-100000000000L, -100L, 0, 100L, 1000000000L};
    for (int i = 0; i < values.length; i++) {
      Date accum0 = create();
      accum0.setTime(values[i]);
      assertEquals(accum0.getTime(), values[i]);
    }
  }

  /**
   * We want to test to see that if the date is Feb 29th (in a leap year) and we
   * set the year to another leap year, that the month and day will be retained.
   */
  public void testSetValidLeapYearForDate() {
    int dayNum = 29;
    int monthNum = 1; // February
    int yearNum = 2004;
    int newYearNum = yearNum + 4;
    Date leapYearDate = new Date(yearNum, monthNum, dayNum);
    leapYearDate.setYear(newYearNum);
    assertEquals(leapYearDate.getYear(), newYearNum);
    assertEquals(leapYearDate.getMonth(), monthNum);
    assertEquals(leapYearDate.getDate(), dayNum);
  }

  /** Testing for public void java.util.Date.setYear(int). */
  public void testSetYear() {
    for (int i = 1880; i < 2030; i++) {
      // We want to use a fixed date here. If we use the current date, the
      // assertion may fail
      // when the date is February 29th, and we set the year to a non-leap year
      Date accum0 = new Date(2006, 12, 01);
      accum0.setYear(i);
      assertEquals(accum0.getYear(), i);
    }
  }

  /** Testing for public java.lang.String java.util.Date.toGMTString(). */
  public void testToGMTString() {

    // We can't rely on the JRE's toString, as it is an implementation detail.
    if (!TestUtils.isJvm()) {
      // /////////////////////////////
      // Past
      // /////////////////////////////
      Date accum1 = create(PAST);
      String a1 = accum1.toGMTString();
      assertEquals("5 Jan 1890 00:00:00 GMT", a1);

      // /////////////////////////////
      // Future
      // /////////////////////////////
      Date accum2 = create(FUTURE);
      String a2 = accum2.toGMTString();
      assertEquals("30 Dec 2030 03:04:05 GMT", a2);
    }
  }

  /** Testing for public java.lang.String java.util.Date.toLocaleString(). */
  public void testToLocaleString() {

    // We can't rely on the JRE's toString, as it is an implementation detail.
    if (!TestUtils.isJvm()) {
      // /////////////////////////////
      // Past
      // /////////////////////////////
      Date accum1 = create(PAST);
      String a1 = accum1.toLocaleString();
      assertTrue(a1.indexOf("1890") != -1);
      // /////////////////////////////
      // Future
      // /////////////////////////////
      Date accum2 = create(FUTURE);
      String a2 = accum2.toLocaleString();
      assertTrue(a2.indexOf("2030") != -1);
    }
  }

  /** Date docs specify an exact format for toString(). */
  public void testToString() {

    // We can't rely on the JRE's toString, as it is an implementation detail.
    if (!TestUtils.isJvm()) {
      // /////////////////////////////
      // Past
      // /////////////////////////////
      Date d = create(PAST);
      String s = d.toString();

      assertTrue("Bad format " + s, s.matches(TO_STRING_PATTERN));
      assertEquals("Parsing returned unequal dates from " + s, d, new Date(
          Date.parse(s)));

      // /////////////////////////////
      // Future
      // /////////////////////////////
      d = create(FUTURE);
      s = d.toString();

      assertTrue("Bad format " + s, s.matches(TO_STRING_PATTERN));
      assertEquals("Parsing returned unequal dates from " + s, d, new Date(
          Date.parse(s)));
    }
  }

  /** Testing for public static long java.util.Date.UTC(int,int,int,int,int,int). */
  public void testUTC() {

    // /////////////////////////////
    // Current
    // /////////////////////////////
    Date accum0 = create();
    int arg10 = 0;
    int arg11 = 0;
    int arg12 = 0;
    int arg13 = 0;
    int arg14 = 0;
    int arg15 = 0;
    long a0 = accum0.UTC(arg10, arg11, arg12, arg13, arg14, arg15);

    // /////////////////////////////
    // Past
    // /////////////////////////////
    Date accum1 = create(PAST);
    int arg20 = 0;
    int arg21 = 0;
    int arg22 = 0;
    int arg23 = 0;
    int arg24 = 0;
    int arg25 = 0;
    long a1 = accum1.UTC(arg20, arg21, arg22, arg23, arg24, arg25);

    // /////////////////////////////
    // Future
    // /////////////////////////////
    Date accum2 = create(FUTURE);
    int arg30 = 0;
    int arg31 = 0;
    int arg32 = 0;
    int arg33 = 0;
    int arg34 = 0;
    int arg35 = 0;
    long a2 = accum2.UTC(arg30, arg31, arg32, arg33, arg34, arg35);
  }

  // Month and date of days with time shifts
  private ArrayList<Integer> timeShiftMonth = new ArrayList<Integer>();
  private ArrayList<Integer> timeShiftDate = new ArrayList<Integer>();

  private boolean containsTimeShift(Date start, int days) {
    long startTime = start.getTime();
    Date end = new Date();
    end.setTime(startTime);
    end.setDate(start.getDate() + days);
    long endTime = end.getTime();
    return (endTime - startTime) != ((long) days * 24 * 60 * 60 * 1000);
  }

  private void findTimeShift(Date start, int days) {
    assertTrue(days != 0);

    // Found a shift day
    if (days == 1) {
      timeShiftMonth.add(start.getMonth());
      timeShiftDate.add(start.getDate());
      return;
    }

    // Recurse over the first half of the period
    if (containsTimeShift(start, days / 2)) {
      findTimeShift(start, days / 2);
    }

    // Recurse over the second half of the period
    Date mid = new Date();
    mid.setTime(start.getTime());
    mid.setDate(start.getDate() + days / 2);
    if (containsTimeShift(mid, days - days / 2)) {
      findTimeShift(mid, days - days / 2);
    }
  }

  private void findTimeShifts(int year) {
    timeShiftMonth.clear();
    timeShiftDate.clear();
    Date start = new Date(year - 1900, 0, 1, 12, 0, 0);
    Date end = new Date(year + 1 - 1900, 0, 1, 12, 0, 0);
    int days = (int) ((end.getTime() - start.getTime()) /
        (24 * 60 * 60 * 1000));
    findTimeShift(start, days);
  }

  private boolean findClockBackwardTime(int year, int[] monthDayHour) {
    findTimeShifts(year);
    int numShifts = timeShiftMonth.size();
    for (int i = 0; i < numShifts; i++) {
      int month = timeShiftMonth.get(i);
      int day = timeShiftDate.get(i);

      long start = new Date(year - 1900, month, day, 0, 30, 0).getTime();
      long end = new Date(year - 1900, month, day + 1, 23, 30, 0).getTime();
      int lastHour = -1;
      for (long time = start; time < end; time += 60 * 60 * 1000) {
        Date d = new Date();
        d.setTime(time);
        int hour = d.getHours();
        if (hour == lastHour) {
          monthDayHour[0] = d.getMonth();
          monthDayHour[1] = d.getDate();
          monthDayHour[2] = d.getHours();
          return true;
        }
        lastHour = hour;
      }
    }

    return false;
  }

  private boolean findClockForwardTime(int year, int[] monthDayHour) {
    findTimeShifts(year);
    int numShifts = timeShiftMonth.size();
    for (int i = 0; i < numShifts; i++) {
      int month = timeShiftMonth.get(i);
      int startDay = timeShiftDate.get(i);

      for (int day = startDay; day <= startDay + 1; day++) {
        for (int hour = 0; hour < 24; hour++) {
          Date d = new Date(year - 1900, month, day, hour, 0, 0);
          int h = d.getHours();
          if ((h % 24) == ((hour + 1) % 24)) {
            monthDayHour[0] = month;
            monthDayHour[1] = day;
            monthDayHour[2] = hour;
            return true;
          }
        }
      }
    }

    return false;
  }

  /**
   * Check if daylight saving time occurs on the date.
   *
   * @param date the date to check
   * @return true if DST occurs on the date, false if not
   */
  private boolean isDst(Date date) {
    int[] monthDayHour = new int[3];
    if (!findClockForwardTime(date.getYear() + 1900, monthDayHour)) {
      return false;
    }
    return monthDayHour[0] == date.getMonth()
        && monthDayHour[1] == date.getDate();
  }

  public void testClockBackwardTime() {
    int[] monthDayHour = new int[3];
    if (!findClockBackwardTime(2009, monthDayHour)) {
      return;
    }

    Date d;
    int month = monthDayHour[0];
    int day = monthDayHour[1];
    int hour = monthDayHour[2];

    // Check that this is the later of the two times having the
    // same hour:minute:second
    d = new Date(2009 - 1900, month, day, hour, 30, 0);
    assertEquals(hour, d.getHours());
    d.setTime(d.getTime() - 60 * 60 * 1000);
    assertEquals(hour, d.getHours());
  }

  public void testClockForwardTime() {
    int[] monthDayHour = new int[3];
    if (!findClockForwardTime(2009, monthDayHour)) {
      return;
    }

    Date d;
    int month = monthDayHour[0];
    int day = monthDayHour[1];
    int hour = monthDayHour[2];

    d = new Date(2009 - 1900, month, day, hour, 0, 0);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    // Test year change -- assume the previous year changes on a different day
    d = new Date(2008 - 1900, month, day, hour, 0, 0);
    assertEquals(hour, d.getHours());
    d.setYear(2009 - 1900);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    // Test month change
    d = new Date(2009 - 1900, month + 1, day, hour, 0, 0);
    assertEquals(hour, d.getHours());
    d.setMonth(month);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    // Test day change
    d = new Date(2009 - 1900, month, day + 1, hour, 0, 0);
    assertEquals(hour, d.getHours());
    d.setDate(day);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    // Test hour setting
    d = new Date(2009 - 1900, month, day, hour + 2, 0, 0);
    assertEquals(normalizeHour(hour + 2), d.getHours());
    d.setHours(hour);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    // Test changing hour by minutes = +- 60
    d = new Date(2009 - 1900, month, day, hour + 2, 0, 0);
    assertEquals(normalizeHour(hour + 2), d.getHours());
    d.setMinutes(-60);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    d = new Date(2009 - 1900, month, day, hour - 1, 0, 0);
    assertEquals(normalizeHour(hour - 1), d.getHours());
    d.setMinutes(60);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    // Test changing hour by minutes = +- 120
    d = new Date(2009 - 1900, month, day, hour + 2, 0, 0);
    assertEquals(normalizeHour(hour + 2), d.getHours());
    d.setMinutes(-120);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    d = new Date(2009 - 1900, month, day, hour - 2, 0, 0);
    assertEquals(normalizeHour(hour - 2), d.getHours());
    d.setMinutes(120);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    // Test changing hour by seconds = +- 3600
    d = new Date(2009 - 1900, month, day, hour + 2, 0, 0);
    assertEquals(normalizeHour(hour + 2), d.getHours());
    d.setSeconds(-3600);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    d = new Date(2009 - 1900, month, day, hour - 1, 0, 0);
    assertEquals(normalizeHour(hour - 1), d.getHours());
    d.setSeconds(3600);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    // Test changing hour by seconds = +- 7200
    d = new Date(2009 - 1900, month, day, hour + 2, 0, 0);
    assertEquals(normalizeHour(hour + 2), d.getHours());
    d.setSeconds(-7200);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    d = new Date(2009 - 1900, month, day, hour - 2, 0, 0);
    assertEquals(normalizeHour(hour - 2), d.getHours());
    d.setSeconds(7200);
    assertEquals(normalizeHour(hour + 1), d.getHours());

    d = new Date(2009 - 1900, month, day, hour + 2, 0, 0);
    d.setHours(hour);
    d.setMinutes(30);
    assertEquals(normalizeHour(hour + 1), d.getHours());
    assertEquals(30, d.getMinutes());

    d = new Date(2009 - 1900, month, day, hour + 2, 0, 0);
    d.setMinutes(30);
    d.setHours(hour);
    assertEquals(normalizeHour(hour + 1), d.getHours());
    assertEquals(30, d.getMinutes());
  }

  int normalizeHour(int i) {
    return (i + 24) % 24;
  }

  Date create() {
    return (Date) theDate.clone();
  }

  Date create(String s) {
    if (s.equals(FUTURE)) {
      return new Date("12/30/2030 3:4:5 GMT");
    } else if (s.equals(PAST)) {
      return new Date("1/5/1890 GMT");
    } else {
      return (Date) theDate.clone();
    }
  }

  private String createString(String s) {
    if (s.equals(FUTURE)) {
      return "12/30/2030 3:4:5 GMT";
    } else if (s.equals(PAST)) {
      return "1/1/1890 GMT";
    } else {
      return theDate.toLocaleString();
    }
  }

  private long roundToDay(long accum0) {
    return accum0 >> DAY_MILLISECONDS_SHIFT << DAY_MILLISECONDS_SHIFT;
  }
}
