48c7549806
Reviewed-by: bpb, ihse
175 lines
6.2 KiB
Java
175 lines
6.2 KiB
Java
/*
|
|
* Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
/*
|
|
* @test
|
|
* @bug 4267450
|
|
* @summary Unit test for week date support
|
|
*/
|
|
|
|
import java.text.*;
|
|
import java.util.*;
|
|
import static java.util.GregorianCalendar.*;
|
|
|
|
public class WeekDateTest {
|
|
static SimpleDateFormat ymdFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
|
|
static SimpleDateFormat ywdFormat = new SimpleDateFormat("YYYY-'W'ww-u", Locale.US);
|
|
static {
|
|
ymdFormat.setCalendar(newCalendar());
|
|
ywdFormat.setCalendar(newCalendar());
|
|
}
|
|
|
|
// Round-trip Data
|
|
static final String[][] roundTripData = {
|
|
{ "2005-01-01", "2004-W53-6" },
|
|
{ "2005-01-02", "2004-W53-7" },
|
|
{ "2005-12-31", "2005-W52-6" },
|
|
{ "2007-01-01", "2007-W01-1" },
|
|
{ "2007-12-30", "2007-W52-7" },
|
|
{ "2007-12-31", "2008-W01-1" },
|
|
{ "2008-01-01", "2008-W01-2" },
|
|
{ "2008-12-29", "2009-W01-1" },
|
|
{ "2008-12-31", "2009-W01-3" },
|
|
{ "2009-01-01", "2009-W01-4" },
|
|
{ "2009-12-31", "2009-W53-4" },
|
|
{ "2010-01-03", "2009-W53-7" },
|
|
{ "2009-12-31", "2009-W53-4" },
|
|
{ "2010-01-01", "2009-W53-5" },
|
|
{ "2010-01-02", "2009-W53-6" },
|
|
{ "2010-01-03", "2009-W53-7" },
|
|
{ "2008-12-28", "2008-W52-7" },
|
|
{ "2008-12-29", "2009-W01-1" },
|
|
{ "2008-12-30", "2009-W01-2" },
|
|
{ "2008-12-31", "2009-W01-3" },
|
|
{ "2009-01-01", "2009-W01-4" },
|
|
{ "2009-01-01", "2009-W01-4" },
|
|
};
|
|
|
|
// Data for leniency test
|
|
static final String[][] leniencyData = {
|
|
{ "2008-12-28", "2009-W01-0" },
|
|
{ "2010-01-04", "2009-W53-8" },
|
|
{ "2008-12-29", "2008-W53-1" },
|
|
};
|
|
|
|
static final String[] invalidData = {
|
|
"2010-W00-1",
|
|
"2010-W55-1",
|
|
"2010-W03-0",
|
|
"2010-W04-8",
|
|
"2010-W04-19"
|
|
};
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
formatTest(roundTripData);
|
|
parseTest(roundTripData);
|
|
parseTest(leniencyData);
|
|
nonLenientTest(invalidData);
|
|
noWeekDateSupport();
|
|
}
|
|
|
|
private static void formatTest(String[][] data) throws Exception {
|
|
for (String[] dates : data) {
|
|
String regularDate = dates[0];
|
|
String weekDate = dates[1];
|
|
Date date = null;
|
|
date = ymdFormat.parse(regularDate);
|
|
String s = ywdFormat.format(date);
|
|
if (!s.equals(weekDate)) {
|
|
throw new RuntimeException("format: got="+s+", expected="+weekDate);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void parseTest(String[][] data) throws Exception {
|
|
for (String[] dates : data) {
|
|
String regularDate = dates[0];
|
|
String weekDate = dates[1];
|
|
Date date1 = null, date2 = null;
|
|
date1 = ymdFormat.parse(regularDate);
|
|
date2 = ywdFormat.parse(weekDate);
|
|
if (!date1.equals(date2)) {
|
|
System.err.println(regularDate + ": date1 = " + date1);
|
|
System.err.println(weekDate + ": date2 = " + date2);
|
|
throw new RuntimeException("parse: date1 != date2");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// Non-lenient mode test
|
|
private static void nonLenientTest(String[] data) {
|
|
ywdFormat.setLenient(false);
|
|
for (String date : data) {
|
|
try {
|
|
Date d = ywdFormat.parse(date);
|
|
throw new RuntimeException("No ParseException thrown with " + date);
|
|
} catch (ParseException e) {
|
|
// OK
|
|
}
|
|
}
|
|
ywdFormat.setLenient(true);
|
|
}
|
|
|
|
|
|
private static void noWeekDateSupport() throws Exception {
|
|
// Tests with Japanese Imperial Calendar that doesn't support week dates.
|
|
Calendar jcal = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
|
|
Locale.of("ja", "JP", "JP"));
|
|
|
|
String format = "2-W01-2"; // 2019-12-31 == R1-12-31
|
|
int expectedYear = 2019;
|
|
// Check the current era, Heisei or Reiwa
|
|
if (System.currentTimeMillis() < 1556668800000L) {
|
|
format = "21-W01-3"; // 2008-12-31 == H20-12-31
|
|
expectedYear = 2008;
|
|
}
|
|
jcal.setFirstDayOfWeek(MONDAY);
|
|
jcal.setMinimalDaysInFirstWeek(4);
|
|
SimpleDateFormat sdf = new SimpleDateFormat("Y-'W'ww-u");
|
|
sdf.setCalendar(jcal);
|
|
Date d = sdf.parse(format);
|
|
GregorianCalendar gcal = newCalendar();
|
|
gcal.setTime(d);
|
|
if (gcal.get(YEAR) != expectedYear
|
|
|| gcal.get(MONTH) != DECEMBER
|
|
|| gcal.get(DAY_OF_MONTH) != 31) {
|
|
String s = String.format("noWeekDateSupport: got %04d-%02d-%02d, expected %4d-12-31%n",
|
|
gcal.get(YEAR),
|
|
gcal.get(MONTH)+1,
|
|
gcal.get(DAY_OF_MONTH),
|
|
expectedYear);
|
|
throw new RuntimeException(s);
|
|
}
|
|
}
|
|
|
|
private static GregorianCalendar newCalendar() {
|
|
// Use GMT to avoid any surprises related DST transitions.
|
|
GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
|
|
// Setup the ISO 8601 compatible parameters
|
|
cal.setFirstDayOfWeek(MONDAY);
|
|
cal.setMinimalDaysInFirstWeek(4);
|
|
return cal;
|
|
}
|
|
}
|