blob: 92e64cd709fdcd11646fe1bc316142e341c9d4d5 [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 org.apache.myfaces.tobago.renderkit.html.scarborough.standard;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class DateUnitTest extends AbstractJavaScriptTestBase {
private static final int[] YEAR_MONTH_DAY
= {Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH};
private static final List<Date> DATES = Arrays.asList(
createDate(1970, 1, 1),
createDate(2005, 11, 21),
createDate(2005, 12, 24),
createDate(1972, 1, 29)
);
private static Date createDate(final int year, final int month, final int day) {
final Calendar calendar = Calendar.getInstance(Locale.ENGLISH); // XXX
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DAY_OF_MONTH, day);
return calendar.getTime();
}
protected void setUp() throws Exception {
super.setUp();
loadScriptFile("tobago-converter.js");
}
@Test
public void testNumberOnlyDateFormats() throws IOException {
for (final Date date : DATES) {
checkFormat("yyyyMMdd", date, YEAR_MONTH_DAY, Locale.ENGLISH);
checkFormat("ddMMyyyy", date, YEAR_MONTH_DAY, Locale.ENGLISH);
checkFormat("d.M.yyyy", date, YEAR_MONTH_DAY, Locale.ENGLISH);
checkFormat("dd.MM.yyyy", date, YEAR_MONTH_DAY, Locale.ENGLISH);
checkFormat("dd/MM/yyyy", date, YEAR_MONTH_DAY, Locale.ENGLISH);
checkFormat("dd/MM/yyy", date, YEAR_MONTH_DAY, Locale.ENGLISH);
checkFormat("dd/MM/yy", date, YEAR_MONTH_DAY, Locale.ENGLISH);
checkFormat("EddMMyyyy", date, YEAR_MONTH_DAY, Locale.ENGLISH);
}
}
@Test
public void testEnglishMonths() throws IOException {
for (int month = 1; month <= 12; ++month) {
final Date date = createDate(2005, month, 10);
final StringBuilder format = new StringBuilder("M");
for (int i = 0; i < 4; ++i) {
format.append('M');
checkFormat(format.toString(), date, new int[] {Calendar.MONTH}, Locale.ENGLISH);
}
}
}
@Test
public void testTwoDigitYears() throws IOException, ParseException {
checkTwoDigitYears(Locale.ENGLISH);
checkTwoDigitYears(Locale.GERMAN);
}
@Test
public void checkTwoDigitYears(final Locale locale) throws IOException, ParseException {
final DecimalFormat decimalFormat = new DecimalFormat("00");
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yy", locale);
final Calendar calendar = Calendar.getInstance(locale);
for (int year = 0; year < 100; ++year) {
final String yearString = decimalFormat.format(year);
calendar.setTime(simpleDateFormat.parse(yearString));
Assert.assertEquals(calendar.get(Calendar.YEAR), evalParseDate(yearString, "yy", locale).get(Calendar.YEAR));
}
}
@Test
public void testEnglishWeekDays() throws IOException {
for (int day = 1; day <= 7; ++day) {
final Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, day);
final Date date = calendar.getTime();
final StringBuilder format = new StringBuilder();
for (int i = 0; i < 4; ++i) {
format.append('E');
checkFormat(format.toString(), date, new int[0], Locale.ENGLISH); // XXX new int[] {Calendar.DAY_OF_WEEK}
}
}
}
private Object evalFormatDate(final Date date, final String format) {
// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
return eval("new SimpleDateFormat(\"" + format + "\")"
+ ".format(new Date(" + date.getTime() + "))");
}
@Test
public void testLocalization() {
Assert.assertEquals("January", eval("var s = new DateFormatSymbols(); s.months[0]"));
Assert.assertEquals("Januar", eval(createSymbols("s", Locale.GERMAN) + "s.months[0]"));
}
private String createSymbols(final String var, final Locale locale) {
return "var " + var + " = new DateFormatSymbols(); "
+ var + ".months = new Array("
+ createStringList(DateTestUtils.createMonthNames(true, locale)) + ");"
+ var + ".shortMonths = new Array("
+ createStringList(DateTestUtils.createMonthNames(false, locale)) + ");"
+ var + ".weekdays = new Array("
+ createStringList(DateTestUtils.createDayNames(true, locale)) + ");"
+ var + ".shortWeekdays = new Array("
+ createStringList(DateTestUtils.createDayNames(false, locale)) + ");";
}
private String createStringList(final List<String> strings) {
return "'" + join(strings, "', '") + "'";
}
private String join(final List<String> strings, final String separator) {
final StringBuilder builder = new StringBuilder();
for (int i = 0; i < strings.size(); i++) {
final String s = strings.get(i);
if (i > 0) {
builder.append(separator);
}
builder.append(s);
}
return builder.toString();
}
private Calendar evalParseDate(final String input, final String format, final Locale locale) {
final long time = evalLong(createSymbols("s", locale) + ";"
+ "new SimpleDateFormat(\"" + format + "\", s)"
+ ".parse(\"" + input + "\").getTime()");
final Calendar calendar = Calendar.getInstance(locale);
calendar.setTime(new Date(time));
return calendar;
}
private void checkFormat(final String format, final Date date, final int[] fields,
final Locale locale) {
final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format, locale);
Assert.assertEquals(simpleDateFormat.format(date), evalFormatDate(date, format));
final Calendar calendar1 = Calendar.getInstance(locale);
calendar1.setTime(date);
final Calendar calendar2 = evalParseDate(
simpleDateFormat.format(date), format, locale);
for (final int field : fields) {
checkField(calendar1, calendar2, field);
}
}
private void checkField(final Calendar calendar1, final Calendar calendar2, final int field) {
Assert.assertEquals(calendar1.get(field), calendar2.get(field));
}
}