/*
 * 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.i18n.client;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.constants.TimeZoneConstants;
import com.google.gwt.i18n.client.impl.cldr.DateTimeFormatInfoImpl_de;
import com.google.gwt.i18n.shared.DateTimeFormatTestBase;

import java.util.Date;

/**
 * Tests formatting functionality in {@link com.google.gwt.i18n.shared.DateTimeFormat} for the
 * English language.
 */
@SuppressWarnings("deprecation")
public class DateTimeFormat_en_Test extends DateTimeFormatTestBase {

  private static class GermanDTF extends DateTimeFormat {

    public static DateTimeFormat getFormat(String pattern) {
      return DateTimeFormat.getFormat(pattern, new DateTimeFormatInfoImpl_de());
    }

    protected GermanDTF(String pattern) {
      super(pattern);
    }
  }

  @Override
  public String getModuleName() {
    return "com.google.gwt.i18n.I18NTest_en";
  }

  public void test_ccc() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("Thu", DateTimeFormat.getFormat("ccc").format(date));
  }

  public void test_cccc() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("Thursday", DateTimeFormat.getFormat("cccc").format(date));
  }

  public void test_ccccc() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("T", DateTimeFormat.getFormat("ccccc").format(date));
  }

  public void test_daylightTimeTransition() {
    // US PST transitioned to PDT on 2006/4/2 2:00am, jump to 2006/4/2 3:00am.
    // That's UTC time 2006/4/2 10:00am

    TimeZoneConstants timeZoneData = GWT.create(TimeZoneConstants.class);
    String str = timeZoneData.americaLosAngeles();
    TimeZone usPacific = TimeZone.createTimeZone(str);

    Date date = new Date();
    date.setTime(Date.UTC(2006 - 1900, 3, 2, 9, 59, 0));
    assertEquals("04/02/2006 01:59:00 PST", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, usPacific));
    date.setTime(Date.UTC(2006 - 1900, 3, 2, 10, 01, 0));
    assertEquals("04/02/2006 03:01:00 PDT", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, usPacific));
    date.setTime(Date.UTC(2006 - 1900, 3, 2, 10, 0, 0));
    assertEquals("04/02/2006 03:00:00 PDT", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, usPacific));

    // US PDT transition to PST on 2006/10/29 2:00am, jump back to PDT
    // 2006/4/2 1:00am
    date.setTime(Date.UTC(2006 - 1900, 10 - 1, 29, 8, 59, 0));
    assertEquals("10/29/2006 01:59:00 PDT", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, usPacific));
    date.setTime(Date.UTC(2006 - 1900, 10 - 1, 29, 9, 01, 0));
    assertEquals("10/29/2006 01:01:00 PST", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, usPacific));
    date.setTime(Date.UTC(2006 - 1900, 10 - 1, 29, 9, 0, 0));
    assertEquals("10/29/2006 01:00:00 PST", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, usPacific));
  }

  public void test_EEEEMMMddHHmmsszzzyy() {
    DateTimeFormat dtf = DateTimeFormat.getFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    Date date = dtf.parse("Mon Aug 30 00:45:00 GMT 2010");
    assertEquals(45, (date.getHours() * 60 + date.getMinutes()
        + date.getTimezoneOffset()) % 1440);
    date = dtf.parse("Mon Aug 30 01:45:00 GMT 2010");
    assertEquals(105, (date.getHours() * 60 + date.getMinutes()
        + date.getTimezoneOffset()) % 1440);
    date = dtf.parse("Mon Aug 30 06:45:00 GMT 2010");
    assertEquals(405, (date.getHours() * 60 + date.getMinutes()
        + date.getTimezoneOffset()) % 1440);
    date = dtf.parse("Mon Aug 30 07:45:00 GMT 2010");
    assertEquals(465, (date.getHours() * 60 + date.getMinutes()
        + date.getTimezoneOffset()) % 1440);
  }

  public void test_EEEEMMMddyy() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("Thursday,July 27, 2006", DateTimeFormat.getFormat(
        "EEEE,MMMM dd, yyyy").format(date));
  }

  public void test_EEEMMMddyy() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("Thu, Jul 27, 06",
        DateTimeFormat.getFormat("EEE, MMM d, yy").format(date));
  }

  public void test_HHmmss() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("13:10:10", DateTimeFormat.getFormat("HH:mm:ss").format(date));
  }

  public void test_hhmmssa() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("1:10:10 PM", DateTimeFormat.getFormat("h:mm:ss a").format(
        date));
  }

  public void test_k() {
    DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd kk:mm:ss");
    Date date;
    TimeZone utc = TimeZone.createTimeZone(0);

    date = new Date(Date.UTC(2013 - 1900, 1 - 1, 1, 0, 34, 56));
    assertEquals("2013-01-01 24:34:56", dtf.format(date, utc));
    date = new Date(Date.UTC(2013 - 1900, 1 - 1, 1, 1, 34, 56));
    assertEquals("2013-01-01 01:34:56", dtf.format(date, utc));
  }

  public void test_LL() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("07", DateTimeFormat.getFormat("LL").format(date));
  }

  public void test_LLL() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("Jul", DateTimeFormat.getFormat("LLL").format(date));
  }

  public void test_LLLL() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("July", DateTimeFormat.getFormat("LLLL").format(date));
  }

  public void test_LLLLL() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("J", DateTimeFormat.getFormat("LLLLL").format(date));
  }

  public void test_predefinedFormat() {
    Date date = new Date(2006 - 1900, 7, 4, 13, 49, 24);

    TimeZoneConstants timeZoneData = GWT.create(TimeZoneConstants.class);
    String str = timeZoneData.americaLosAngeles();
    TimeZone usPacific = TimeZone.createTimeZone(TimeZoneInfo.buildTimeZoneData(str));

    String fullDateFormat = DateTimeFormat.getFullDateFormat().format(date);
    assertEquals("Friday, August 4, 2006", fullDateFormat);

    String longDateFormat = DateTimeFormat.getLongDateFormat().format(date);
    assertEquals("August 4, 2006", longDateFormat);

    String medDateFormat = DateTimeFormat.getMediumDateFormat().format(date);
    assertEquals("Aug 4, 2006", medDateFormat);

    String shortDateFormat = DateTimeFormat.getShortDateFormat().format(date);
    assertEquals("8/4/06", shortDateFormat);

    // When dealing with time zone, better use UTC time.
    // And when UTC time is used, time zone must be given in "format".
    date.setTime(Date.UTC(2006 - 1900, 7, 4, 20, 49, 24));
    String fullTimeFormat = DateTimeFormat.getFullTimeFormat().format(date,
        usPacific);
    assertEquals("1:49:24 PM Pacific Daylight Time", fullTimeFormat);

    String longTimeFormat = DateTimeFormat.getLongTimeFormat().format(date,
        usPacific);
    assertEquals("1:49:24 PM PDT", longTimeFormat);

    String medTimeFormat = DateTimeFormat.getMediumTimeFormat().format(date,
        usPacific);
    assertEquals("1:49:24 PM", medTimeFormat);

    String shortTimeFormat = DateTimeFormat.getShortTimeFormat().format(date,
        usPacific);
    assertEquals("1:49 PM", shortTimeFormat);

    String medFormat = DateTimeFormat.getMediumDateTimeFormat().format(date,
        usPacific);
    assertEquals("Aug 4, 2006 1:49:24 PM", medFormat);

    String shortFormat = DateTimeFormat.getShortDateTimeFormat().format(date,
        usPacific);
    assertEquals("8/4/06 1:49 PM", shortFormat);
  }
  
  public void test_QQQQyy() {
    Date date;

    date = new Date(2006 - 1900, 0, 27, 13, 10, 10);
    assertEquals("1st quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 1, 27, 13, 10, 10);
    assertEquals("1st quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 2, 27, 13, 10, 10);
    assertEquals("1st quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 3, 27, 13, 10, 10);
    assertEquals("2nd quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 4, 27, 13, 10, 10);
    assertEquals("2nd quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 5, 27, 13, 10, 10);
    assertEquals("2nd quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("3rd quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 7, 27, 13, 10, 10);
    assertEquals("3rd quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 8, 27, 13, 10, 10);
    assertEquals("3rd quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 9, 27, 13, 10, 10);
    assertEquals("4th quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 10, 27, 13, 10, 10);
    assertEquals("4th quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));

    date = new Date(2006 - 1900, 11, 27, 13, 10, 10);
    assertEquals("4th quarter 06", DateTimeFormat.getFormat("QQQQ yy").format(
        date));
  }
  
  public void test_QQyyyy() {
    Date date = new Date(2006 - 1900, 0, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q1 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 1, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q1 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 2, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q1 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 3, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q2 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 4, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q2 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 5, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q2 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 6, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q3 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 7, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q3 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 8, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q3 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 9, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q4 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 10, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q4 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
    date = new Date(2006 - 1900, 11, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("Q4 2006", DateTimeFormat.getFormat("QQ yyyy").format(date));
  }
  
  public void test_quote() {
    Date date = new Date(2006 - 1900, 6, 27);
    date.setHours(13);
    date.setMinutes(10);
    date.setSeconds(10);
    assertEquals("13 o'clock",
        DateTimeFormat.getFormat("HH 'o''clock'").format(date));
    assertEquals("13 oclock", DateTimeFormat.getFormat("HH 'oclock'").format(
        date));
    assertEquals("13 '", DateTimeFormat.getFormat("HH ''").format(date));
  }

  public void test_S() {
    Date date = new Date(0);
    assertEquals("0", DateTimeFormat.getFormat("S").format(date));
    
    date = new Date(55);
    assertEquals("1", DateTimeFormat.getFormat("S").format(date));
    
    date = new Date(555);
    assertEquals("6", DateTimeFormat.getFormat("S").format(date));
    
    date = new Date(999);
    assertEquals("9", DateTimeFormat.getFormat("S").format(date));
  }

  public void test_simepleTimezonev() {
    TimeZone simpleTimeZone = TimeZone.createTimeZone(480);

    Date date = new Date();
    date.setTime(Date.UTC(2006 - 1900, 6, 27, 14, 10, 10));

    assertEquals("07/27/2006 06:10:10 Etc/GMT+8", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss v").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 Etc/GMT+8", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss vv").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 Etc/GMT+8", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss vvv").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 Etc/GMT+8", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss vvvv").format(date, simpleTimeZone));
  }

  public void test_simpleTimezonez() {
    TimeZone simpleTimeZone = TimeZone.createTimeZone(420);
    Date date = new Date();
    date.setTime(Date.UTC(2006 - 1900, 6, 27, 13, 10, 10));

    assertEquals("07/27/2006 06:10:10 UTC-7", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 UTC-7", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss zz").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 UTC-7", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss zzz").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 UTC-7", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss zzzz").format(date, simpleTimeZone));
  }

  public void test_simpleTimezoneZ() {
    TimeZone simpleTimeZone = TimeZone.createTimeZone(420);
    Date date = new Date();
    date.setTime(Date.UTC(2006 - 1900, 6, 27, 13, 10, 10));

    assertEquals("07/27/2006 06:10:10 -0700", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss Z").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 -0700", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZ").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 -07:00", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZZ").format(date, simpleTimeZone));

    assertEquals("07/27/2006 06:10:10 GMT-07:00", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZZZ").format(date, simpleTimeZone));
  }

  public void test_SS() {
    Date date = new Date(0);
    assertEquals("00", DateTimeFormat.getFormat("SS").format(date));
    
    date = new Date(55);
    assertEquals("06", DateTimeFormat.getFormat("SS").format(date));
    
    date = new Date(555);
    assertEquals("56", DateTimeFormat.getFormat("SS").format(date));
    
    date = new Date(999);
    assertEquals("99", DateTimeFormat.getFormat("SS").format(date));
  }

  public void test_SSS() {    
    Date date = new Date(0);
    assertEquals("000", DateTimeFormat.getFormat("SSS").format(date));
    
    date = new Date(55);
    assertEquals("055", DateTimeFormat.getFormat("SSS").format(date));
    
    date = new Date(555);
    assertEquals("555", DateTimeFormat.getFormat("SSS").format(date));
    
    date = new Date(999);
    assertEquals("999", DateTimeFormat.getFormat("SSS").format(date));
  }

  public void test_timezonev() {
    TimeZoneConstants timeZoneData = GWT.create(TimeZoneConstants.class);
    String str = timeZoneData.americaLosAngeles();
    TimeZone usPacific = TimeZone.createTimeZone(str);

    Date date = new Date();
    date.setTime(Date.UTC(2006 - 1900, 6, 27, 13, 10, 10));

    assertEquals("07/27/2006 06:10:10 America/Los_Angeles",
        DateTimeFormat.getFormat("MM/dd/yyyy HH:mm:ss v").format(date,
            usPacific));

    assertEquals("07/27/2006 06:10:10 America/Los_Angeles",
        DateTimeFormat.getFormat("MM/dd/yyyy HH:mm:ss vv").format(date,
            usPacific));

    assertEquals("07/27/2006 06:10:10 America/Los_Angeles",
        DateTimeFormat.getFormat("MM/dd/yyyy HH:mm:ss vvv").format(date,
            usPacific));

    assertEquals("07/27/2006 06:10:10 America/Los_Angeles",
        DateTimeFormat.getFormat("MM/dd/yyyy HH:mm:ss vvvv").format(date,
            usPacific));
  }

  public void test_timezonez() {
    TimeZoneConstants timeZoneData = GWT.create(TimeZoneConstants.class);
    String str = timeZoneData.americaLosAngeles();
    TimeZone usPacific = TimeZone.createTimeZone(str);

    Date date = new Date();
    date.setTime(Date.UTC(2006 - 1900, 6, 27, 13, 10, 10));

    assertEquals("07/27/2006 06:10:10 PDT", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, usPacific));

    assertEquals("07/27/2006 06:10:10 PDT", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss zz").format(date, usPacific));

    assertEquals("07/27/2006 06:10:10 PDT", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss zzz").format(date, usPacific));

    assertEquals("07/27/2006 06:10:10 Pacific Daylight Time",
        DateTimeFormat.getFormat("MM/dd/yyyy HH:mm:ss zzzz").format(date,
            usPacific));

    date.setTime(Date.UTC(2006 - 1900, 1, 27, 13, 10, 10));
    assertEquals("02/27/2006 05:10:10 PST", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss z").format(date, usPacific));

    assertEquals("02/27/2006 05:10:10 PST", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss zz").format(date, usPacific));

    assertEquals("02/27/2006 05:10:10 PST", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss zzz").format(date, usPacific));

    assertEquals("02/27/2006 05:10:10 Pacific Standard Time",
        DateTimeFormat.getFormat("MM/dd/yyyy HH:mm:ss zzzz").format(date,
            usPacific));
    
    // test that we can reparse the formatted output
    DateTimeFormat format = DateTimeFormat.getFormat("MMM d, yyyy h:mm:ss a z");
    assertEquals(date, format.parse(format.format(date)));
  }

  public void test_timezoneZ() {
    TimeZoneConstants timeZoneData = GWT.create(TimeZoneConstants.class);
    String str = timeZoneData.americaLosAngeles();
    TimeZone usPacific = TimeZone.createTimeZone(str);

    Date date = new Date();
    date.setTime(Date.UTC(2006 - 1900, 6, 27, 13, 10, 10));

    assertEquals("07/27/2006 06:10:10 -0700", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss Z").format(date, usPacific));

    assertEquals("07/27/2006 06:10:10 -0700", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZ").format(date, usPacific));

    assertEquals("07/27/2006 06:10:10 -07:00", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZZ").format(date, usPacific));

    assertEquals("07/27/2006 06:10:10 GMT-07:00", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZZZ").format(date, usPacific));

    date.setTime(Date.UTC(2006 - 1900, 1, 27, 13, 10, 10));
    assertEquals("02/27/2006 05:10:10 -0800", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss Z").format(date, usPacific));

    assertEquals("02/27/2006 05:10:10 -0800", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZ").format(date, usPacific));

    assertEquals("02/27/2006 05:10:10 -08:00", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZZ").format(date, usPacific));

    assertEquals("02/27/2006 05:10:10 GMT-08:00", DateTimeFormat.getFormat(
        "MM/dd/yyyy HH:mm:ss ZZZZ").format(date, usPacific));
  }

  public void test_yyyyyMMMMM() {
    Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10);
    assertEquals("02006.J.27 AD 01:10 PM", DateTimeFormat.getFormat(
        "yyyyy.MMMMM.dd GGG hh:mm aaa").format(date));
  }

  public void testCustomFormats() {
    MyFormats m = GWT.create(MyFormats.class);
    Date d = new Date(2010 - 1900, 1, 15, 12, 0, 0);
    assertEquals("Feb 15, 2010", m.yearMonthDayAbbrev().format(d));
    assertEquals("February 15, 2010", m.yearMonthDayFull().format(d));
    assertEquals("February 15, 2010", m.yearMonthDayFull2().format(d));
  }

  public void testMessageDateTime() {
    MyMessages m = GWT.create(MyMessages.class);
    Date d = new Date(2010 - 1900, 1, 15, 12, 0, 0);
    assertEquals("It is Feb 15, 2010", m.getCustomizedDate(d));
  }

  public void testPatternCaching() {
    DateTimeFormat dtf = DateTimeFormat.getFormat("MMMM d");
    Date d = new Date(2010 - 1900, 1, 15, 12, 0, 0);
    assertEquals("February 15", dtf.format(d));
    dtf = GermanDTF.getFormat("MMMM d");
    assertEquals("Februar 15", dtf.format(d));
  }

  public void testPre1970Milliseconds() {
    Date date = new Date(-631151998945L); // Jan 1, 1950 00:00:01.055 UTC
    
    long midnight = Date.UTC(1950 - 1900, 0, 1, 0, 0, 1);
    assertEquals(-631151998945L, midnight + 55);
    
    TimeZone utc = TimeZone.createTimeZone(0);
    assertEquals("055", DateTimeFormat.getFormat("SSS").format(date, utc));
    assertEquals("06", DateTimeFormat.getFormat("SS").format(date, utc));
    assertEquals("1", DateTimeFormat.getFormat("S").format(date, utc));
    
    date = new Date(midnight);
    assertEquals("000", DateTimeFormat.getFormat("SSS").format(date, utc));
  }
  
  public void testZeroPadYear() {
    DateTimeFormat fmt = DateTimeFormat.getFormat("dd.MM.yyyy");
    String str = fmt.format(new Date(1 - 1900, 0, 1)); // 1 Jan 0001
    assertEquals("01.01.0001", str);
    fmt = DateTimeFormat.getFormat("dd.MM.yyyyy");
    str = fmt.format(new Date(2001 - 1900, 0, 1)); // 1 Jan 2001
    assertEquals("01.01.02001", str);
  }
}
