/* * Copyright (c) 1998, 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.
*/
publicstaticvoid main(String[] args) throws Exception { new CalendarRegression().run(args);
}
/* Synopsis: java.sql.Timestamp constructor works wrong on Windows 95
==== Here is the test ==== public static void main (String args[]) { java.sql.Timestamp t= new java.sql.Timestamp(0,15,5,5,8,13,123456700); logln("expected=1901-04-05 05:08:13.1234567"); logln(" result="+t); }
==== Here is the output of the test on Solaris or NT ==== expected=1901-04-05 05:08:13.1234567 result=1901-04-05 05:08:13.1234567
==== Here is the output of the test on Windows95 ==== expected=1901-04-05 05:08:13.1234567 result=1901-04-05 06:08:13.1234567
*/ publicvoid Test4031502() { // This bug actually occurs on Windows NT as well, and doesn't // require the host zone to be set; it can be set in Java.
String[] ids = TimeZone.getAvailableIDs(); boolean bad = false; for (int i = 0; i < ids.length; ++i) {
TimeZone zone = TimeZone.getTimeZone(ids[i]);
GregorianCalendar cal = new GregorianCalendar(zone);
cal.clear();
cal.set(1900, 15, 5, 5, 8, 13); if (cal.get(HOUR) != 5) {
logln(zone.getID() + " "
+ //zone.useDaylightTime() + " "
+ cal.get(DST_OFFSET) / (60 * 60 * 1000) + " "
+ zone.getRawOffset() / (60 * 60 * 1000)
+ ": HOUR = " + cal.get(HOUR));
bad = true;
}
} if (bad) {
errln("TimeZone problems with GC");
}
}
publicvoid Test4035301() {
GregorianCalendar c = new GregorianCalendar(98, 8, 7);
GregorianCalendar d = new GregorianCalendar(98, 8, 7); if (c.after(d)
|| c.after(c)
|| c.before(d)
|| c.before(c)
|| !c.equals(c)
|| !c.equals(d)) {
errln("Fail");
}
}
calendar.add(SECOND, 6); //This will print out todays date for MONTH and DAY_OF_MONTH //instead of the date it was set to. //This happens when adding MILLISECOND or MINUTE also
logln("MONTH: " + calendar.get(MONTH));
logln("DAY_OF_MONTH: "
+ calendar.get(DAY_OF_MONTH));
logln("MINUTE: " + calendar.get(MINUTE));
logln("SECOND: " + calendar.get(SECOND)); if (calendar.get(MONTH) != 3
|| calendar.get(DAY_OF_MONTH) != 18
|| calendar.get(SECOND) != 36) {
errln("Fail: Calendar.add misbehaves");
}
}
publicvoid Test4051765() {
Calendar cal = Calendar.getInstance();
cal.setLenient(false);
cal.set(DAY_OF_WEEK, 0); try {
cal.getTime();
errln("Fail: DAY_OF_WEEK 0 should be disallowed");
} catch (IllegalArgumentException e) { return;
}
}
publicvoid Test4070502() {
@SuppressWarnings("deprecation")
Date d = getAssociatedDate(new Date(98, 0, 30));
Calendar cal = new GregorianCalendar();
cal.setTime(d); if (cal.get(DAY_OF_WEEK) == SATURDAY
|| cal.get(DAY_OF_WEEK) == SUNDAY) {
errln("Fail: Want weekday Got " + d);
}
}
/** * Get the associated date starting from a specified date * NOTE: the unnecessary "getTime()'s" below are a work-around for a * bug in jdk 1.1.3 (and probably earlier versions also) * <p> * @param date The date to start from
*/ publicstatic Date getAssociatedDate(Date d) {
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(d); //cal.add(field, amount); //<-- PROBLEM SEEN WITH field = DATE,MONTH // cal.getTime(); // <--- REMOVE THIS TO SEE BUG while (true) { int wd = cal.get(DAY_OF_WEEK); if (wd == SATURDAY || wd == SUNDAY) {
cal.add(DATE, 1); // cal.getTime();
} else { break;
}
} return cal.getTime();
}
void dowTest(boolean lenient) {
GregorianCalendar cal = new GregorianCalendar();
cal.set(1997, AUGUST, 12); // Wednesday // cal.getTime(); // Force update
cal.setLenient(lenient);
cal.set(1996, DECEMBER, 1); // Set the date to be December 1, 1996 int dow = cal.get(DAY_OF_WEEK); int min = cal.getMinimum(DAY_OF_WEEK); int max = cal.getMaximum(DAY_OF_WEEK);
logln(cal.getTime().toString()); if (min != SUNDAY || max != SATURDAY) {
errln("FAIL: Min/max bad");
} if (dow < min || dow > max) {
errln("FAIL: Day of week " + dow + " out of range");
} if (dow != SUNDAY) {
errln("FAIL: Day of week should be SUNDAY Got " + dow);
}
}
@SuppressWarnings("deprecation") publicvoid Test4071385() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(98, JUNE, 24));
cal.set(MONTH, NOVEMBER); // change a field
logln(cal.getTime().toString()); if (!cal.getTime().equals(new Date(98, NOVEMBER, 24))) {
errln("Fail");
}
}
publicvoid Test4073929() {
GregorianCalendar foo1 = new GregorianCalendar(1997, 8, 27);
foo1.add(DAY_OF_MONTH, +1); int testyear = foo1.get(YEAR); int testmonth = foo1.get(MONTH); int testday = foo1.get(DAY_OF_MONTH); if (testyear != 1997
|| testmonth != 8
|| testday != 28) {
errln("Fail: Calendar not initialized");
}
}
publicvoid Test4083167() {
TimeZone saveZone = TimeZone.getDefault(); try {
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Date firstDate = new Date();
Calendar cal = new GregorianCalendar();
cal.setTime(firstDate); long firstMillisInDay = cal.get(HOUR_OF_DAY) * 3600000L
+ cal.get(MINUTE) * 60000L
+ cal.get(SECOND) * 1000L
+ cal.get(MILLISECOND);
logln(" Cal2 = " + cal2.getTime().getTime());
logln(" Cal2 time in ms = " + cal2.get(MILLISECOND)); if (!cal1.equals(cal2)) {
errln("Fail: Milliseconds randomized");
}
}
publicvoid Test4095407() {
GregorianCalendar a = new GregorianCalendar(1997, NOVEMBER, 13); int dow = a.get(DAY_OF_WEEK); if (dow != THURSDAY) {
errln("Fail: Want THURSDAY Got " + dow);
}
}
publicvoid Test4096231() {
TimeZone GMT = TimeZone.getTimeZone("GMT");
TimeZone PST = TimeZone.getTimeZone("PST"); int sec = 0, min = 0, hr = 0, day = 1, month = 10, year = 1997;
Calendar cal1 = new GregorianCalendar(PST);
cal1.setTime(new Date(880698639000L)); int p;
logln("PST 1 is: " + (p = cal1.get(HOUR_OF_DAY)));
cal1.setTimeZone(GMT); // Issue 1: Changing the timezone doesn't change the // represented time. int h1, h2;
logln("GMT 1 is: " + (h1 = cal1.get(HOUR_OF_DAY)));
cal1.setTime(new Date(880698639000L));
logln("GMT 2 is: " + (h2 = cal1.get(HOUR_OF_DAY))); // Note: This test had a bug in it. It wanted h1!=h2, when // what was meant was h1!=p. Fixed this concurrent with fix // to 4177484. if (p == h1 || h1 != h2) {
errln("Fail: Hour same in different zones");
}
Calendar cal2 = new GregorianCalendar(GMT);
Calendar cal3 = new GregorianCalendar(PST);
cal2.set(MILLISECOND, 0);
cal3.set(MILLISECOND, 0);
for (int x = 0; x < 12; x++) {
GregorianCalendar gc = new GregorianCalendar(1997, x, y[x]); int m1, m2;
log((m1 = gc.get(MONTH) + 1) + "/"
+ gc.get(DATE) + "/" + gc.get(YEAR)
+ " + 1mo = ");
gc.add(MONTH, 1);
logln((m2 = gc.get(MONTH) + 1) + "/"
+ gc.get(DATE) + "/" + gc.get(YEAR)
); int m = (m1 % 12) + 1; if (m2 != m) {
errln("Fail: Want " + m + " Got " + m2);
}
}
}
publicvoid Test4100311() {
Locale locale = Locale.getDefault(); if (!TestUtils.usesGregorianCalendar(locale)) {
logln("Skipping this test because locale is " + locale); return;
}
GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance();
cal.set(YEAR, 1997);
cal.set(DAY_OF_YEAR, 1);
Date d = cal.getTime(); // Should be Jan 1
logln(d.toString()); if (cal.get(DAY_OF_YEAR) != 1) {
errln("Fail: DAY_OF_YEAR not set");
}
}
publicvoid Test4103271() {
Locale locale = Locale.getDefault(); if (!TestUtils.usesGregorianCalendar(locale)) {
logln("Skipping this test because locale is " + locale); return;
}
SimpleDateFormat sdf = new SimpleDateFormat(); int numYears = 40, startYear = 1997, numDays = 15;
String output, testDesc;
GregorianCalendar testCal = (GregorianCalendar) Calendar.getInstance();
testCal.clear();
sdf.setCalendar(testCal);
sdf.applyPattern("d MMM yyyy"); boolean fail = false; for (int firstDay = 1; firstDay <= 2; firstDay++) { for (int minDays = 1; minDays <= 7; minDays++) {
testCal.setMinimalDaysInFirstWeek(minDays);
testCal.setFirstDayOfWeek(firstDay);
testDesc = ("Test" + String.valueOf(firstDay) + String.valueOf(minDays));
logln(testDesc + " => 1st day of week="
+ String.valueOf(firstDay)
+ ", minimum days in first week="
+ String.valueOf(minDays)); for (int j = startYear; j <= startYear + numYears; j++) {
testCal.set(j, 11, 25); for (int i = 0; i < numDays; i++) {
testCal.add(DATE, 1);
String calWOY; int actWOY = testCal.get(WEEK_OF_YEAR); if (actWOY < 1 || actWOY > 53) {
Date d = testCal.getTime();
calWOY = String.valueOf(actWOY);
output = testDesc + " - " + sdf.format(d) + "\t";
output = output + "\t" + calWOY;
logln(output);
fail = true;
}
}
}
}
}
// Now compute the time from the fields, and make sure we // get the same answer back. This is a round-trip test.
Date save = testCal.getTime();
testCal.clear();
testCal.set(YEAR, DATA[j + 1 + i] < 25 ? 1998 : 1997);
testCal.set(WEEK_OF_YEAR, DATA[j + 1 + i]);
testCal.set(DAY_OF_WEEK, (i % 7) + SUNDAY); if (!testCal.getTime().equals(save)) {
logln(" Parse failed: " + testCal.getTime());
fail = true;
} else {
logln(" Passed");
}
// Test field disambiguation with a few special hard-coded cases. // This shouldn't fail if the above cases aren't failing.
@SuppressWarnings("deprecation")
Object[] DISAM = {
1998, 1, SUNDAY, new Date(97, DECEMBER, 28),
1998, 2, SATURDAY, new Date(98, JANUARY, 10),
1998, 53, THURSDAY, new Date(98, DECEMBER, 31),
1998, 53, FRIDAY, new Date(99, JANUARY, 1)};
testCal.setMinimalDaysInFirstWeek(3);
testCal.setFirstDayOfWeek(SUNDAY); for (int i = 0; i < DISAM.length; i += 4) { int y = (Integer) DISAM[i]; int woy = (Integer) DISAM[i + 1]; int dow = (Integer) DISAM[i + 2];
Date exp = (Date) DISAM[i + 3];
testCal.clear();
testCal.set(YEAR, y);
testCal.set(WEEK_OF_YEAR, woy);
testCal.set(DAY_OF_WEEK, dow);
log(y + "-W" + woy + "-DOW" + dow); if (!testCal.getTime().equals(exp)) {
logln(" FAILED expect: " + exp + "\n got: " + testCal.getTime());
fail = true;
} else {
logln(" OK");
}
}
// Now try adding and rolling
Object ADD = new Object();
Object ROLL = new Object();
@SuppressWarnings("deprecation")
Object[] ADDROLL = {
ADD, 1, new Date(98, DECEMBER, 25), new Date(99, JANUARY, 1),
ADD, 1, new Date(97, DECEMBER, 28), new Date(98, JANUARY, 4),
ROLL, 1, new Date(98, DECEMBER, 27), new Date(98, JANUARY, 4),
ROLL, 1, new Date(99, DECEMBER, 24), new Date(99, DECEMBER, 31),
ROLL, 1, new Date(99, DECEMBER, 25), new Date(99, JANUARY, 9)};
testCal.setMinimalDaysInFirstWeek(3);
testCal.setFirstDayOfWeek(SUNDAY); for (int i = 0; i < ADDROLL.length; i += 4) { int amount = (Integer) ADDROLL[i + 1];
Date before = (Date) ADDROLL[i + 2];
Date after = (Date) ADDROLL[i + 3];
@SuppressWarnings("deprecation") publicvoid Test4114578() {
Locale locale = Locale.getDefault(); if (!TestUtils.usesGregorianCalendar(locale)) {
logln("Skipping this test because locale is " + locale); return;
}
int ONE_HOUR = 60 * 60 * 1000;
TimeZone saveZone = TimeZone.getDefault(); boolean fail = false; try {
TimeZone.setDefault(TimeZone.getTimeZone("PST"));
Calendar cal = Calendar.getInstance(); long onset = new Date(98, APRIL, 5, 1, 0).getTime() + ONE_HOUR; long cease = new Date(98, OCTOBER, 25, 0, 0).getTime() + 2 * ONE_HOUR;
finalint ADD = 1; finalint ROLL = 2;
long[] DATA = { // Start Action Amt Expected_change
onset - ONE_HOUR, ADD, 1, ONE_HOUR,
onset, ADD, -1, -ONE_HOUR,
onset - ONE_HOUR, ROLL, 1, ONE_HOUR,
onset, ROLL, -1, -ONE_HOUR,
cease - ONE_HOUR, ADD, 1, ONE_HOUR,
cease, ADD, -1, -ONE_HOUR, // roll() was changed to support wall-clock-based roll (JDK-8152077). The // time value may jump 2 hours by skipping non-existent wall-clock time. // Note that JDK-4114578 was a problem of add(), not roll().
cease - ONE_HOUR, ROLL, 1, ONE_HOUR * 2,
cease, ROLL, -1, -ONE_HOUR * 2};
for (int i = 0; i < DATA.length; i += 4) {
Date date = new Date(DATA[i]); int amt = (int) DATA[i + 2]; long expectedChange = DATA[i + 3];
if (fail) {
errln("Fail: roll/add misbehaves around DST onset/cease");
}
}
/** * Make sure maximum for HOUR field is 11, not 12.
*/ publicvoid Test4118384() {
Calendar cal = Calendar.getInstance(); if (cal.getMaximum(HOUR) != 11
|| cal.getLeastMaximum(HOUR) != 11
|| cal.getActualMaximum(HOUR) != 11) {
errln("Fail: maximum of HOUR field should be 11");
}
}
/** * Check isLeapYear for BC years.
*/ publicvoid Test4125881() {
Locale locale = Locale.getDefault(); if (!TestUtils.usesGregorianCalendar(locale)) {
logln("Skipping this test because locale is " + locale); return;
}
GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance();
DateFormat fmt = new SimpleDateFormat("MMMM d, yyyy G");
cal.clear(); for (int y = -20; y <= 10; ++y) {
cal.set(ERA, y < 1 ? GregorianCalendar.BC : GregorianCalendar.AD);
cal.set(YEAR, y < 1 ? 1 - y : y);
logln(y + " = " + fmt.format(cal.getTime()) + " "
+ cal.isLeapYear(y)); if (cal.isLeapYear(y) != ((y + 40) % 4 == 0)) {
errln("Leap years broken");
}
}
}
/** * Prove that GregorianCalendar is proleptic (it used to cut off * at 45 BC, and not have leap years before then).
*/ publicvoid Test4125892() {
Locale locale = Locale.getDefault(); if (!TestUtils.usesGregorianCalendar(locale)) {
logln("Skipping this test because locale is " + locale); return;
}
GregorianCalendar cal = (GregorianCalendar) Calendar.getInstance();
DateFormat fmt = new SimpleDateFormat("MMMM d, yyyy G");
cal.clear();
cal.set(ERA, GregorianCalendar.BC);
cal.set(YEAR, 81); // 81 BC is a leap year (proleptically)
cal.set(MONTH, FEBRUARY);
cal.set(DATE, 28);
cal.add(DATE, 1); if (cal.get(DATE) != 29
|| !cal.isLeapYear(-80)) { // -80 == 81 BC
errln("Calendar not proleptic");
}
}
/** * Calendar and GregorianCalendar hashCode() methods need improvement. * Calendar needs a good implementation that subclasses can override, * and GregorianCalendar should use that implementation.
*/ publicvoid Test4136399() { /* Note: This test is actually more strict than it has to be. * Technically, there is no requirement that unequal objects have * unequal hashes. We only require equal objects to have equal hashes. * It is desirable for unequal objects to have distributed hashes, but * there is no hard requirement here. * * In this test we make assumptions about certain attributes of calendar * objects getting represented in the hash, which need not always be the
* case (although it does work currently with the given test). */
Calendar a = Calendar.getInstance();
Calendar b = (Calendar) a.clone(); if (a.hashCode() != b.hashCode()) {
errln("Calendar hash code unequal for cloned objects");
}
b.setMinimalDaysInFirstWeek(7 - a.getMinimalDaysInFirstWeek()); if (a.hashCode() == b.hashCode()) {
errln("Calendar hash code ignores minimal days in first week");
}
b.setMinimalDaysInFirstWeek(a.getMinimalDaysInFirstWeek());
b.setFirstDayOfWeek((a.getFirstDayOfWeek() % 7) + 1); // Next day if (a.hashCode() == b.hashCode()) {
errln("Calendar hash code ignores first day of week");
}
b.setFirstDayOfWeek(a.getFirstDayOfWeek());
// Assume getTimeZone() returns a reference, not a clone // of a reference -- this is true as of this writing
b.getTimeZone().setRawOffset(a.getTimeZone().getRawOffset() + 60 * 60 * 1000); if (a.hashCode() == b.hashCode()) {
errln("Calendar hash code ignores zone");
}
b.getTimeZone().setRawOffset(a.getTimeZone().getRawOffset());
GregorianCalendar c = new GregorianCalendar();
GregorianCalendar d = (GregorianCalendar) c.clone(); if (c.hashCode() != d.hashCode()) {
errln("GregorianCalendar hash code unequal for clones objects");
}
Date cutover = c.getGregorianChange();
d.setGregorianChange(new Date(cutover.getTime() + 24 * 60 * 60 * 1000)); if (c.hashCode() == d.hashCode()) {
errln("GregorianCalendar hash code ignores cutover");
}
}
/** * GregorianCalendar.equals() ignores cutover date
*/ publicvoid Test4141665() {
GregorianCalendar cal = new GregorianCalendar();
GregorianCalendar cal2 = (GregorianCalendar) cal.clone();
Date cut = cal.getGregorianChange();
Date cut2 = new Date(cut.getTime() + 100 * 24 * 60 * 60 * 1000L); // 100 days later if (!cal.equals(cal2)) {
errln("Cloned GregorianCalendars not equal");
}
cal2.setGregorianChange(cut2); if (cal.equals(cal2)) {
errln("GregorianCalendar.equals() ignores cutover");
}
}
/** * Bug states that ArrayIndexOutOfBoundsException is thrown by GregorianCalendar.roll() * when IllegalArgumentException should be.
*/ publicvoid Test4142933() {
GregorianCalendar calendar = new GregorianCalendar(); try {
calendar.roll(-1, true);
errln("Test failed, no exception trown");
} catch (IllegalArgumentException e) { // OK: Do nothing // logln("Test passed");
} catch (Exception e) {
errln("Test failed. Unexpected exception is thrown: " + e);
e.printStackTrace();
}
}
/** * GregorianCalendar handling of Dates Long.MIN_VALUE and Long.MAX_VALUE is * confusing; unless the time zone has a raw offset of zero, one or the * other of these will wrap. We've modified the test given in the bug * report to therefore only check the behavior of a calendar with a zero raw * offset zone.
*/ publicvoid Test4145158() {
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(new Date(Long.MIN_VALUE)); int year1 = calendar.get(YEAR); int era1 = calendar.get(ERA);
calendar.setTime(new Date(Long.MAX_VALUE)); int year2 = calendar.get(YEAR); int era2 = calendar.get(ERA);
if (year1 == year2 && era1 == era2) {
errln("Fail: Long.MIN_VALUE or Long.MAX_VALUE wrapping around");
}
}
/** * Maximum value for YEAR field wrong.
*/ publicvoid Test4145983() {
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
Date[] DATES = {new Date(Long.MAX_VALUE), new Date(Long.MIN_VALUE)}; for (int i = 0; i < DATES.length; ++i) {
calendar.setTime(DATES[i]); int year = calendar.get(YEAR); int maxYear = calendar.getMaximum(YEAR); if (year > maxYear) {
errln("Failed for " + DATES[i].getTime() + " ms: year="
+ year + ", maxYear=" + maxYear);
}
}
}
/** * This is a bug in the validation code of GregorianCalendar. As reported, * the bug seems worse than it really is, due to a bug in the way the bug * report test was written. In reality the bug is restricted to the DAY_OF_YEAR * field. - liu 6/29/98
*/ publicvoid Test4147269() { final String[] fieldName = { "ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH", "DAY_OF_MONTH", "DAY_OF_YEAR", "DAY_OF_WEEK", "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR", "HOUR_OF_DAY", "MINUTE", "SECOND", "MILLISECOND", "ZONE_OFFSET", "DST_OFFSET"};
GregorianCalendar calendar = new GregorianCalendar();
calendar.setLenient(false);
@SuppressWarnings("deprecation")
Date date = new Date(1996 - 1900, JANUARY, 3); // Arbitrary date for (int field = 0; field < FIELD_COUNT; field++) {
calendar.setTime(date); // Note: In the bug report, getActualMaximum() was called instead // of getMaximum() -- this was an error. The validation code doesn't // use getActualMaximum(), since that's too costly. int max = calendar.getMaximum(field); int value = max + 1;
calendar.set(field, value); try {
calendar.getTime(); // Force time computation // We expect an exception to be thrown. If we fall through // to the next line, then we have a bug.
errln("Test failed with field " + fieldName[field]
+ ", date before: " + date
+ ", date after: " + calendar.getTime()
+ ", value: " + value + " (max = " + max + ")");
} catch (IllegalArgumentException e) {
}
}
}
/** * Reported bug is that a GregorianCalendar with a cutover of Date(Long.MAX_VALUE) * doesn't behave as a pure Julian calendar. * CANNOT REPRODUCE THIS BUG
*/ publicvoid Test4149677() {
TimeZone[] zones = {TimeZone.getTimeZone("GMT"),
TimeZone.getTimeZone("PST"),
TimeZone.getTimeZone("EAT")}; for (int i = 0; i < zones.length; ++i) {
GregorianCalendar calendar = new GregorianCalendar(zones[i]);
// Make sure extreme values don't wrap around
calendar.setTime(new Date(Long.MIN_VALUE)); if (calendar.get(ERA) != GregorianCalendar.BC) {
errln("Fail: Date(Long.MIN_VALUE) has an AD year in " + zones[i]);
}
calendar.setTime(new Date(Long.MAX_VALUE)); if (calendar.get(ERA) != GregorianCalendar.AD) {
errln("Fail: Date(Long.MAX_VALUE) has a BC year in " + zones[i]);
}
calendar.setGregorianChange(new Date(Long.MAX_VALUE)); // to obtain a pure Julian calendar
boolean is100Leap = calendar.isLeapYear(100); if (!is100Leap) {
errln("test failed with zone " + zones[i].getID());
errln(" cutover date is Date(Long.MAX_VALUE)");
errln(" isLeapYear(100) returns: " + is100Leap);
}
}
}
/** * Calendar and Date HOUR broken. If HOUR is out-of-range, Calendar * and Date classes will misbehave.
*/ publicvoid Test4162587() {
TimeZone savedTz = TimeZone.getDefault();
TimeZone tz = TimeZone.getTimeZone("PST");
TimeZone.setDefault(tz);
GregorianCalendar cal = new GregorianCalendar(tz);
Date d;
try { for (int i = 0; i < 5; ++i) { if (i > 0) {
logln("---");
}
cal.clear();
cal.set(1998, APRIL, 5, i, 0);
d = cal.getTime();
String s0 = d.toString();
logln("0 " + i + ": " + s0);
cal.clear();
cal.set(1998, APRIL, 4, i + 24, 0);
d = cal.getTime();
String sPlus = d.toString();
logln("+ " + i + ": " + sPlus);
cal.clear();
cal.set(1998, APRIL, 6, i - 24, 0);
d = cal.getTime();
String sMinus = d.toString();
logln("- " + i + ": " + sMinus);
if (!s0.equals(sPlus) || !s0.equals(sMinus)) {
errln("Fail: All three lines must match");
}
}
} finally {
TimeZone.setDefault(savedTz);
}
}
/** * Adding 12 months behaves differently from adding 1 year
*/ publicvoid Test4165343() {
GregorianCalendar calendar = new GregorianCalendar(1996, FEBRUARY, 29);
Date start = calendar.getTime();
logln("init date: " + start);
calendar.add(MONTH, 12);
Date date1 = calendar.getTime();
logln("after adding 12 months: " + date1);
calendar.setTime(start);
calendar.add(YEAR, 1);
Date date2 = calendar.getTime();
logln("after adding one year : " + date2); if (date1.equals(date2)) {
logln("Test passed");
} else {
errln("Test failed");
}
}
/** * GregorianCalendar.getActualMaximum() does not account for first day of week.
*/ publicvoid Test4166109() { /* Test month: * * March 1998 * Su Mo Tu We Th Fr Sa * 1 2 3 4 5 6 7 * 8 9 10 11 12 13 14 * 15 16 17 18 19 20 21 * 22 23 24 25 26 27 28 * 29 30 31
*/ boolean passed = true; int field = WEEK_OF_MONTH;
if (returned != expected) {
passed = false;
}
} if (!passed) {
errln("Test failed");
}
}
/** * Calendar.getActualMaximum(YEAR) works wrong. * * Note: Before 1.5, this test case assumed that * setGregorianChange didn't change object's date. But it was * changed. See 4928615.
*/ publicvoid Test4167060() { int field = YEAR;
DateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy G",
Locale.US);
int[][] dates = { // year, month, day of month
{100, NOVEMBER, 1},
{-99 /*100BC*/, JANUARY, 1},
{1996, FEBRUARY, 29}};
String[] id = {"Hybrid", "Gregorian", "Julian"};
for (int k = 0; k < 3; ++k) {
logln("--- " + id[k] + " ---");
for (int i = 0; i < years.length; i++) { boolean valid = years[i] <= maxYear;
calendar.set(field, years[i]);
Date dateAfter = calendar.getTime(); int newYear = calendar.get(field);
calendar.setTime(dateBefore); // restore calendar for next use
logln(" Year " + years[i] + (valid ? " ok " : " bad")
+ " => " + format.format(dateAfter)); if (valid && newYear != years[i]) {
errln(" FAIL: " + newYear + " should be valid; date, month and time shouldn't change");
} elseif (!valid && newYear == years[i]) {
errln(" FAIL: " + newYear + " should be invalid");
}
}
}
}
}
/** * Calendar.roll broken * This bug relies on the TimeZone bug 4173604 to also be fixed.
*/ publicvoid Test4173516() {
Locale locale = Locale.getDefault(); if (!TestUtils.usesGregorianCalendar(locale)) {
logln("Skipping this test because locale is " + locale); return;
}
publicvoid Test4174361() {
GregorianCalendar calendar = new GregorianCalendar(1996, 1, 29);
calendar.add(MONTH, 10);
Date date1 = calendar.getTime(); int d1 = calendar.get(DAY_OF_MONTH);
calendar = new GregorianCalendar(1996, 1, 29);
calendar.add(MONTH, 11);
Date date2 = calendar.getTime(); int d2 = calendar.get(DAY_OF_MONTH);
if (d1 != d2) {
errln("adding months to Feb 29 broken");
}
}
/** * Calendar does not update field values when setTimeZone is called.
*/ publicvoid Test4177484() {
TimeZone PST = TimeZone.getTimeZone("PST");
TimeZone EST = TimeZone.getTimeZone("EST");
Calendar cal = Calendar.getInstance(PST, Locale.US);
cal.clear();
cal.set(1999, 3, 21, 15, 5, 0); // Arbitrary int h1 = cal.get(HOUR_OF_DAY);
cal.setTimeZone(EST); int h2 = cal.get(HOUR_OF_DAY); if (h1 == h2) {
errln("FAIL: Fields not updated after setTimeZone");
}
// getTime() must NOT change when time zone is changed. // getTime() returns zone-independent time in ms.
cal.clear();
cal.setTimeZone(PST);
cal.set(HOUR_OF_DAY, 10);
Date pst10 = cal.getTime();
cal.setTimeZone(EST);
Date est10 = cal.getTime(); if (!pst10.equals(est10)) {
errln("FAIL: setTimeZone changed time");
}
}
/** * Week of year is wrong at the start and end of the year.
*/ publicvoid Test4197699() {
GregorianCalendar cal = new GregorianCalendar();
cal.setFirstDayOfWeek(MONDAY);
cal.setMinimalDaysInFirstWeek(4);
DateFormat fmt = new SimpleDateFormat("E dd MMM yyyy 'DOY='D 'WOY='w");
fmt.setCalendar(cal);
for (int i = 0; i < DATA.length;) {
cal.set(DATA[i++], DATA[i++], DATA[i++]); int expWOY = DATA[i++]; int actWOY = cal.get(WEEK_OF_YEAR); if (expWOY == actWOY) {
logln("Ok: " + fmt.format(cal.getTime()));
} else {
errln("FAIL: " + fmt.format(cal.getTime())
+ ", expected WOY=" + expWOY);
cal.add(DATE, -8); for (int j = 0; j < 14; ++j) {
cal.add(DATE, 1);
logln(fmt.format(cal.getTime()));
}
}
}
}
/** * Calendar DAY_OF_WEEK_IN_MONTH fields->time broken. The problem * is in the field disambiguation code in GregorianCalendar. This * code is supposed to choose the most recent set of fields * among the following: * * MONTH + DAY_OF_MONTH * MONTH + WEEK_OF_MONTH + DAY_OF_WEEK * MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK * DAY_OF_YEAR * WEEK_OF_YEAR + DAY_OF_WEEK
*/
@SuppressWarnings("deprecation") publicvoid Test4209071() {
Calendar cal = Calendar.getInstance(Locale.US);
// General field setting test int Y = 1995 - 1900;
Object[] FIELD_DATA = { // Add new test cases as needed.
// 0 newint[]{}, new Date(Y, JANUARY, 1), // 1 newint[]{MONTH, MARCH}, new Date(Y, MARCH, 1), // 2 newint[]{DAY_OF_WEEK, WEDNESDAY}, new Date(Y, JANUARY, 4), // 3 newint[]{DAY_OF_WEEK, THURSDAY,
DAY_OF_MONTH, 18,}, new Date(Y, JANUARY, 18), // 4 newint[]{DAY_OF_MONTH, 18,
DAY_OF_WEEK, THURSDAY,}, new Date(Y, JANUARY, 18), // 5 (WOM -1 is in previous month) newint[]{DAY_OF_MONTH, 18,
WEEK_OF_MONTH, -1,
DAY_OF_WEEK, THURSDAY,}, new Date(Y - 1, DECEMBER, 22), // 6 newint[]{DAY_OF_MONTH, 18,
WEEK_OF_MONTH, 4,
DAY_OF_WEEK, THURSDAY,}, new Date(Y, JANUARY, 26), // 7 (DIM -1 is in same month) newint[]{DAY_OF_MONTH, 18,
DAY_OF_WEEK_IN_MONTH, -1,
DAY_OF_WEEK, THURSDAY,}, new Date(Y, JANUARY, 26), // 8 newint[]{WEEK_OF_YEAR, 9,
DAY_OF_WEEK, WEDNESDAY,}, new Date(Y, MARCH, 1), // 9 newint[]{MONTH, OCTOBER,
DAY_OF_WEEK_IN_MONTH, 1,
DAY_OF_WEEK, FRIDAY,}, new Date(Y, OCTOBER, 6), // 10 newint[]{MONTH, OCTOBER,
WEEK_OF_MONTH, 2,
DAY_OF_WEEK, FRIDAY,}, new Date(Y, OCTOBER, 13), // 11 newint[]{MONTH, OCTOBER,
DAY_OF_MONTH, 15,
DAY_OF_YEAR, 222,}, new Date(Y, AUGUST, 10), // 12 newint[]{DAY_OF_WEEK, THURSDAY,
MONTH, DECEMBER,}, new Date(Y, DECEMBER, 7)};
for (int i = 0; i < FIELD_DATA.length; i += 2) { int[] fields = (int[]) FIELD_DATA[i];
Date exp = (Date) FIELD_DATA[i + 1];
publicvoid Test4328747() throws Exception {
Calendar c = Calendar.getInstance(Locale.US);
c.clear();
c.set(1966, 0, 1); // 1 jan 1966
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.30Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.