blob: a4012a81735aa21c400e14130ced2674341c9025 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 libcore.java.text;
import java.text.DateFormat;
import java.text.DateFormatSymbols;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.SimpleTimeZone;
import java.util.TimeZone;
public class OldSimpleDateFormatTest extends junit.framework.TestCase {
SimpleDateFormat format = new SimpleDateFormat("", Locale.ENGLISH);
SimpleDateFormat pFormat = new SimpleDateFormat("", Locale.ENGLISH);
class FormatTester {
boolean testsFailed = false;
public void test(String pattern, Calendar cal, String expected, int field) {
StringBuffer buffer = new StringBuffer();
FieldPosition position = new FieldPosition(field);
format.applyPattern(pattern);
format.format(cal.getTime(), buffer, position);
String result = buffer.toString();
if (!result.equals(expected)) {
System.out.println("Wrong format: \"" + pattern
+ "\" expected: " + expected + " result: "
+ result);
testsFailed = true;
}
}
public void parse(String pattern, String input, Date expected, int start, int end) {
pFormat.applyPattern(pattern);
ParsePosition position = new ParsePosition(start);
Date result = pFormat.parse(input, position);
assertTrue("Wrong result: " + pattern + " input: " + input
+ " expected: " + expected + " result: " + result, expected
.equals(result));
assertTrue("Wrong end position: " + pattern + " input: " + input,
position.getIndex() == end);
}
public void verifyFormatTimezone(String timeZoneId, String expected1,
String expected2, Date date) {
format.setTimeZone(SimpleTimeZone.getTimeZone(timeZoneId));
format.applyPattern("z, zzzz");
assertEquals("Test z for TimeZone : " + timeZoneId, expected1,
format.format(date));
format.applyPattern("Z, ZZZZ");
assertEquals("Test Z for TimeZone : " + timeZoneId, expected2,
format.format(date));
}
}
/**
* @tests java.text.SimpleDateFormat#SimpleDateFormat(java.lang.String,
* java.text.DateFormatSymbols)
*/
public void test_ConstructorLjava_lang_StringLjava_text_DateFormatSymbols() {
// Test for method java.text.SimpleDateFormat(java.lang.String,
// java.text.DateFormatSymbols)
DateFormatSymbols symbols = new DateFormatSymbols(Locale.ENGLISH);
symbols.setEras(new String[] { "Before", "After" });
SimpleDateFormat f2 = new SimpleDateFormat("y'y'yy", symbols);
assertTrue("Wrong class", f2.getClass() == SimpleDateFormat.class);
assertEquals("Wrong pattern", "y'y'yy", f2.toPattern());
assertTrue("Wrong symbols", f2.getDateFormatSymbols().equals(symbols));
assertTrue("Doesn't work",
f2.format(new Date()).getClass() == String.class);
try {
new SimpleDateFormat(null, symbols);
fail("NullPointerException was not thrown.");
} catch(NullPointerException npe) {
//expected
}
try {
new SimpleDateFormat("eee", symbols);
fail("IllegalArgumentException was not thrown.");
} catch(IllegalArgumentException iae) {
//expected
}
}
public void test_ConstructorLjava_lang_StringLjava_util_Locale() {
// Test for method java.text.SimpleDateFormat(java.lang.String,
// java.util.Locale)
SimpleDateFormat f2 = new SimpleDateFormat("'yyyy' MM yy",
Locale.GERMAN);
assertTrue("Wrong class", f2.getClass() == SimpleDateFormat.class);
assertEquals("Wrong pattern", "'yyyy' MM yy", f2.toPattern());
assertTrue("Wrong symbols", f2.getDateFormatSymbols().equals(
new DateFormatSymbols(Locale.GERMAN)));
assertTrue("Doesn't work",
f2.format(new Date()).getClass() == String.class);
try {
new SimpleDateFormat(null, Locale.GERMAN);
fail("NullPointerException was not thrown.");
} catch(NullPointerException npe) {
//expected
}
try {
new SimpleDateFormat("eee", Locale.GERMAN);
fail("IllegalArgumentException was not thrown.");
} catch(IllegalArgumentException iae) {
//expected
}
}
public void test_applyLocalizedPatternLjava_lang_String() {
// Test for method void
// java.text.SimpleDateFormat.applyLocalizedPattern(java.lang.String)
SimpleDateFormat f2 = new SimpleDateFormat("y", new Locale("de", "CH"));
// BEGIN android-removed
// This test doesn't work like this. The cause lies inside of icu
// that doesn't support localized pattern characters anymore. So this
// test fails because the pattern template contains characters that are
// not part of the standard pattern returned for every locale.
// The default pattern characters are: GyMdkHmsSEDFwWahKzZ
//
// f2.applyLocalizedPattern("GuMtkHmsSEDFwWahKz");
// String pattern = f2.toPattern();
// assertTrue("Wrong pattern: " + pattern, pattern
// .equals("GyMdkHmsSEDFwWahKz"));
//
// test the new "Z" pattern char
// f2 = new SimpleDateFormat("y", new Locale("de", "CH"));
// f2.applyLocalizedPattern("G u M t Z");
// pattern = f2.toPattern();
// assertTrue("Wrong pattern: " + pattern, pattern.equals("G y M d Z"));
// END android-removed
// test invalid patterns
try {
f2.applyLocalizedPattern("b");
fail("Expected IllegalArgumentException for pattern with invalid pattern letter: b");
} catch (IllegalArgumentException e) {
}
try {
// ICU only! this fails on the RI
f2.applyLocalizedPattern("u");
fail("Expected IllegalArgumentException for pattern with invalid pattern letter: u");
} catch (IllegalArgumentException e) {
}
try {
f2.applyLocalizedPattern("a '");
fail("Expected IllegalArgumentException for pattern with unterminated quote: a '");
} catch (IllegalArgumentException e) {
}
try {
f2.applyLocalizedPattern(null);
fail("Expected NullPointerException for null pattern");
} catch (NullPointerException e) {
}
}
/**
* @tests java.text.SimpleDateFormat#applyPattern(java.lang.String)
*/
public void test_applyPatternLjava_lang_String() {
// Test for method void
// java.text.SimpleDateFormat.applyPattern(java.lang.String)
SimpleDateFormat f2 = new SimpleDateFormat("y", new Locale("de", "CH"));
// BEGIN android-changed
f2.applyPattern("GyMdkHmsSEDFwWahKzZ");
assertEquals("Wrong pattern", "GyMdkHmsSEDFwWahKzZ", f2.toPattern());
// END android-changed
// test invalid patterns
try {
f2.applyPattern("u");
fail("Expected IllegalArgumentException for pattern with invalid patter letter: u");
} catch (IllegalArgumentException e) {
}
}
public void test_hashCode() {
SimpleDateFormat format = (SimpleDateFormat) DateFormat.getInstance();
SimpleDateFormat clone = (SimpleDateFormat) format.clone();
assertTrue("clone has not equal hash code", clone.hashCode() == format
.hashCode());
format.format(new Date());
assertTrue("clone has not equal hash code after format", clone
.hashCode() == format.hashCode());
DateFormatSymbols symbols = new DateFormatSymbols(Locale.ENGLISH);
symbols.setEras(new String[] { "Before", "After" });
SimpleDateFormat format2 = new SimpleDateFormat("y'y'yy", symbols);
assertFalse("objects has equal hash code", format2.hashCode() == format
.hashCode());
}
public void test_formatLjava_util_DateLjava_lang_StringBufferLjava_text_FieldPosition() {
FormatTester test = new FormatTester();
Calendar cal = new GregorianCalendar(1999, Calendar.JUNE, 2, 15, 3, 6);
test.test(" G", cal, " AD", DateFormat.ERA_FIELD);
test.test(" GG", cal, " AD", DateFormat.ERA_FIELD);
test.test(" GGG", cal, " AD", DateFormat.ERA_FIELD);
test.test(" G", new GregorianCalendar(-1999, Calendar.JUNE, 2), " BC",
DateFormat.ERA_FIELD);
test.test(" M", cal, " 6", DateFormat.MONTH_FIELD);
test.test(" M", new GregorianCalendar(1999, Calendar.NOVEMBER, 2),
" 11", DateFormat.MONTH_FIELD);
test.test(" MM", cal, " 06", DateFormat.MONTH_FIELD);
test.test(" MMM", cal, " Jun", DateFormat.MONTH_FIELD);
test.test(" MMMM", cal, " June", DateFormat.MONTH_FIELD);
test.test(" MMMMM", cal, " June", DateFormat.MONTH_FIELD);
test.test(" d", cal, " 2", DateFormat.DATE_FIELD);
test.test(" d", new GregorianCalendar(1999, Calendar.NOVEMBER, 12),
" 12", DateFormat.DATE_FIELD);
test.test(" dd", cal, " 02", DateFormat.DATE_FIELD);
test.test(" dddd", cal, " 0002", DateFormat.DATE_FIELD);
test.test(" h", cal, " 3", DateFormat.HOUR1_FIELD);
test.test(" h", new GregorianCalendar(1999, Calendar.NOVEMBER, 12),
" 12", DateFormat.HOUR1_FIELD);
test.test(" hh", cal, " 03", DateFormat.HOUR1_FIELD);
test.test(" hhhh", cal, " 0003", DateFormat.HOUR1_FIELD);
test.test(" H", cal, " 15", DateFormat.HOUR_OF_DAY0_FIELD);
test.test(" H",
new GregorianCalendar(1999, Calendar.NOVEMBER, 12, 4, 0), " 4",
DateFormat.HOUR_OF_DAY0_FIELD);
test.test(" H", new GregorianCalendar(1999, Calendar.NOVEMBER, 12, 12,
0), " 12", DateFormat.HOUR_OF_DAY0_FIELD);
test.test(" H", new GregorianCalendar(1999, Calendar.NOVEMBER, 12),
" 0", DateFormat.HOUR_OF_DAY0_FIELD);
test.test(" HH", cal, " 15", DateFormat.HOUR_OF_DAY0_FIELD);
test.test(" HHHH", cal, " 0015", DateFormat.HOUR_OF_DAY0_FIELD);
test.test(" m", cal, " 3", DateFormat.MINUTE_FIELD);
test.test(" m", new GregorianCalendar(1999, Calendar.NOVEMBER, 12, 4,
47), " 47", DateFormat.MINUTE_FIELD);
test.test(" mm", cal, " 03", DateFormat.MINUTE_FIELD);
test.test(" mmmm", cal, " 0003", DateFormat.MINUTE_FIELD);
test.test(" s", cal, " 6", DateFormat.SECOND_FIELD);
test.test(" s", new GregorianCalendar(1999, Calendar.NOVEMBER, 12, 4,
47, 13), " 13", DateFormat.SECOND_FIELD);
test.test(" ss", cal, " 06", DateFormat.SECOND_FIELD);
test.test(" ssss", cal, " 0006", DateFormat.SECOND_FIELD);
test.test(" S", cal, " 0", DateFormat.MILLISECOND_FIELD);
Calendar temp = new GregorianCalendar();
temp.set(Calendar.MILLISECOND, 961);
test.test(" SS", temp, " 961", DateFormat.MILLISECOND_FIELD);
test.test(" SSSS", cal, " 0000", DateFormat.MILLISECOND_FIELD);
test.test(" SS", cal, " 00", DateFormat.MILLISECOND_FIELD);
test.test(" E", cal, " Wed", DateFormat.DAY_OF_WEEK_FIELD);
test.test(" EE", cal, " Wed", DateFormat.DAY_OF_WEEK_FIELD);
test.test(" EEE", cal, " Wed", DateFormat.DAY_OF_WEEK_FIELD);
test.test(" EEEE", cal, " Wednesday", DateFormat.DAY_OF_WEEK_FIELD);
test.test(" EEEEE", cal, " Wednesday", DateFormat.DAY_OF_WEEK_FIELD);
test.test(" D", cal, " 153", DateFormat.DAY_OF_YEAR_FIELD);
test.test(" DD", cal, " 153", DateFormat.DAY_OF_YEAR_FIELD);
test.test(" DDDD", cal, " 0153", DateFormat.DAY_OF_YEAR_FIELD);
test.test(" F", cal, " 1", DateFormat.DAY_OF_WEEK_IN_MONTH_FIELD);
test.test(" F", new GregorianCalendar(1999, Calendar.NOVEMBER, 14),
" 2", DateFormat.DAY_OF_WEEK_IN_MONTH_FIELD);
test.test(" FF", cal, " 01", DateFormat.DAY_OF_WEEK_IN_MONTH_FIELD);
test.test(" FFFF", cal, " 0001", DateFormat.DAY_OF_WEEK_IN_MONTH_FIELD);
test.test(" a", cal, " PM", DateFormat.AM_PM_FIELD);
test.test(" a", new GregorianCalendar(1999, Calendar.NOVEMBER, 14),
" AM", DateFormat.AM_PM_FIELD);
test.test(" a", new GregorianCalendar(1999, Calendar.NOVEMBER, 14, 12,
0), " PM", DateFormat.AM_PM_FIELD);
test.test(" aa", cal, " PM", DateFormat.AM_PM_FIELD);
test.test(" aaa", cal, " PM", DateFormat.AM_PM_FIELD);
test.test(" aaaa", cal, " PM", DateFormat.AM_PM_FIELD);
test.test(" aaaaa", cal, " PM", DateFormat.AM_PM_FIELD);
test.test(" k", cal, " 15", DateFormat.HOUR_OF_DAY1_FIELD);
test.test(" k",
new GregorianCalendar(1999, Calendar.NOVEMBER, 12, 4, 0), " 4",
DateFormat.HOUR_OF_DAY1_FIELD);
test.test(" k", new GregorianCalendar(1999, Calendar.NOVEMBER, 12, 12,
0), " 12", DateFormat.HOUR_OF_DAY1_FIELD);
test.test(" k", new GregorianCalendar(1999, Calendar.NOVEMBER, 12),
" 24", DateFormat.HOUR_OF_DAY1_FIELD);
test.test(" kk", cal, " 15", DateFormat.HOUR_OF_DAY1_FIELD);
test.test(" kkkk", cal, " 0015", DateFormat.HOUR_OF_DAY1_FIELD);
test.test(" K", cal, " 3", DateFormat.HOUR0_FIELD);
test.test(" K", new GregorianCalendar(1999, Calendar.NOVEMBER, 12),
" 0", DateFormat.HOUR0_FIELD);
test.test(" KK", cal, " 03", DateFormat.HOUR0_FIELD);
test.test(" KKKK", cal, " 0003", DateFormat.HOUR0_FIELD);
format.applyPattern("'Mkz''':.@5");
assertEquals("Wrong output", "Mkz':.@5", format.format(new Date()));
//assertTrue("Tests failed", !test.testsFailed());
// Test invalid args to format.
SimpleDateFormat dateFormat = new SimpleDateFormat();
try {
dateFormat.format(null, new StringBuffer(), new FieldPosition(1));
fail("Expected test to throw NPE.");
} catch (NullPointerException ex) {
// expected
} catch (Throwable ex) {
fail("Expected test to throw NPE, not " + ex.getClass().getName());
}
assertFalse(test.testsFailed);
}
/**
* This test assumes Unicode behavior where 'y' and 'yyy' don't truncate,
* which means that it will fail on the RI.
*/
public void testFormattingYear() {
FormatTester test = new FormatTester();
Calendar cal = new GregorianCalendar(1999, Calendar.JUNE, 2, 15, 3, 6);
test.test(" y", cal, " 1999", DateFormat.YEAR_FIELD);
test.test(" yy", cal, " 99", DateFormat.YEAR_FIELD);
test.test(" yy", new GregorianCalendar(2001, Calendar.JUNE, 2), " 01",
DateFormat.YEAR_FIELD);
test.test(" yy", new GregorianCalendar(2000, Calendar.JUNE, 2), " 00",
DateFormat.YEAR_FIELD);
test.test(" yyy", new GregorianCalendar(2000, Calendar.JUNE, 2), " 2000",
DateFormat.YEAR_FIELD);
test.test(" yyy", cal, " 1999", DateFormat.YEAR_FIELD);
test.test(" yyyy", cal, " 1999", DateFormat.YEAR_FIELD);
test.test(" yyyyy", cal, " 01999", DateFormat.YEAR_FIELD);
assertFalse(test.testsFailed);
}
public void testFormattingWeekOfYear() {
FormatTester test = new FormatTester();
Calendar cal = new GregorianCalendar(1999, Calendar.JUNE, 2, 15, 3, 6);
cal.setMinimalDaysInFirstWeek(1);
cal.setFirstDayOfWeek(1);
test.test(" w", cal, " 23", DateFormat.WEEK_OF_YEAR_FIELD);
test.test(" ww", cal, " 23", DateFormat.WEEK_OF_YEAR_FIELD);
test.test(" wwww", cal, " 0023", DateFormat.WEEK_OF_YEAR_FIELD);
test.test(" W", cal, " 1", DateFormat.WEEK_OF_MONTH_FIELD);
test.test(" W", new GregorianCalendar(1999, Calendar.NOVEMBER, 14),
" 3", DateFormat.WEEK_OF_MONTH_FIELD);
test.test(" WW", cal, " 01", DateFormat.WEEK_OF_MONTH_FIELD);
test.test(" WWWW", cal, " 0001", DateFormat.WEEK_OF_MONTH_FIELD);
assertFalse(test.testsFailed);
}
public void testFormattingTimezones() {
FormatTester test = new FormatTester();
Calendar cal = new GregorianCalendar(1999, Calendar.JUNE, 2, 15, 3, 6);
format.setTimeZone(new SimpleTimeZone(60000, "ONE MINUTE"));
test.test(" z", cal, " GMT+00:01", DateFormat.TIMEZONE_FIELD);
test.test(" zzzz", cal, " GMT+00:01", DateFormat.TIMEZONE_FIELD);
format.setTimeZone(new SimpleTimeZone(5400000, "ONE HOUR, THIRTY"));
test.test(" z", cal, " GMT+01:30", DateFormat.TIMEZONE_FIELD);
format.setTimeZone(new SimpleTimeZone(-5400000, "NEG ONE HOUR, THIRTY"));
test.test(" z", cal, " GMT-01:30", DateFormat.TIMEZONE_FIELD);
format.setTimeZone(TimeZone.getTimeZone("America/New_York"));
test.test(" z", cal, " EDT", DateFormat.TIMEZONE_FIELD);
Calendar temp2 = new GregorianCalendar(1999, Calendar.JANUARY, 12);
test.test(" z", temp2, " EST", DateFormat.TIMEZONE_FIELD);
test.test(" zz", cal, " EDT", DateFormat.TIMEZONE_FIELD);
test.test(" zzz", cal, " EDT", DateFormat.TIMEZONE_FIELD);
test.test(" zzzz", cal, " Eastern Daylight Time", DateFormat.TIMEZONE_FIELD);
test.test(" zzzz", temp2, " Eastern Standard Time", DateFormat.TIMEZONE_FIELD);
test.test(" zzzzz", cal, " Eastern Daylight Time", DateFormat.TIMEZONE_FIELD);
assertFalse(test.testsFailed);
}
public void testDefaultMinimalDaysInFirstWeek() {
Locale.setDefault(Locale.US);
assertEquals(1, new GregorianCalendar().getMinimalDaysInFirstWeek());
assertEquals(1, new GregorianCalendar().getFirstDayOfWeek());
}
/**
* @tests java.text.SimpleDateFormat#format(java.util.Date)
*/
public void test_timeZoneFormatting() {
// tests specific to formatting of timezones
Date summerDate = new GregorianCalendar(1999, Calendar.JUNE, 2, 15, 3, 6).getTime();
Date winterDate = new GregorianCalendar(1999, Calendar.JANUARY, 12).getTime();
FormatTester test = new FormatTester();
test.verifyFormatTimezone("GMT-7", "GMT-07:00, GMT-07:00", "-0700, -0700", summerDate);
test.verifyFormatTimezone("GMT-7", "GMT-07:00, GMT-07:00", "-0700, -0700", winterDate);
test.verifyFormatTimezone("GMT+14", "GMT+14:00, GMT+14:00", "+1400, +1400", summerDate);
test.verifyFormatTimezone("GMT+14", "GMT+14:00, GMT+14:00", "+1400, +1400", winterDate);
test.verifyFormatTimezone("America/Los_Angeles", "PDT, Pacific Daylight Time",
"-0700, -0700", summerDate);
test.verifyFormatTimezone("America/Los_Angeles", "PST, Pacific Standard Time",
"-0800, -0800", winterDate);
// this fails on the RI!
test.verifyFormatTimezone("America/Detroit", "EDT, Eastern Daylight Time",
"-0400, -0400", summerDate);
test.verifyFormatTimezone("America/Detroit", "EST, Eastern Standard Time",
"-0500, -0500", winterDate);
assertFalse(test.testsFailed);
}
public void test_parseLjava_lang_StringLjava_text_ParsePosition_2() {
try {
format.parse("240 11 2002 March", null);
fail("ParsePosition is null: NullPointerException was not thrown.");
} catch(NullPointerException pe) {
//expected
}
try {
format.parse(null, new ParsePosition(0));
fail("String is null: NullPointerException was not thrown.");
} catch(NullPointerException pe) {
//expected
}
}
public void test_setDateFormatSymbolsLjava_text_DateFormatSymbols() {
// Test for method void
// java.text.SimpleDateFormat.setDateFormatSymbols(java.text.DateFormatSymbols)
SimpleDateFormat f1 = new SimpleDateFormat("a");
DateFormatSymbols symbols = new DateFormatSymbols();
symbols.setAmPmStrings(new String[] { "morning", "night" });
f1.setDateFormatSymbols(symbols);
DateFormatSymbols newSym = f1.getDateFormatSymbols();
assertTrue("Set incorrectly", newSym.equals(symbols));
assertTrue("Not a clone", f1.getDateFormatSymbols() != symbols);
String result = f1.format(new GregorianCalendar(1999, Calendar.JUNE,
12, 3, 0).getTime());
assertEquals("Incorrect symbols used", "morning", result);
symbols.setEras(new String[] { "before", "after" });
assertTrue("Identical symbols", !f1.getDateFormatSymbols().equals(
symbols));
try {
f1.setDateFormatSymbols(null);
fail("NullPointerException was not thrown.");
} catch(NullPointerException npe) {
//expected
}
}
public void test_toLocalizedPattern() {
// BEGIN android-changed
// Test for method java.lang.String
// java.text.SimpleDateFormat.toLocalizedPattern()
SimpleDateFormat f2 = new SimpleDateFormat("GyMdkHmsSEDFwWahKzZ",
new Locale("de", "CH"));
String pattern = f2.toLocalizedPattern();
// the default localized pattern characters are the same for all locales
// since icu has dropped support for this. the default pattern characters
// are these: GyMdkHmsSEDFwWahKz
// ICU only! this fails on the RI
assertTrue("Wrong pattern: " + pattern, pattern
.equals("GyMdkHmsSEDFwWahKzZ"));
// test the new "Z" pattern char
f2 = new SimpleDateFormat("G y M d Z", new Locale("de", "CH"));
pattern = f2.toLocalizedPattern();
// assertTrue("Wrong pattern: " + pattern, pattern.equals("G u M t Z"));
assertTrue("Wrong pattern: " + pattern, pattern.equals("G y M d Z"));
// END android-changed
}
public void test_toPattern() {
String pattern = "yyyy mm dd";
SimpleDateFormat f = new SimpleDateFormat(pattern);
assertEquals("Wrong pattern: " + pattern, pattern, f.toPattern());
pattern = "GyMdkHmsSEDFwWahKz";
f = new SimpleDateFormat("GyMdkHmsSEDFwWahKz", new Locale("de", "CH"));
assertTrue("Wrong pattern: " + pattern, f.toPattern().equals(pattern));
pattern = "G y M d Z";
f = new SimpleDateFormat(pattern, new Locale("de", "CH"));
pattern = f.toPattern();
assertTrue("Wrong pattern: " + pattern, f.toPattern().equals(pattern));
}
}