Revision: 7212 Author: [email protected] Date: Mon Nov 30 20:39:13 2009 Log: Fix standalone month/day-of-week handling.
Patch by: jat Review by: shanjian http://code.google.com/p/google-web-toolkit/source/detail?r=7212 Added: /trunk/user/test/com/google/gwt/i18n/I18NTest_fil.gwt.xml /trunk/user/test/com/google/gwt/i18n/I18NTest_pl.gwt.xml /trunk/user/test/com/google/gwt/i18n/client/DateTimeFormat_fil_Test.java /trunk/user/test/com/google/gwt/i18n/client/DateTimeFormat_pl_Test.java Modified: /trunk/user/src/com/google/gwt/i18n/client/DateTimeFormat.java /trunk/user/test/com/google/gwt/i18n/I18NSuite.java /trunk/user/test/com/google/gwt/i18n/client/DateTimeFormat_en_Test.java /trunk/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java ======================================= --- /dev/null +++ /trunk/user/test/com/google/gwt/i18n/I18NTest_fil.gwt.xml Mon Nov 30 20:39:13 2009 @@ -0,0 +1,23 @@ +<!-- --> +<!-- Copyright 2009 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 --> +<!-- 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. License for the specific language governing permissions and --> +<!-- limitations under the License. --> + +<module> + <!-- Inherit the JUnit support --> + <inherits name='com.google.gwt.junit.JUnit'/> + <inherits name='com.google.gwt.i18n.I18N'/> + <!-- Include client-side source for the test cases --> + <source path="client"/> + <extend-property name="locale" values="fil"/> + <set-property name="locale" value = "fil"/> +</module> ======================================= --- /dev/null +++ /trunk/user/test/com/google/gwt/i18n/I18NTest_pl.gwt.xml Mon Nov 30 20:39:13 2009 @@ -0,0 +1,23 @@ +<!-- --> +<!-- Copyright 2009 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 --> +<!-- 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. License for the specific language governing permissions and --> +<!-- limitations under the License. --> + +<module> + <!-- Inherit the JUnit support --> + <inherits name='com.google.gwt.junit.JUnit'/> + <inherits name='com.google.gwt.i18n.I18N'/> + <!-- Include client-side source for the test cases --> + <source path="client"/> + <extend-property name="locale" values="pl"/> + <set-property name="locale" value = "pl"/> +</module> ======================================= --- /dev/null +++ /trunk/user/test/com/google/gwt/i18n/client/DateTimeFormat_fil_Test.java Mon Nov 30 20:39:13 2009 @@ -0,0 +1,63 @@ +/* + * Copyright 2009 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.junit.client.GWTTestCase; + +import java.util.Date; + +/** + * Tests unique functionality in {...@link DateTimeFormat} for the Filipino + * language. + */ +...@suppresswarnings("deprecation") +public class DateTimeFormat_fil_Test extends GWTTestCase { + + @Override + public String getModuleName() { + return "com.google.gwt.i18n.I18NTest_fil"; + } + + public void test_ccc() { + Date date = new Date(2006 - 1900, 6, 26, 13, 10, 10); + assertEquals("Miy", DateTimeFormat.getFormat("ccc").format(date)); + } + + public void test_cccc() { + Date date = new Date(2006 - 1900, 6, 26, 13, 10, 10); + assertEquals("Miyerkules", DateTimeFormat.getFormat("cccc").format(date)); + } + + public void test_ccccc() { + Date date = new Date(2006 - 1900, 6, 26, 13, 10, 10); + assertEquals("M", DateTimeFormat.getFormat("ccccc").format(date)); + } + + public void test_EEE() { + Date date = new Date(2006 - 1900, 6, 26, 13, 10, 10); + assertEquals("Mye", DateTimeFormat.getFormat("EEE").format(date)); + } + + public void test_EEEE() { + Date date = new Date(2006 - 1900, 6, 26, 13, 10, 10); + assertEquals("Miyerkules", DateTimeFormat.getFormat("EEEE").format(date)); + } + + public void test_EEEEE() { + Date date = new Date(2006 - 1900, 6, 26, 13, 10, 10); + assertEquals("M", DateTimeFormat.getFormat("EEEEE").format(date)); + } +} ======================================= --- /dev/null +++ /trunk/user/test/com/google/gwt/i18n/client/DateTimeFormat_pl_Test.java Mon Nov 30 20:39:13 2009 @@ -0,0 +1,73 @@ +/* + * Copyright 2009 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.junit.client.GWTTestCase; + +import java.util.Date; + +/** + * Tests unique functionality in {...@link DateTimeFormat} for the Polish + * language. + */ +...@suppresswarnings("deprecation") +public class DateTimeFormat_pl_Test extends GWTTestCase { + + @Override + public String getModuleName() { + return "com.google.gwt.i18n.I18NTest_pl"; + } + + 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("lip", DateTimeFormat.getFormat("LLL").format(date)); + } + + public void test_LLLL() { + Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10); + assertEquals("lipiec", DateTimeFormat.getFormat("LLLL").format(date)); + } + + public void test_LLLLL() { + Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10); + assertEquals("l", DateTimeFormat.getFormat("LLLLL").format(date)); + } + + public void test_MM() { + Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10); + assertEquals("07", DateTimeFormat.getFormat("MM").format(date)); + } + + public void test_MMM() { + Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10); + assertEquals("lip", DateTimeFormat.getFormat("MMM").format(date)); + } + + public void test_MMMM() { + Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10); + assertEquals("lipca", DateTimeFormat.getFormat("MMMM").format(date)); + } + + public void test_MMMMM() { + Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10); + assertEquals("l", DateTimeFormat.getFormat("MMMMM").format(date)); + } +} ======================================= --- /trunk/user/src/com/google/gwt/i18n/client/DateTimeFormat.java Mon Nov 16 13:52:38 2009 +++ /trunk/user/src/com/google/gwt/i18n/client/DateTimeFormat.java Mon Nov 30 20:39:13 2009 @@ -49,6 +49,13 @@ * <td><code>1996</code></td> * </tr> * + * <tr> + * <td><code>L</code></td> + * <td>standalone month in year</td> + * <td>Text or Number</td> + * <td><code>July (or) 07</code></td> + * </tr> + * * <tr> * <td><code>M</code></td> * <td>month in year</td> @@ -185,7 +192,9 @@ * <dd>3 or more, use text, otherwise use number. (e.g. <code>"M"</code> * produces <code>"1"</code>, <code>"MM"</code> produces <code>"01"</code>, * <code>"MMM"</code> produces <code>"Jan"</code>, and <code>"MMMM"</code> - * produces <code>"January"</code>.</dd> + * produces <code>"January"</code>. Some pattern letters also treat a count + * of 5 specially, meaning a single-letter abbreviation: <code>L</code>, + * <code>M</code>, <code>E</code>, and <code>c</code>.</dd> * </dl> * * <p> @@ -407,9 +416,10 @@ private static DateTimeFormat cachedShortDateTimeFormat; private static final int NUM_MILLISECONDS_IN_DAY = 24 * 60 * 60000; - private static final String PATTERN_CHARS = "GyMdkHmsSEDahKzZv"; - - private static final String NUMERIC_FORMAT_CHARS = "MydhHmsSDkK"; + private static final String PATTERN_CHARS = "GyMLdkHmsSEcDahKzZv"; + + // Note: M & L must be the first two characters + private static final String NUMERIC_FORMAT_CHARS = "MLydhHmsSDkK"; private static final String WHITE_SPACE = " \t\r\n"; @@ -918,8 +928,6 @@ * Formats AM/PM field according to pattern specified. * * @param buf where formatted string will be appended to - * @param count number of time pattern char repeats; this controls how a field - * should be formatted * @param date hold the date object to be formatted */ private void formatAmPm(StringBuffer buf, Date date) { @@ -953,7 +961,9 @@ */ private void formatDayOfWeek(StringBuffer buf, int count, Date date) { int value = date.getDay(); - if (count >= 4) { + if (count == 5) { + buf.append(dateTimeConstants.narrowWeekdays()[value]); + } else if (count == 4) { buf.append(dateTimeConstants.weekdays()[value]); } else { buf.append(dateTimeConstants.shortWeekdays()[value]); @@ -1039,7 +1049,7 @@ buf.append(dateTimeConstants.narrowMonths()[value]); break; case 4: - buf.append(dateTimeConstants.standaloneMonths()[value]); + buf.append(dateTimeConstants.months()[value]); break; case 3: buf.append(dateTimeConstants.shortMonths()[value]); @@ -1236,7 +1246,8 @@ return false; } int i = NUMERIC_FORMAT_CHARS.indexOf(part.text.charAt(0)); - return (i > 0 || (i == 0 && part.count < 3)); + // M & L (index 0 and 1) are only numeric if there are less than 3 chars + return (i > 1 || (i >= 0 && part.count < 3)); } /** @@ -1697,50 +1708,54 @@ } switch (ch) { - case 'G': // 'G' - ERA + case 'G': // era value = matchString(text, start, dateTimeConstants.eras(), pos); cal.setEra(value); return true; - case 'M': // 'M' - MONTH + case 'M': // month return subParseMonth(text, pos, cal, value, start); - case 'E': + case 'L': // standalone month + return subParseStandaloneMonth(text, pos, cal, value, start); + case 'E': // day of week return subParseDayOfWeek(text, pos, start, cal); - case 'a': // 'a' - AM_PM + case 'c': // standalone day of week + return subParseStandaloneDay(text, pos, start, cal); + case 'a': // AM/PM value = matchString(text, start, dateTimeConstants.ampms(), pos); cal.setAmpm(value); return true; - case 'y': // 'y' - YEAR + case 'y': // year return subParseYear(text, pos, start, value, part, cal); - case 'd': // 'd' - DATE + case 'd': // day of month if (value <= 0) { return false; } cal.setDayOfMonth(value); return true; - case 'S': // 'S' - FRACTIONAL_SECOND + case 'S': // fractional seconds return subParseFractionalSeconds(value, start, pos[0], cal); - case 'h': // 'h' - HOUR (1..12) + case 'h': // hour (1..12) if (value == 12) { value = 0; } // fall through - case 'K': // 'K' - HOUR (0..11) - case 'H': // 'H' - HOUR_OF_DAY (0..23) + case 'K': // hour (0..11) + case 'H': // hour (0..23) cal.setHours(value); return true; - case 'k': // 'k' - HOUR_OF_DAY (1..24) + case 'k': // hour (1..24) cal.setHours(value); return true; - case 'm': // 'm' - MINUTE + case 'm': // minute cal.setMinutes(value); return true; - case 's': // 's' - SECOND + case 's': // second cal.setSeconds(value); return true; - case 'z': // 'z' - ZONE_OFFSET - case 'Z': // 'Z' - TIMEZONE_RFC - case 'v': // 'v' - TIMEZONE_GENERIC + case 'z': // time zone offset + case 'Z': // time zone RFC + case 'v': // time zone generic return subParseTimeZoneInGMT(text, start, pos, cal); default: return false; @@ -1807,7 +1822,7 @@ } /** - * Method subParseMonth parses Month field. + * Parses Month field. * * @param text the time text to be parsed * @param pos Parse position @@ -1839,6 +1854,72 @@ } return false; } + + /** + * Parses standalone day of the week field. + * + * @param text the time text to be parsed + * @param pos Parse position + * @param start from where parse start + * @param cal DateRecord object that holds parsed value + * + * @return <code>true</code> if parsing successful, otherwise + * <code>false</code> + */ + private boolean subParseStandaloneDay(String text, int[] pos, int start, + DateRecord cal) { + int value; + // 'c' - DAY_OF_WEEK + // Want to be able to parse both short and long forms. + // Try count == 4 (cccc) first: + value = matchString(text, start, dateTimeConstants.standaloneWeekdays(), + pos); + if (value < 0) { + value = matchString(text, start, + dateTimeConstants.standaloneShortWeekdays(), pos); + } + if (value < 0) { + return false; + } + cal.setDayOfWeek(value); + return true; + } + + /** + * Parses a standalone month field. + * + * @param text the time text to be parsed + * @param pos Parse position + * @param cal DateRecord object that will hold parsed value + * @param value numeric value if this field is expressed using numberic + * pattern + * @param start from where parse start + * + * @return <code>true</code> if parsing successful + */ + private boolean subParseStandaloneMonth(String text, int[] pos, + DateRecord cal, int value, int start) { + // When month is symbols, i.e., LLL or LLLL, value will be -1. + if (value < 0) { + // Want to be able to parse both short and long forms. + // Try count == 4 first: + value = matchString(text, start, + dateTimeConstants.standaloneMonths(), pos); + if (value < 0) { // count == 4 failed, now try count == 3. + value = matchString(text, start, + dateTimeConstants.standaloneShortMonths(), pos); + } + if (value < 0) { + return false; + } + cal.setMonth(value); + return true; + } else if (value > 0) { + cal.setMonth(value - 1); + return true; + } + return false; + } /** * Method parses GMT type timezone. ======================================= --- /trunk/user/test/com/google/gwt/i18n/I18NSuite.java Tue Nov 10 11:52:25 2009 +++ /trunk/user/test/com/google/gwt/i18n/I18NSuite.java Mon Nov 30 20:39:13 2009 @@ -20,6 +20,8 @@ import com.google.gwt.i18n.client.CustomPluralsTest; import com.google.gwt.i18n.client.DateTimeFormat_de_Test; import com.google.gwt.i18n.client.DateTimeFormat_en_Test; +import com.google.gwt.i18n.client.DateTimeFormat_fil_Test; +import com.google.gwt.i18n.client.DateTimeFormat_pl_Test; import com.google.gwt.i18n.client.DateTimeParse_en_Test; import com.google.gwt.i18n.client.DateTimeParse_zh_CN_Test; import com.google.gwt.i18n.client.I18N2Test; @@ -61,6 +63,8 @@ suite.addTestSuite(CustomPluralsTest.class); suite.addTestSuite(DateTimeFormat_de_Test.class); suite.addTestSuite(DateTimeFormat_en_Test.class); + suite.addTestSuite(DateTimeFormat_fil_Test.class); + suite.addTestSuite(DateTimeFormat_pl_Test.class); suite.addTestSuite(DateTimeParse_en_Test.class); suite.addTestSuite(DateTimeParse_zh_CN_Test.class); suite.addTestSuite(GwtLocaleTest.class); ======================================= --- /trunk/user/test/com/google/gwt/i18n/client/DateTimeFormat_en_Test.java Mon Nov 16 13:52:38 2009 +++ /trunk/user/test/com/google/gwt/i18n/client/DateTimeFormat_en_Test.java Mon Nov 30 20:39:13 2009 @@ -25,11 +25,60 @@ * Tests formatting functionality in {...@link DateTimeFormat} for the English * language. */ +...@suppresswarnings("deprecation") public class DateTimeFormat_en_Test extends GWTTestCase { + @Override public String getModuleName() { return "com.google.gwt.i18n.I18NTest"; } + + 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_EEEEMMMddyy() { Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10); @@ -53,6 +102,26 @@ assertEquals("1:10:10 PM", DateTimeFormat.getFormat("h:mm:ss a").format( date)); } + + 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); @@ -227,37 +296,6 @@ date)); assertEquals("13 '", DateTimeFormat.getFormat("HH ''").format(date)); } - - public void test_yyyyyMMMMM() { - Date date = new Date(2006 - 1900, 6, 27, 13, 10, 10); - assertEquals("2006.J.27 AD 01:10 PM", DateTimeFormat.getFormat( - "yyyyy.MMMMM.dd GGG hh:mm aaa").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_simepleTimezonev() { TimeZone simpleTimeZone = TimeZone.createTimeZone(480); @@ -278,38 +316,22 @@ "MM/dd/yyyy HH:mm:ss vvvv").format(date, simpleTimeZone)); } - public void test_timezoneZ() { - TimeZoneConstants timeZoneData = GWT.create(TimeZoneConstants.class); - String str = timeZoneData.americaLosAngeles(); - TimeZone usPacific = TimeZone.createTimeZone(str); - + 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, 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 -0700", 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 -0800", 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)); + 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() { @@ -329,6 +351,31 @@ 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_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); @@ -366,54 +413,44 @@ usPacific)); } - public void test_simpleTimezonez() { - TimeZone simpleTimeZone = TimeZone.createTimeZone(420); + 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 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_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)); + 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 -0700", 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 -0800", 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("2006.J.27 AD 01:10 PM", DateTimeFormat.getFormat( + "yyyyy.MMMMM.dd GGG hh:mm aaa").format(date)); } public void testPre1970Milliseconds() { ======================================= --- /trunk/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java Fri Apr 17 14:54:39 2009 +++ /trunk/user/test/com/google/gwt/i18n/client/DateTimeParse_en_Test.java Mon Nov 30 20:39:13 2009 @@ -33,33 +33,6 @@ public String getModuleName() { return "com.google.gwt.i18n.I18NTest_en"; } - - private int parse(String pattern, String toParse, int startIndex, Date output) { - DateTimeFormat fmt = DateTimeFormat.getFormat(pattern); - return fmt.parse(toParse, startIndex, output); - } - - private String format(String pattern, Date toFormat) { - DateTimeFormat fmt = DateTimeFormat.getFormat(pattern); - return fmt.format(toFormat); - } - - public void testParseConsumesAllCharacters() { - String toParse = "July 11, 1938"; - DateTimeFormat longDateFormat = DateTimeFormat.getLongDateFormat(); - - Date actualDate = longDateFormat.parse(toParse); - String actualFormat = longDateFormat.format(actualDate); - assertEquals(toParse, actualFormat); - - try { - String toParseMangled = toParse + " asdfasdfasdf"; - longDateFormat.parse(toParseMangled); - fail("Should have thrown an exception on failure to parse"); - } catch (IllegalArgumentException e) { - // Success. - } - } public void testAbutField() { Date date = new Date(); @@ -130,6 +103,15 @@ assertTrue(parse("yy,MM,dd", "2097,07,21", 0, date) > 0); assertEquals(2097 - 1900, date.getYear()); } + + public void testDayOfWeek() { + Date date = new Date(); + + assertTrue(parse("EEE", "Wed", 0, date) > 0); + assertEquals(3, date.getDay()); + assertTrue(parse("EEEE", "Thursday", 0, date) > 0); + assertEquals(4, date.getDay()); + } public void testEnglishDate() { Date date = new Date(); @@ -166,6 +148,70 @@ assertEquals(13, date.getSeconds()); assertEquals(900, (date.getTime() % 1000)); } + + public void testHourParsingFhh() { + Date date = new Date(); + + assertTrue(parse("hhmm", "0022", 0, date) > 0); + assertTrue(date.getHours() == 00); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmm", "1122", 0, date) > 0); + assertTrue(date.getHours() == 11); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmm", "1222", 0, date) > 0); + assertTrue(date.getHours() == 0); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmm", "2322", 0, date) > 0); + assertTrue(date.getHours() == 23); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmm", "2422", 0, date) > 0); + assertTrue(date.getHours() == 0); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "0022am", 0, date) > 0); + assertTrue(date.getHours() == 00); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "1122am", 0, date) > 0); + assertTrue(date.getHours() == 11); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "1222am", 0, date) > 0); + assertTrue(date.getHours() == 0); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "2322am", 0, date) > 0); + assertTrue(date.getHours() == 23); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "2422am", 0, date) > 0); + assertTrue(date.getHours() == 0); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "0022pm", 0, date) > 0); + assertTrue(date.getHours() == 12); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "1122pm", 0, date) > 0); + assertTrue(date.getHours() == 23); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "1222pm", 0, date) > 0); + assertTrue(date.getHours() == 12); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "2322pm", 0, date) > 0); + assertTrue(date.getHours() == 23); + assertTrue(date.getMinutes() == 22); + + assertTrue(parse("hhmma", "2422pm", 0, date) > 0); + assertTrue(date.getHours() == 0); + assertTrue(date.getMinutes() == 22); + } public void testHourParsingFHH() { Date date = new Date(); @@ -230,66 +276,65 @@ assertEquals(22, date.getMinutes()); } - public void testHourParsingFhh() { + public void testHourParsingFkk() { Date date = new Date(); - - assertTrue(parse("hhmm", "0022", 0, date) > 0); + assertTrue(parse("kkmm", "0022", 0, date) > 0); assertTrue(date.getHours() == 00); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmm", "1122", 0, date) > 0); + assertTrue(parse("kkmm", "1122", 0, date) > 0); assertTrue(date.getHours() == 11); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmm", "1222", 0, date) > 0); - assertTrue(date.getHours() == 0); + assertTrue(parse("kkmm", "1222", 0, date) > 0); + assertTrue(date.getHours() == 12); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmm", "2322", 0, date) > 0); + assertTrue(parse("kkmm", "2322", 0, date) > 0); assertTrue(date.getHours() == 23); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmm", "2422", 0, date) > 0); + assertTrue(parse("kkmm", "2422", 0, date) > 0); assertTrue(date.getHours() == 0); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "0022am", 0, date) > 0); + assertTrue(parse("kkmma", "0022am", 0, date) > 0); assertTrue(date.getHours() == 00); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "1122am", 0, date) > 0); + assertTrue(parse("kkmma", "1122am", 0, date) > 0); assertTrue(date.getHours() == 11); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "1222am", 0, date) > 0); - assertTrue(date.getHours() == 0); + assertTrue(parse("kkmma", "1222am", 0, date) > 0); + assertTrue(date.getHours() == 12); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "2322am", 0, date) > 0); + assertTrue(parse("kkmma", "2322am", 0, date) > 0); assertTrue(date.getHours() == 23); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "2422am", 0, date) > 0); + assertTrue(parse("kkmma", "2422am", 0, date) > 0); assertTrue(date.getHours() == 0); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "0022pm", 0, date) > 0); + assertTrue(parse("kkmma", "0022pm", 0, date) > 0); assertTrue(date.getHours() == 12); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "1122pm", 0, date) > 0); + assertTrue(parse("kkmma", "1122pm", 0, date) > 0); assertTrue(date.getHours() == 23); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "1222pm", 0, date) > 0); + assertTrue(parse("kkmma", "1222pm", 0, date) > 0); assertTrue(date.getHours() == 12); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "2322pm", 0, date) > 0); + assertTrue(parse("kkmma", "2322pm", 0, date) > 0); assertTrue(date.getHours() == 23); assertTrue(date.getMinutes() == 22); - assertTrue(parse("hhmma", "2422pm", 0, date) > 0); + assertTrue(parse("kkmma", "2422pm", 0, date) > 0); assertTrue(date.getHours() == 0); assertTrue(date.getMinutes() == 22); } @@ -357,67 +402,26 @@ assertTrue(date.getMinutes() == 22); } - public void testHourParsingFkk() { - Date date = new Date(); - assertTrue(parse("kkmm", "0022", 0, date) > 0); - assertTrue(date.getHours() == 00); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmm", "1122", 0, date) > 0); - assertTrue(date.getHours() == 11); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmm", "1222", 0, date) > 0); - assertTrue(date.getHours() == 12); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmm", "2322", 0, date) > 0); - assertTrue(date.getHours() == 23); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmm", "2422", 0, date) > 0); - assertTrue(date.getHours() == 0); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "0022am", 0, date) > 0); - assertTrue(date.getHours() == 00); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "1122am", 0, date) > 0); - assertTrue(date.getHours() == 11); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "1222am", 0, date) > 0); - assertTrue(date.getHours() == 12); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "2322am", 0, date) > 0); - assertTrue(date.getHours() == 23); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "2422am", 0, date) > 0); - assertTrue(date.getHours() == 0); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "0022pm", 0, date) > 0); - assertTrue(date.getHours() == 12); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "1122pm", 0, date) > 0); - assertTrue(date.getHours() == 23); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "1222pm", 0, date) > 0); - assertTrue(date.getHours() == 12); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "2322pm", 0, date) > 0); - assertTrue(date.getHours() == 23); - assertTrue(date.getMinutes() == 22); - - assertTrue(parse("kkmma", "2422pm", 0, date) > 0); - assertTrue(date.getHours() == 0); - assertTrue(date.getMinutes() == 22); + public void testInvalidDayAndMonth() { + DateTimeFormat fmt = DateTimeFormat.getFormat("MM/dd/yyyy"); + try { + fmt.parseStrict("00/22/1999"); + fail("Should have thrown an exception on failure to parse"); + } catch (IllegalArgumentException e) { + // Success + } + try { + fmt.parseStrict("01/00/1999"); + fail("Should have thrown an exception on failure to parse"); + } catch (IllegalArgumentException e) { + // Success + } + try { + fmt.parseStrict("01/22/1999"); + // success + } catch (IllegalArgumentException e) { + fail("Should succeed to parse"); + } } public void testLeapYear() { @@ -431,24 +435,6 @@ assertTrue(date.getMonth() == 2 - 1); assertTrue(date.getDate() == 29); } - - public void testPartialParsing() { - // Only specify a date - DateTimeFormat fmt = DateTimeFormat.getFormat("MM-dd-yyyy"); - Date dateActual = new Date(87, 10, 22); - Date dateOnly = fmt.parse("11-22-1987"); - assertEquals(dateOnly.getHours(), 0); - assertEquals(dateOnly.getMinutes(), 0); - assertEquals(dateOnly.getSeconds(), 0); - assertEquals(dateOnly.getTime(), dateActual.getTime()); - - // Only specify a time, should use current date - fmt = DateTimeFormat.getFormat("hha"); - dateOnly = fmt.parse("4PM"); - assertEquals(dateOnly.getHours(), 16); - assertEquals(dateOnly.getMinutes(), 0); - assertEquals(dateOnly.getSeconds(), 0); - } public void testLenientParsing() { Date date = new Date(); @@ -529,6 +515,52 @@ assertTrue(yyFmt.parse(sAmbPrev, 0, date) > 0); assertEquals(0, yyFmt.parseStrict(sAmbNext, 0, date)); } + + public void testMonth() { + Date date = new Date(1980, 1, 1); + + assertTrue(parse("MM", "03", 0, date) > 0); + assertEquals(2, date.getMonth()); + assertTrue(parse("MMM", "Feb", 0, date) > 0); + assertEquals(1, date.getMonth()); + assertTrue(parse("MMMM", "July", 0, date) > 0); + assertEquals(6, date.getMonth()); + } + + public void testParseConsumesAllCharacters() { + String toParse = "July 11, 1938"; + DateTimeFormat longDateFormat = DateTimeFormat.getLongDateFormat(); + + Date actualDate = longDateFormat.parse(toParse); + String actualFormat = longDateFormat.format(actualDate); + assertEquals(toParse, actualFormat); + + try { + String toParseMangled = toParse + " asdfasdfasdf"; + longDateFormat.parse(toParseMangled); + fail("Should have thrown an exception on failure to parse"); + } catch (IllegalArgumentException e) { + // Success. + } + } + + public void testPartialParsing() { + // Only specify a date + DateTimeFormat fmt = DateTimeFormat.getFormat("MM-dd-yyyy"); + Date dateActual = new Date(87, 10, 22); + Date dateOnly = fmt.parse("11-22-1987"); + assertEquals(dateOnly.getHours(), 0); + assertEquals(dateOnly.getMinutes(), 0); + assertEquals(dateOnly.getSeconds(), 0); + assertEquals(dateOnly.getTime(), dateActual.getTime()); + + // Only specify a time, should use current date + fmt = DateTimeFormat.getFormat("hha"); + dateOnly = fmt.parse("4PM"); + assertEquals(dateOnly.getHours(), 16); + assertEquals(dateOnly.getMinutes(), 0); + assertEquals(dateOnly.getSeconds(), 0); + } public void testRFC3339() { Date date = new Date(); @@ -575,6 +607,26 @@ assertEquals(520, date.getTime() % 1000); } } + + public void testStandloneDayOfWeek() { + Date date = new Date(1980, 1, 1); + + assertTrue(parse("ccc", "Wed", 0, date) > 0); + assertEquals(3, date.getDay()); + assertTrue(parse("cccc", "Thursday", 0, date) > 0); + assertEquals(4, date.getDay()); + } + + public void testStandloneMonth() { + Date date = new Date(1980, 1, 1); + + assertTrue(parse("LL", "03", 0, date) > 0); + assertEquals(2, date.getMonth()); + assertTrue(parse("LLL", "Feb", 0, date) > 0); + assertEquals(1, date.getMonth()); + assertTrue(parse("LLLL", "July", 0, date) > 0); + assertEquals(6, date.getMonth()); + } public void testTimeZone() { Date date = new Date(); @@ -638,25 +690,13 @@ assertTrue(date.getDate() == 02); } - public void testInvalidDayAndMonth() { - DateTimeFormat fmt = DateTimeFormat.getFormat("MM/dd/yyyy"); - try { - fmt.parseStrict("00/22/1999"); - fail("Should have thrown an exception on failure to parse"); - } catch (IllegalArgumentException e) { - // Success - } - try { - fmt.parseStrict("01/00/1999"); - fail("Should have thrown an exception on failure to parse"); - } catch (IllegalArgumentException e) { - // Success - } - try { - fmt.parseStrict("01/22/1999"); - // success - } catch (IllegalArgumentException e) { - fail("Should succeed to parse"); - } + private String format(String pattern, Date toFormat) { + DateTimeFormat fmt = DateTimeFormat.getFormat(pattern); + return fmt.format(toFormat); + } + + private int parse(String pattern, String toParse, int startIndex, Date output) { + DateTimeFormat fmt = DateTimeFormat.getFormat(pattern); + return fmt.parse(toParse, startIndex, output); } } -- http://groups.google.com/group/Google-Web-Toolkit-Contributors
