blob: caa6f219a24f3567c1e092720f5d0a5e4f7de3e9 [file] [log] [blame]
/*
* Copyright (c) 2003, 2016, 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 4860664 4916815 4867075
* @library /java/text/testlib
* @build Koyomi
* @run main FieldStateTest
* @summary Unit tests for internal fields states.
*/
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import static java.util.Calendar.*;
public class FieldStateTest extends IntlTest {
public static void main(String[] args) throws Exception {
Locale reservedLocale = Locale.getDefault();
TimeZone reservedTimeZone = TimeZone.getDefault();
try {
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
Locale.setDefault(Locale.US);
new FieldStateTest().run(args);
} finally {
// restore the reserved locale and time zone
Locale.setDefault(reservedLocale);
TimeZone.setDefault(reservedTimeZone);
}
}
public void TestFieldState() {
Koyomi cal = new Koyomi();
logln("Right after instantialtion:");
if (!cal.checkAllSet()) {
errln(cal.getMessage());
}
logln("Set date to 2003/10/31 after the instantiation:");
cal.set(2003, OCTOBER, 31);
// let cal calculate the time
cal.getTime();
// At this point, all fields have to be recalculated and
// happen to have the set-state from the instantiation. The
// three fields should have "externally set" and the rest of
// the fields have "computed". But we can't distinguish them
// outside the package.
if (!cal.checkAllSet()) {
errln(cal.getMessage());
}
// Make sure that the correct date was produced.
if (!cal.checkInternalDate(2003, OCTOBER, 31, FRIDAY)) {
errln(cal.getMessage());
}
logln("Change to Monday of the week, which is 2003/10/27:");
cal.set(DAY_OF_WEEK, MONDAY);
cal.getTime();
if (!cal.checkDate(2003, OCTOBER, 27)) {
errln(cal.getMessage());
}
// The same operation didn't work after calling clear() before
// 1.5 because the set-state was just depends on its previous
// operations. After the instantiation, all the fields are set
// to "computed". But after calling clear(), the state becomes
// "unset".
logln("Set to 2003/10/31 after clear():");
cal.clear();
cal.set(2003, OCTOBER, 31);
cal.getTime();
cal.set(DAY_OF_WEEK, MONDAY);
if (!cal.checkDate(2003, OCTOBER, 27, MONDAY)) {
errln(cal.getMessage());
}
logln("Set to 2003/10/31 after clear(), then to the 51st week of year (12/19):");
cal.clear();
cal.set(2003, OCTOBER, 31);
cal.getTime();
cal.set(WEEK_OF_YEAR, 51);
if (!cal.checkFieldValue(WEEK_OF_YEAR, 51)) {
errln(cal.getMessage());
}
if (!cal.checkDate(2003, DECEMBER, 19, FRIDAY)) {
errln(cal.getMessage());
}
logln("Set to 2003/10 Mon of 4th week (10/20: 43rd week of year, 293rd day):");
cal.clear();
cal.set(YEAR, 2003);
cal.set(MONTH, OCTOBER);
cal.set(DAY_OF_WEEK, MONDAY);
cal.set(WEEK_OF_MONTH, 4);
cal.getTime();
if (!cal.checkFieldValue(DAY_OF_MONTH, 20)) {
errln(cal.getMessage());
}
if (!cal.checkFieldValue(DAY_OF_YEAR, 293)) {
errln(cal.getMessage());
}
if (!cal.checkFieldValue(WEEK_OF_YEAR, 43)) {
errln(cal.getMessage());
}
logln("Set to 2003/10 Mon of 43rd week of year (10/20: 4th week of month, 293rd day):");
cal.clear();
cal.set(YEAR, 2003);
cal.set(DAY_OF_WEEK, MONDAY);
cal.set(WEEK_OF_YEAR, 43);
cal.getTime();
if (!cal.checkDate(2003, OCTOBER, 20, MONDAY)) {
errln(cal.getMessage());
}
if (!cal.checkFieldValue(WEEK_OF_MONTH, 4)) {
errln(cal.getMessage());
}
if (!cal.checkFieldValue(DAY_OF_YEAR, 293)) {
errln(cal.getMessage());
}
logln("Set day of week to SUNDAY and date to 2003/10/31. "
+ "Then, getTime and set week of year to 43.");
cal.setTime(new Date(2003-1990, OCTOBER, 31));
cal.set(DAY_OF_WEEK, SUNDAY);
cal.set(2003, OCTOBER, 31); // 2003/10/31 is Friday.
cal.set(ZONE_OFFSET, 0);
cal.set(DST_OFFSET, 0);
// This call should change the day of week to FRIDAY since the
// selected field combination should be YEAR, MONTH and
// DAY_OF_MONTH. The other calendar fields must be normalized
// with the selected date.
cal.getTime();
cal.set(WEEK_OF_YEAR, 43);
if (!cal.checkDate(2003, OCTOBER, 24, FRIDAY)) {
errln(cal.getMessage());
}
}
/*
* 4916815: REGRESSION: Problem with java.util.Calendar VM 1.4.2-b28
*/
public void Test4916815() {
logln("Set date to 2003/9/26 (Fri). Roll to Aug and back to Sep. "+
"Set dayofweek to Sunday which should be 2003/9/21.");
Koyomi cal = new Koyomi();
cal.clear();
// 2003/9/26 (Fri)
cal.set(2003, SEPTEMBER, 26);
// Go to August then back to September
cal.roll(MONTH, -1);
cal.roll(MONTH, +1);
Koyomi cal2 = (Koyomi) cal.clone();
cal2.getTime();
// Sunday of the week should be 2003/9/21.
cal2.set(DAY_OF_WEEK, SUNDAY);
if (!cal2.checkDate(2003, SEPTEMBER, 21, SUNDAY)) {
errln(cal2.getMessage());
}
}
/*
* 4867075: GregorianCalendar get() calls complete() internally, should getTime() too?
*/
public void Test4867075() {
Koyomi cal = new Koyomi(Locale.US);
cal.clear();
cal.set(YEAR, 2004);
cal.set(WEEK_OF_YEAR, 1);
checkDate(cal, SUNDAY, 2003, DECEMBER, 28);
checkDate(cal, MONDAY, 2003, DECEMBER, 29);
checkDate(cal, TUESDAY, 2003, DECEMBER, 30);
checkDate(cal, WEDNESDAY, 2003, DECEMBER, 31);
checkDate(cal, THURSDAY, 2004, JANUARY, 1);
checkDate(cal, FRIDAY, 2004, JANUARY, 2);
checkDate(cal, SATURDAY, 2004, JANUARY, 3);
}
private void checkDate(Koyomi cal, int dayOfWeek,
int expectedYear, int expectedMonth, int expectedDayOfMonth) {
cal.set(DAY_OF_WEEK, dayOfWeek);
cal.getTime();
if (!cal.checkInternalDate(expectedYear, expectedMonth, expectedDayOfMonth, dayOfWeek)) {
errln(cal.getMessage());
}
}
static String toHexString(int x) {
return Integer.toHexString(x);
}
}