2 *******************************************************************************
\r
3 * Copyright (C) 2000-2009, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.calendar;
\r
9 import java.io.ByteArrayInputStream;
\r
10 import java.io.ByteArrayOutputStream;
\r
11 import java.io.IOException;
\r
12 import java.io.ObjectInputStream;
\r
13 import java.io.ObjectOutput;
\r
14 import java.io.ObjectOutputStream;
\r
15 import java.util.Date;
\r
16 import java.util.Locale;
\r
18 import com.ibm.icu.text.DateFormat;
\r
19 import com.ibm.icu.util.Calendar;
\r
20 import com.ibm.icu.util.GregorianCalendar;
\r
21 import com.ibm.icu.util.SimpleTimeZone;
\r
22 import com.ibm.icu.util.TimeZone;
\r
24 public class CompatibilityTest extends com.ibm.icu.dev.test.TestFmwk {
\r
26 public static void main(String argv[]) throws Exception {
\r
27 new CompatibilityTest().run(argv);
\r
30 static final String[] FIELD_NAME = {
\r
31 "ERA", "YEAR", "MONTH", "WEEK_OF_YEAR", "WEEK_OF_MONTH",
\r
32 "DAY_OF_MONTH", "DAY_OF_YEAR", "DAY_OF_WEEK",
\r
33 "DAY_OF_WEEK_IN_MONTH", "AM_PM", "HOUR", "HOUR_OF_DAY",
\r
34 "MINUTE", "SECOND", "MILLISECOND", "ZONE_OFFSET",
\r
35 "DST_OFFSET", "YEAR_WOY", "DOW_LOCAL", "EXTENDED_YEAR",
\r
36 "JULIAN_DAY", "MILLISECONDS_IN_DAY",
\r
40 * Test the behavior of the GregorianCalendar around the changeover.
\r
42 public void TestGregorianChangeover() {
\r
44 java.util.TimeZone jdkGMT = java.util.TimeZone.getTimeZone("GMT");
\r
45 java.util.Calendar jdkCal = java.util.Calendar.getInstance(jdkGMT);
\r
47 jdkCal.set(1582, Calendar.OCTOBER, 15);
\r
49 // if(jdkCal instanceof java.util.GregorianCalendar) {
\r
50 // logln("jdk IS grego");
\r
51 // java.util.GregorianCalendar jdkgc = (java.util.GregorianCalendar)
\r
53 // logln("jdk change at: " + jdkgc.getGregorianChange() + "(" + jdkgc.getGregorianChange().getTime() +")" );
\r
55 // logln("jdk NOT grego");
\r
58 long a = jdkCal.getTime().getTime();
\r
59 Date c = jdkCal.getTime();
\r
61 long b = c.getTime();
\r
63 logln(" " + a + " != " + b);
\r
64 logln("JDK has Gregorian cutover anomaly (1.5?) - skipping this test.");
\r
68 Date co = jdkCal.getTime();
\r
69 logln("Change over (Oct 15 1582) = " + co + " (" + co.getTime() + ")");
\r
70 final int ONE_DAY = 24*60*60*1000;
\r
71 TimeZone gmt = TimeZone.getTimeZone("GMT");
\r
72 GregorianCalendar cal = new GregorianCalendar(gmt);
\r
74 Changeover -7 days: 1582/9/28 dow=6
\r
75 Changeover -6 days: 1582/9/29 dow=7
\r
76 Changeover -5 days: 1582/9/30 dow=1
\r
77 Changeover -4 days: 1582/10/1 dow=2
\r
78 Changeover -3 days: 1582/10/2 dow=3
\r
79 Changeover -2 days: 1582/10/3 dow=4
\r
80 Changeover -1 days: 1582/10/4 dow=5
\r
81 Changeover +0 days: 1582/10/15 dow=6
\r
82 Changeover +1 days: 1582/10/16 dow=7
\r
83 Changeover +2 days: 1582/10/17 dow=1
\r
84 Changeover +3 days: 1582/10/18 dow=2
\r
85 Changeover +4 days: 1582/10/19 dow=3
\r
86 Changeover +5 days: 1582/10/20 dow=4
\r
87 Changeover +6 days: 1582/10/21 dow=5
\r
88 Changeover +7 days: 1582/10/22 dow=6
\r
90 int MON[] = { 9, 9, 9,10,10,10,10, 10, 10, 10, 10, 10, 10, 10, 10 };
\r
91 int DOM[] = { 28, 29, 30, 1, 2, 3, 4, 15, 16, 17, 18, 19, 20, 21, 22 };
\r
92 int DOW[] = { 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6 };
\r
93 // ^ <-Changeover Fri Oct 15 1582
\r
95 for (int i=-7; i<=7; ++i, ++j) {
\r
96 Date d = new Date(co.getTime() + i*ONE_DAY);
\r
98 int y = cal.get(Calendar.YEAR), mon = cal.get(Calendar.MONTH)+1-Calendar.JANUARY,
\r
99 dom = cal.get(Calendar.DATE), dow = cal.get(Calendar.DAY_OF_WEEK);
\r
100 logln("Changeover " + (i>=0?"+":"") +
\r
101 i + " days: " + y + "/" + mon + "/" + dom + " dow=" + dow);
\r
102 if (y != 1582 || mon != MON[j] || dom != DOM[j] || dow != DOW[j])
\r
103 errln(" Fail: Above line is wrong");
\r
108 * Test the mapping between millis and fields. For the purposes
\r
109 * of this test, we don't care about timezones and week data
\r
110 * (first day of week, minimal days in first week).
\r
112 public void TestMapping() {
\r
114 Date PURE_GREGORIAN = new Date(Long.MIN_VALUE);
\r
115 Date PURE_JULIAN = new Date(Long.MAX_VALUE);
\r
116 GregorianCalendar cal =
\r
117 new GregorianCalendar(TimeZone.getTimeZone("UTC"));
\r
118 final int EPOCH_JULIAN = 2440588;
\r
119 final long ONE_DAY = 24*60*60*1000L;
\r
120 com.ibm.icu.text.SimpleDateFormat fmt =
\r
121 new com.ibm.icu.text.SimpleDateFormat("EEE MMM dd yyyy G");
\r
124 for (int type=0; type<2; ++type) {
\r
125 System.out.println(type==0 ? "Gregorian" : "Julian");
\r
126 cal.setGregorianChange(type==0 ? PURE_GREGORIAN : PURE_JULIAN);
\r
127 fmt.setCalendar(cal);
\r
141 for (int i=0; i<J.length; ++i) {
\r
142 String[] lim = new String[2];
\r
143 long[] ms = new long[2];
\r
145 for (int sign=0; sign<2; ++sign) {
\r
147 if (sign==0) julian = -julian;
\r
148 long millis = ((long)julian - EPOCH_JULIAN) * ONE_DAY;
\r
150 cal.setTime(new Date(millis));
\r
151 lim[sign] = fmt.format(cal.getTime());
\r
153 System.out.println("JD +/-" +
\r
154 Long.toString(jd, 16) +
\r
155 ": " + ms[0] + ".." + ms[1] +
\r
156 ": " + lim[0] + ".." + lim[1]);
\r
161 TimeZone saveZone = TimeZone.getDefault();
\r
163 TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
\r
165 Date PURE_GREGORIAN = new Date(Long.MIN_VALUE);
\r
166 Date PURE_JULIAN = new Date(Long.MAX_VALUE);
\r
167 GregorianCalendar cal = new GregorianCalendar();
\r
168 final int EPOCH_JULIAN = 2440588;
\r
169 final long ONE_DAY = 24*60*60*1000L;
\r
171 // Julian# Year Month DOM JULIAN:Year, Month, DOM
\r
172 2440588, 1970, Calendar.JANUARY, 1, 1969, Calendar.DECEMBER, 19,
\r
173 2415080, 1900, Calendar.MARCH, 1, 1900, Calendar.FEBRUARY, 17,
\r
174 2451604, 2000, Calendar.FEBRUARY, 29, 2000, Calendar.FEBRUARY, 16,
\r
175 2452269, 2001, Calendar.DECEMBER, 25, 2001, Calendar.DECEMBER, 12,
\r
176 2416526, 1904, Calendar.FEBRUARY, 15, 1904, Calendar.FEBRUARY, 2,
\r
177 2416656, 1904, Calendar.JUNE, 24, 1904, Calendar.JUNE, 11,
\r
178 1721426, 1, Calendar.JANUARY, 1, 1, Calendar.JANUARY, 3,
\r
179 2000000, 763, Calendar.SEPTEMBER, 18, 763, Calendar.SEPTEMBER, 14,
\r
180 4000000, 6239, Calendar.JULY, 12, 6239, Calendar.MAY, 28,
\r
181 8000000, 17191, Calendar.FEBRUARY, 26, 17190, Calendar.OCTOBER, 22,
\r
182 10000000, 22666, Calendar.DECEMBER, 20, 22666, Calendar.JULY, 5,
\r
184 for (int i=0; i<DATA.length; i+=7) {
\r
185 int julian = DATA[i];
\r
186 int year = DATA[i+1];
\r
187 int month = DATA[i+2];
\r
188 int dom = DATA[i+3];
\r
189 int year2, month2, dom2;
\r
190 long millis = (julian - EPOCH_JULIAN) * ONE_DAY;
\r
193 // Test Gregorian computation
\r
194 cal.setGregorianChange(PURE_GREGORIAN);
\r
196 cal.set(year, month, dom);
\r
197 long calMillis = cal.getTime().getTime();
\r
198 long delta = calMillis - millis;
\r
199 cal.setTime(new Date(millis));
\r
200 year2 = cal.get(Calendar.YEAR);
\r
201 month2 = cal.get(Calendar.MONTH);
\r
202 dom2 = cal.get(Calendar.DAY_OF_MONTH);
\r
203 s = "G " + year + "-" + (month+1-Calendar.JANUARY) + "-" + dom +
\r
204 " => " + calMillis +
\r
205 " (" + ((float)delta/ONE_DAY) + " day delta) => " +
\r
206 year2 + "-" + (month2+1-Calendar.JANUARY) + "-" + dom2;
\r
207 if (delta != 0 || year != year2 || month != month2 ||
\r
208 dom != dom2) errln(s + " FAIL");
\r
211 // Test Julian computation
\r
215 cal.setGregorianChange(PURE_JULIAN);
\r
217 cal.set(year, month, dom);
\r
218 calMillis = cal.getTime().getTime();
\r
219 delta = calMillis - millis;
\r
220 cal.setTime(new Date(millis));
\r
221 year2 = cal.get(Calendar.YEAR);
\r
222 month2 = cal.get(Calendar.MONTH);
\r
223 dom2 = cal.get(Calendar.DAY_OF_MONTH);
\r
224 s = "J " + year + "-" + (month+1-Calendar.JANUARY) + "-" + dom +
\r
225 " => " + calMillis +
\r
226 " (" + ((float)delta/ONE_DAY) + " day delta) => " +
\r
227 year2 + "-" + (month2+1-Calendar.JANUARY) + "-" + dom2;
\r
228 if (delta != 0 || year != year2 || month != month2 ||
\r
229 dom != dom2) errln(s + " FAIL");
\r
233 java.util.Calendar tempcal = java.util.Calendar.getInstance();
\r
235 tempcal.set(1582, Calendar.OCTOBER, 15);
\r
236 cal.setGregorianChange(tempcal.getTime());
\r
237 auxMapping(cal, 1582, Calendar.OCTOBER, 4);
\r
238 auxMapping(cal, 1582, Calendar.OCTOBER, 15);
\r
239 auxMapping(cal, 1582, Calendar.OCTOBER, 16);
\r
240 for (int y=800; y<3000; y+=1+(int)(100*Math.random())) {
\r
241 for (int m=Calendar.JANUARY; m<=Calendar.DECEMBER; ++m) {
\r
242 auxMapping(cal, y, m, 15);
\r
247 TimeZone.setDefault(saveZone);
\r
250 private void auxMapping(Calendar cal, int y, int m, int d) {
\r
253 long millis = cal.getTime().getTime();
\r
254 cal.setTime(new Date(millis));
\r
255 int year2 = cal.get(Calendar.YEAR);
\r
256 int month2 = cal.get(Calendar.MONTH);
\r
257 int dom2 = cal.get(Calendar.DAY_OF_MONTH);
\r
258 if (y != year2 || m != month2 || dom2 != d)
\r
259 errln("Round-trip failure: " + y + "-" + (m+1) + "-"+d+" =>ms=> " +
\r
260 year2 + "-" + (month2+1) + "-" + dom2);
\r
263 public void TestGenericAPI() {
\r
264 // not used String str;
\r
266 java.util.Calendar tempcal = java.util.Calendar.getInstance();
\r
268 tempcal.set(1990, Calendar.APRIL, 15);
\r
269 Date when = tempcal.getTime();
\r
271 String tzid = "TestZone";
\r
272 int tzoffset = 123400;
\r
274 SimpleTimeZone zone = new SimpleTimeZone(tzoffset, tzid);
\r
275 Calendar cal = (Calendar)Calendar.getInstance((SimpleTimeZone)zone.clone());
\r
277 if (!zone.equals(cal.getTimeZone())) errln("FAIL: Calendar.getTimeZone failed");
\r
279 Calendar cal2 = Calendar.getInstance(cal.getTimeZone());
\r
282 cal2.setTime(when);
\r
284 if (!(cal.equals(cal2))) errln("FAIL: Calendar.operator== failed");
\r
285 // if ((*cal != *cal2)) errln("FAIL: Calendar.operator!= failed");
\r
286 if (!cal.equals(cal2) ||
\r
287 cal.before(cal2) ||
\r
288 cal.after(cal2)) errln("FAIL: equals/before/after failed");
\r
290 cal2.setTime(new Date(when.getTime() + 1000));
\r
291 if (cal.equals(cal2) ||
\r
292 cal2.before(cal) ||
\r
293 cal.after(cal2)) errln("FAIL: equals/before/after failed");
\r
295 cal.roll(Calendar.SECOND, true);
\r
296 if (!cal.equals(cal2) ||
\r
297 cal.before(cal2) ||
\r
298 cal.after(cal2)) errln("FAIL: equals/before/after failed");
\r
300 // Roll back to January
\r
301 cal.roll(Calendar.MONTH, (int)(1 + Calendar.DECEMBER - cal.get(Calendar.MONTH)));
\r
302 if (cal.equals(cal2) ||
\r
303 cal2.before(cal) ||
\r
304 cal.after(cal2)) errln("FAIL: equals/before/after failed");
\r
307 /* TimeZone z = cal.orphanTimeZone();
\r
308 if (z.getID(str) != tzid ||
\r
309 z.getRawOffset() != tzoffset)
\r
310 errln("FAIL: orphanTimeZone failed");
\r
313 for (int i=0; i<2; ++i) {
\r
314 boolean lenient = ( i > 0 );
\r
315 cal.setLenient(lenient);
\r
316 if (lenient != cal.isLenient()) errln("FAIL: setLenient/isLenient failed");
\r
317 // Later: Check for lenient behavior
\r
321 for (i=Calendar.SUNDAY; i<=Calendar.SATURDAY; ++i) {
\r
322 cal.setFirstDayOfWeek(i);
\r
323 if (cal.getFirstDayOfWeek() != i) errln("FAIL: set/getFirstDayOfWeek failed");
\r
326 for (i=1; i<=7; ++i) {
\r
327 cal.setMinimalDaysInFirstWeek(i);
\r
328 if (cal.getMinimalDaysInFirstWeek() != i) errln("FAIL: set/getFirstDayOfWeek failed");
\r
331 for (i=0; i<cal.getFieldCount(); ++i) {
\r
332 if (cal.getMinimum(i) > cal.getGreatestMinimum(i))
\r
333 errln("FAIL: getMinimum larger than getGreatestMinimum for field " + i);
\r
334 if (cal.getLeastMaximum(i) > cal.getMaximum(i))
\r
335 errln("FAIL: getLeastMaximum larger than getMaximum for field " + i);
\r
336 if (cal.getMinimum(i) >= cal.getMaximum(i))
\r
337 errln("FAIL: getMinimum not less than getMaximum for field " + i);
\r
340 cal.setTimeZone(TimeZone.getDefault());
\r
342 cal.set(1984, 5, 24);
\r
344 tempcal.set(1984, 5, 24);
\r
345 if (cal.getTime().getTime() != tempcal.getTime().getTime()) {
\r
346 errln("FAIL: Calendar.set(3 args) failed");
\r
347 logln(" Got: " + cal.getTime() + " Expected: " + tempcal.getTime());
\r
351 cal.set(1985, 2, 2, 11, 49);
\r
353 tempcal.set(1985, 2, 2, 11, 49);
\r
354 if (cal.getTime().getTime() != tempcal.getTime().getTime()) {
\r
355 errln("FAIL: Calendar.set(5 args) failed");
\r
356 logln(" Got: " + cal.getTime() + " Expected: " + tempcal.getTime());
\r
360 cal.set(1995, 9, 12, 1, 39, 55);
\r
362 tempcal.set(1995, 9, 12, 1, 39, 55);
\r
363 if (cal.getTime().getTime() != tempcal.getTime().getTime()) {
\r
364 errln("FAIL: Calendar.set(6 args) failed");
\r
365 logln(" Got: " + cal.getTime() + " Expected: " + tempcal.getTime());
\r
369 // This test is strange -- why do we expect certain fields to be set, and
\r
370 // others not to be? Revisit the appropriateness of this. - Alan NEWCAL
\r
371 for (i=0; i<cal.getFieldCount(); ++i) {
\r
373 case Calendar.YEAR: case Calendar.MONTH: case Calendar.DATE:
\r
374 case Calendar.HOUR_OF_DAY: case Calendar.MINUTE: case Calendar.SECOND:
\r
375 case Calendar.EXTENDED_YEAR:
\r
376 if (!cal.isSet(i)) errln("FAIL: " + FIELD_NAME[i] + " is not set");
\r
379 if (cal.isSet(i)) errln("FAIL: " + FIELD_NAME[i] + " is set");
\r
382 if (cal.isSet(i)) errln("FAIL: Calendar.clear/isSet failed");
\r
388 Locale[] loc = Calendar.getAvailableLocales();
\r
389 long count = loc.length;
\r
390 if (count < 1 || loc == null) {
\r
391 errln("FAIL: getAvailableLocales failed");
\r
394 for (i=0; i<count; ++i) {
\r
395 cal = Calendar.getInstance(loc[i]);
\r
400 cal = Calendar.getInstance(TimeZone.getDefault(), Locale.ENGLISH);
\r
403 cal = Calendar.getInstance(zone, Locale.ENGLISH);
\r
406 GregorianCalendar gc = new GregorianCalendar(zone);
\r
409 gc = new GregorianCalendar(Locale.ENGLISH);
\r
412 gc = new GregorianCalendar(Locale.ENGLISH);
\r
415 gc = new GregorianCalendar(zone, Locale.ENGLISH);
\r
418 gc = new GregorianCalendar(zone);
\r
421 gc = new GregorianCalendar(1998, 10, 14, 21, 43);
\r
423 tempcal.set(1998, 10, 14, 21, 43);
\r
424 if (gc.getTime().getTime() != tempcal.getTime().getTime())
\r
425 errln("FAIL: new GregorianCalendar(ymdhm) failed");
\r
428 gc = new GregorianCalendar(1998, 10, 14, 21, 43, 55);
\r
430 tempcal.set(1998, 10, 14, 21, 43, 55);
\r
431 if (gc.getTime().getTime() != tempcal.getTime().getTime())
\r
432 errln("FAIL: new GregorianCalendar(ymdhms) failed");
\r
435 // GregorianCalendar gc2 = new GregorianCalendar(Locale.ENGLISH);
\r
437 // if (gc2 != gc || !(gc2 == gc)) errln("FAIL: GregorianCalendar assignment/operator==/operator!= failed");
\r
442 // Verify Roger Webster's bug
\r
443 public void TestRog() {
\r
444 GregorianCalendar gc = new GregorianCalendar();
\r
446 int year = 1997, month = Calendar.APRIL, date = 1;
\r
447 gc.set(year, month, date); // April 1, 1997
\r
449 gc.set(Calendar.HOUR_OF_DAY, 23);
\r
450 gc.set(Calendar.MINUTE, 0);
\r
451 gc.set(Calendar.SECOND, 0);
\r
452 gc.set(Calendar.MILLISECOND, 0);
\r
454 for (int i = 0; i < 9; i++, gc.add(Calendar.DATE, 1)) {
\r
455 if (gc.get(Calendar.YEAR) != year ||
\r
456 gc.get(Calendar.MONTH) != month ||
\r
457 gc.get(Calendar.DATE) != (date + i))
\r
458 errln("FAIL: Date " + gc.getTime() + " wrong");
\r
462 // Verify DAY_OF_WEEK
\r
463 public void TestDOW943() {
\r
468 void dowTest(boolean lenient) {
\r
469 GregorianCalendar cal = new GregorianCalendar();
\r
470 cal.set(1997, Calendar.AUGUST, 12); // Wednesday
\r
471 cal.getTime(); // Force update
\r
472 cal.setLenient(lenient);
\r
473 cal.set(1996, Calendar.DECEMBER, 1); // Set the date to be December 1, 1996
\r
474 int dow = cal.get(Calendar.DAY_OF_WEEK);
\r
475 int min = cal.getMinimum(Calendar.DAY_OF_WEEK);
\r
476 int max = cal.getMaximum(Calendar.DAY_OF_WEEK);
\r
477 if (dow < min || dow > max) errln("FAIL: Day of week " + dow + " out of range");
\r
478 if (dow != Calendar.SUNDAY) {
\r
479 errln("FAIL2: Day of week should be SUNDAY; is " + dow + ": " + cal.getTime());
\r
481 if (min != Calendar.SUNDAY || max != Calendar.SATURDAY) errln("FAIL: Min/max bad");
\r
484 // Verify that the clone method produces distinct objects with no
\r
485 // unintentionally shared fields.
\r
486 public void TestClonesUnique908() {
\r
487 Calendar c = Calendar.getInstance();
\r
488 Calendar d = (Calendar)c.clone();
\r
489 c.set(Calendar.MILLISECOND, 123);
\r
490 d.set(Calendar.MILLISECOND, 456);
\r
491 if (c.get(Calendar.MILLISECOND) != 123 ||
\r
492 d.get(Calendar.MILLISECOND) != 456) {
\r
493 errln("FAIL: Clones share fields");
\r
497 // Verify effect of Gregorian cutoff value
\r
498 public void TestGregorianChange768() {
\r
500 GregorianCalendar c = new GregorianCalendar();
\r
501 logln("With cutoff " + c.getGregorianChange());
\r
502 logln(" isLeapYear(1800) = " + (b=c.isLeapYear(1800)));
\r
503 logln(" (should be FALSE)");
\r
504 if (b != false) errln("FAIL");
\r
505 java.util.Calendar tempcal = java.util.Calendar.getInstance();
\r
507 tempcal.set(1900, 0, 1);
\r
508 c.setGregorianChange(tempcal.getTime()); // Jan 1 1900
\r
509 logln("With cutoff " + c.getGregorianChange());
\r
510 logln(" isLeapYear(1800) = " + (b=c.isLeapYear(1800)));
\r
511 logln(" (should be TRUE)");
\r
512 if (b != true) errln("FAIL");
\r
515 // Test the correct behavior of the disambiguation algorithm.
\r
516 public void TestDisambiguation765() throws Exception {
\r
517 Calendar c = Calendar.getInstance();
\r
518 c.setLenient(false);
\r
521 c.set(Calendar.YEAR, 1997);
\r
522 c.set(Calendar.MONTH, Calendar.JUNE);
\r
523 c.set(Calendar.DATE, 3);
\r
525 verify765("1997 third day of June = ", c, 1997, Calendar.JUNE, 3);
\r
528 c.set(Calendar.YEAR, 1997);
\r
529 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
530 c.set(Calendar.MONTH, Calendar.JUNE);
\r
531 c.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1);
\r
532 verify765("1997 first Tuesday in June = ", c, 1997, Calendar.JUNE, 3);
\r
535 c.set(Calendar.YEAR, 1997);
\r
536 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
537 c.set(Calendar.MONTH, Calendar.JUNE);
\r
538 c.set(Calendar.DAY_OF_WEEK_IN_MONTH, -1);
\r
539 verify765("1997 last Tuesday in June = ", c, 1997, Calendar.JUNE, 24);
\r
541 IllegalArgumentException e = null;
\r
544 c.set(Calendar.YEAR, 1997);
\r
545 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
546 c.set(Calendar.MONTH, Calendar.JUNE);
\r
547 c.set(Calendar.DAY_OF_WEEK_IN_MONTH, 0);
\r
550 catch (IllegalArgumentException ex) {
\r
553 verify765("1997 zero-th Tuesday in June = ", e, c);
\r
556 c.set(Calendar.YEAR, 1997);
\r
557 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
558 c.set(Calendar.MONTH, Calendar.JUNE);
\r
559 c.set(Calendar.WEEK_OF_MONTH, 1);
\r
560 verify765("1997 Tuesday in week 1 of June = ", c, 1997, Calendar.JUNE, 3);
\r
563 c.set(Calendar.YEAR, 1997);
\r
564 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
565 c.set(Calendar.MONTH, Calendar.JUNE);
\r
566 c.set(Calendar.WEEK_OF_MONTH, 5);
\r
567 verify765("1997 Tuesday in week 5 of June = ", c, 1997, Calendar.JULY, 1);
\r
571 c.set(Calendar.YEAR, 1997);
\r
572 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
573 c.set(Calendar.MONTH, Calendar.JUNE);
\r
574 c.set(Calendar.WEEK_OF_MONTH, 0);
\r
577 catch (IllegalArgumentException ex) {
\r
580 verify765("1997 Tuesday in week 0 of June = ", e, c);
\r
583 c.set(Calendar.YEAR, 1997);
\r
584 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
585 c.set(Calendar.WEEK_OF_YEAR, 1);
\r
586 verify765("1997 Tuesday in week 1 of year = ", c, 1996, Calendar.DECEMBER, 31);
\r
589 c.set(Calendar.YEAR, 1997);
\r
590 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
591 c.set(Calendar.WEEK_OF_YEAR, 10);
\r
592 verify765("1997 Tuesday in week 10 of year = ", c, 1997, Calendar.MARCH, 4);
\r
597 c.set(Calendar.YEAR, 1997);
\r
598 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
\r
599 c.set(Calendar.WEEK_OF_YEAR, 0);
\r
602 catch (IllegalArgumentException ex) {
\r
605 verify765("1997 Tuesday in week 0 of year = ", e, c);
\r
607 void verify765(String msg, Calendar c, int year, int month, int day) {
\r
608 int cy = c.get(Calendar.YEAR); // NEWCAL
\r
609 int cm = c.get(Calendar.MONTH);
\r
610 int cd = c.get(Calendar.DATE);
\r
614 logln("PASS: " + msg + c.getTime());
\r
617 errln("FAIL: " + msg + cy + "/" + (cm+1) + "/" + cd +
\r
618 "=" + c.getTime() +
\r
620 year + "/" + (month+1) + "/" + day);
\r
623 // Called when e expected to be non-null
\r
624 void verify765(String msg, IllegalArgumentException e, Calendar c) {
\r
625 if (e == null) errln("FAIL: No IllegalArgumentException for " + msg +
\r
627 else logln("PASS: " + msg + "IllegalArgument as expected");
\r
630 // Test the behavior of GMT vs. local time
\r
631 public void TestGMTvsLocal4064654() {
\r
632 // Sample output 1:
\r
633 // % /usr/local/java/jdk1.1.3/solaris/bin/java test 1997 1 1 12 0 0
\r
634 // date = Wed Jan 01 04:00:00 PST 1997
\r
635 // offset for Wed Jan 01 04:00:00 PST 1997= -8hr
\r
636 aux4064654(1997, 1, 1, 12, 0, 0);
\r
638 // Sample output 2:
\r
639 // % /usr/local/java/jdk1.1.3/solaris/bin/java test 1997 4 16 18 30 0
\r
640 // date = Wed Apr 16 10:30:00 PDT 1997
\r
641 // offset for Wed Apr 16 10:30:00 PDT 1997= -7hr
\r
643 // Note that in sample output 2 according to the offset, the gmt time
\r
644 // of the result would be 1997 4 16 17 30 0 which is different from the
\r
645 // input of 1997 4 16 18 30 0.
\r
646 aux4064654(1997, 4, 16, 18, 30, 0);
\r
648 void aux4064654(int yr, int mo, int dt, int hr, int mn, int sc) {
\r
650 Calendar gmtcal = Calendar.getInstance();
\r
651 gmtcal.setTimeZone(TimeZone.getTimeZone("Africa/Casablanca"));
\r
652 gmtcal.set(yr, mo-1, dt, hr, mn, sc);
\r
653 gmtcal.set(Calendar.MILLISECOND, 0);
\r
655 date = gmtcal.getTime();
\r
656 logln("date = "+date);
\r
658 Calendar cal = Calendar.getInstance();
\r
659 cal.setTimeZone(TimeZone.getTimeZone("America/Los_Angels"));
\r
662 int offset = cal.getTimeZone().getOffset(cal.get(Calendar.ERA),
\r
663 cal.get(Calendar.YEAR),
\r
664 cal.get(Calendar.MONTH),
\r
665 cal.get(Calendar.DATE),
\r
666 cal.get(Calendar.DAY_OF_WEEK),
\r
667 cal.get(Calendar.MILLISECOND));
\r
669 logln("offset for "+date+"= "+(offset/1000/60/60.0) + "hr");
\r
671 int utc = ((cal.get(Calendar.HOUR_OF_DAY) * 60 +
\r
672 cal.get(Calendar.MINUTE)) * 60 +
\r
673 cal.get(Calendar.SECOND)) * 1000 +
\r
674 cal.get(Calendar.MILLISECOND) - offset;
\r
676 int expected = ((hr * 60 + mn) * 60 + sc) * 1000;
\r
678 if (utc != expected)
\r
679 errln("FAIL: Discrepancy of " +
\r
680 (utc - expected) + " millis = " +
\r
681 ((utc-expected)/1000/60/60.0) + " hr");
\r
684 // Verify that add and set work regardless of the order in which
\r
685 // they are called.
\r
686 public void TestAddSetOrder621() {
\r
687 java.util.Calendar tempcal = java.util.Calendar.getInstance();
\r
689 tempcal.set(1997, 4, 14, 13, 23, 45);
\r
690 Date d = tempcal.getTime();
\r
692 Calendar cal = Calendar.getInstance ();
\r
694 cal.add (Calendar.DATE, -5);
\r
695 cal.set (Calendar.HOUR_OF_DAY, 0);
\r
696 cal.set (Calendar.MINUTE, 0);
\r
697 cal.set (Calendar.SECOND, 0);
\r
698 // ma feb 03 00:00:00 GMT+00:00 1997
\r
699 String s = cal.getTime ().toString ();
\r
701 cal = Calendar.getInstance ();
\r
703 cal.set (Calendar.HOUR_OF_DAY, 0);
\r
704 cal.set (Calendar.MINUTE, 0);
\r
705 cal.set (Calendar.SECOND, 0);
\r
706 cal.add (Calendar.DATE, -5);
\r
707 // ma feb 03 13:11:06 GMT+00:00 1997
\r
708 String s2 = cal.getTime ().toString ();
\r
711 logln("Pass: " + s + " == " + s2);
\r
713 errln("FAIL: " + s + " != " + s2);
\r
716 // Verify that add works.
\r
717 public void TestAdd520() {
\r
718 int y = 1997, m = Calendar.FEBRUARY, d = 1;
\r
719 GregorianCalendar temp = new GregorianCalendar( y, m, d );
\r
720 check520(temp, y, m, d);
\r
722 temp.add( Calendar.YEAR, 1 );
\r
724 check520(temp, y, m, d);
\r
726 temp.add( Calendar.MONTH, 1 );
\r
728 check520(temp, y, m, d);
\r
730 temp.add( Calendar.DATE, 1 );
\r
732 check520(temp, y, m, d);
\r
734 temp.add( Calendar.DATE, 2 );
\r
736 check520(temp, y, m, d);
\r
738 temp.add( Calendar.DATE, 28 );
\r
740 check520(temp, y, m, d);
\r
742 void check520(Calendar c, int y, int m, int d) {
\r
743 if (c.get(Calendar.YEAR) != y ||
\r
744 c.get(Calendar.MONTH) != m ||
\r
745 c.get(Calendar.DATE) != d) {
\r
746 errln("FAILURE: Expected YEAR/MONTH/DATE of " +
\r
747 y + "/" + (m+1) + "/" + d +
\r
749 c.get(Calendar.YEAR) + "/" +
\r
750 (c.get(Calendar.MONTH)+1) + "/" +
\r
751 c.get(Calendar.DATE));
\r
753 else logln("Confirmed: " +
\r
754 y + "/" + (m+1) + "/" + d);
\r
757 // Verify that setting fields works. This test fails when an exception is thrown.
\r
758 public void TestFieldSet4781() {
\r
760 GregorianCalendar g = new GregorianCalendar();
\r
761 GregorianCalendar g2 = new GregorianCalendar();
\r
762 // At this point UTC value is set, various fields are not.
\r
763 // Now set to noon.
\r
764 g2.set(Calendar.HOUR, 12);
\r
765 g2.set(Calendar.MINUTE, 0);
\r
766 g2.set(Calendar.SECOND, 0);
\r
767 // At this point the object thinks UTC is NOT set, but fields are set.
\r
768 // The following line will result in IllegalArgumentException because
\r
769 // it thinks the YEAR is set and it is NOT.
\r
773 logln("Different");
\r
775 catch (IllegalArgumentException e) {
\r
776 errln("Unexpected exception seen: " + e);
\r
780 // Test serialization of a Calendar object
\r
781 public void TestSerialize337() {
\r
782 Calendar cal = Calendar.getInstance();
\r
784 boolean ok = false;
\r
787 ByteArrayOutputStream f = new ByteArrayOutputStream();
\r
788 ObjectOutput s = new ObjectOutputStream(f);
\r
789 s.writeObject(PREFIX);
\r
790 s.writeObject(cal);
\r
791 s.writeObject(POSTFIX);
\r
794 ByteArrayInputStream in = new ByteArrayInputStream(f.toByteArray());
\r
795 ObjectInputStream t = new ObjectInputStream(in);
\r
796 String pre = (String)t.readObject();
\r
797 Calendar c = (Calendar)t.readObject();
\r
798 String post = (String)t.readObject();
\r
801 ok = pre.equals(PREFIX) &&
\r
802 post.equals(POSTFIX) &&
\r
805 catch (IOException e) {
\r
806 errln("FAIL: Exception received:");
\r
807 // e.printStackTrace(log);
\r
809 catch (ClassNotFoundException e) {
\r
810 errln("FAIL: Exception received:");
\r
811 // e.printStackTrace(log);
\r
814 if (!ok) errln("Serialization of Calendar object failed.");
\r
816 static final String PREFIX = "abc";
\r
817 static final String POSTFIX = "def";
\r
818 static final String FILENAME = "tmp337.bin";
\r
820 // Try to zero out the seconds field
\r
821 public void TestSecondsZero121() {
\r
822 Calendar cal = new GregorianCalendar();
\r
823 // Initialize with current date/time
\r
824 cal.setTime(new Date());
\r
825 // Round down to minute
\r
826 cal.set(Calendar.SECOND, 0);
\r
827 Date d = cal.getTime();
\r
828 String s = d.toString();
\r
829 if (s.indexOf(":00 ") < 0) errln("Expected to see :00 in " + s);
\r
832 // Try various sequences of add, set, and get method calls.
\r
833 public void TestAddSetGet0610() {
\r
836 // - Upon initialization calendar fields, millis = System.currentTime
\r
837 // - After set is called fields are initialized, time is not
\r
838 // - Addition uses millis which are still *now*
\r
841 Calendar calendar = new GregorianCalendar( ) ;
\r
842 calendar.set( 1993, Calendar.JANUARY, 4 ) ;
\r
843 logln( "1A) " + value( calendar ) ) ;
\r
844 calendar.add( Calendar.DATE, 1 ) ;
\r
845 String v = value(calendar);
\r
846 logln( "1B) " + v );
\r
847 logln( "--) 1993/0/5" ) ;
\r
848 if (!v.equals(EXPECTED_0610)) errln("Expected " + EXPECTED_0610 +
\r
854 // - Upon initialization calendar fields set, millis = 0
\r
855 // - Addition uses millis which are still 1970, 0, 1
\r
859 Calendar calendar = new GregorianCalendar( 1993, Calendar.JANUARY, 4 ) ;
\r
860 logln( "2A) " + value( calendar ) ) ;
\r
861 calendar.add( Calendar.DATE, 1 ) ;
\r
862 String v = value(calendar);
\r
863 logln( "2B) " + v );
\r
864 logln( "--) 1993/0/5" ) ;
\r
865 if (!v.equals(EXPECTED_0610)) errln("Expected " + EXPECTED_0610 +
\r
871 // - Upon initialization calendar fields, millis = 0
\r
872 // - getTime( ) is called which forces the millis to be set
\r
873 // - Addition uses millis which are correct
\r
877 Calendar calendar = new GregorianCalendar( 1993, Calendar.JANUARY, 4 ) ;
\r
878 logln( "3A) " + value( calendar ) ) ;
\r
879 calendar.getTime( ) ;
\r
880 calendar.add( Calendar.DATE, 1 ) ;
\r
881 String v = value(calendar);
\r
882 logln( "3B) " + v ) ;
\r
883 logln( "--) 1993/0/5" ) ;
\r
884 if (!v.equals(EXPECTED_0610)) errln("Expected " + EXPECTED_0610 +
\r
888 static String value( Calendar calendar ) {
\r
889 return( calendar.get( Calendar.YEAR ) + "/" +
\r
890 calendar.get( Calendar.MONTH ) + "/" +
\r
891 calendar.get( Calendar.DATE ) ) ;
\r
893 static String EXPECTED_0610 = "1993/0/5";
\r
895 // Test that certain fields on a certain date are as expected.
\r
896 public void TestFields060() {
\r
898 int month = java.util.Calendar.OCTOBER; //october
\r
899 int dDate = 22; //DAYOFWEEK should return 3 for Wednesday
\r
900 GregorianCalendar calendar = null;
\r
902 calendar = new GregorianCalendar( year, month, dDate);
\r
903 for (int i=0; i<EXPECTED_FIELDS.length; ) {
\r
904 int field = EXPECTED_FIELDS[i++];
\r
905 int expected = EXPECTED_FIELDS[i++];
\r
906 if (calendar.get(field) != expected) {
\r
907 errln("Expected field " + field + " to have value " + expected +
\r
908 "; received " + calendar.get(field) + " instead");
\r
912 static int EXPECTED_FIELDS[] = {
\r
913 Calendar.YEAR, 1997,
\r
914 Calendar.MONTH, Calendar.OCTOBER,
\r
915 Calendar.DAY_OF_MONTH, 22,
\r
916 Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY,
\r
917 Calendar.DAY_OF_WEEK_IN_MONTH, 4,
\r
918 Calendar.DAY_OF_YEAR, 295
\r
921 // Verify that the fields are as expected (mostly zero) at the epoch start.
\r
922 // Note that we adjust for the default timezone to get most things to zero.
\r
923 public void TestEpochStartFields() {
\r
924 TimeZone z = TimeZone.getDefault();
\r
925 Calendar c = Calendar.getInstance();
\r
926 Date d = new Date(-z.getRawOffset());
\r
927 if (z.inDaylightTime(d)) {
\r
928 logln("Warning: Skipping test because " + d +
\r
933 c.setMinimalDaysInFirstWeek(1);
\r
934 for (int i=0; i<Calendar.ZONE_OFFSET; ++i) {
\r
935 if (c.get(i) != EPOCH_FIELDS[i])
\r
936 errln("Expected field " + i + " to have value " + EPOCH_FIELDS[i] +
\r
937 "; saw " + c.get(i) + " instead");
\r
939 if (c.get(Calendar.ZONE_OFFSET) != z.getRawOffset())
\r
940 errln("Expected field ZONE_OFFSET to have value " + z.getRawOffset() +
\r
941 "; saw " + c.get(Calendar.ZONE_OFFSET) + " instead");
\r
942 if (c.get(Calendar.DST_OFFSET) != 0)
\r
943 errln("Expected field DST_OFFSET to have value 0" +
\r
944 "; saw " + c.get(Calendar.DST_OFFSET) + " instead");
\r
947 // These are the fields at the epoch start
\r
948 static int EPOCH_FIELDS[] = { 1, 1970, 0, 1, 1, 1, 1, 5, 1, 0, 0, 0, 0, 0, 0, -28800000, 0 };
\r
950 // Verify that as you add days to the calendar (e.g., 24 day periods),
\r
951 // the day of the week shifts in the expected pattern.
\r
952 public void TestDOWProgression() {
\r
954 new GregorianCalendar(1972, Calendar.OCTOBER, 26);
\r
955 marchByDelta(cal, 24); // Last parameter must be != 0 modulo 7
\r
958 // Supply a delta which is not a multiple of 7.
\r
959 void marchByDelta(Calendar cal, int delta) {
\r
960 Calendar cur = (Calendar)cal.clone();
\r
961 int initialDOW = cur.get(Calendar.DAY_OF_WEEK);
\r
962 int DOW, newDOW = initialDOW;
\r
965 logln("DOW = " + DOW + " " + cur.getTime());
\r
967 cur.add(Calendar.DAY_OF_WEEK, delta);
\r
968 newDOW = cur.get(Calendar.DAY_OF_WEEK);
\r
969 int expectedDOW = 1 + (DOW + delta - 1) % 7;
\r
970 if (newDOW != expectedDOW) {
\r
971 errln("Day of week should be " + expectedDOW +
\r
972 " instead of " + newDOW + " on " + cur.getTime());
\r
976 while (newDOW != initialDOW);
\r
979 public void TestActualMinMax() {
\r
980 Calendar cal = new GregorianCalendar(1967, Calendar.MARCH, 10);
\r
981 cal.setFirstDayOfWeek(Calendar.SUNDAY);
\r
982 cal.setMinimalDaysInFirstWeek(3);
\r
984 if (cal.getActualMinimum(Calendar.DAY_OF_MONTH) != 1)
\r
985 errln("Actual minimum date for 3/10/1967 should have been 1; got " +
\r
986 cal.getActualMinimum(Calendar.DAY_OF_MONTH));
\r
987 if (cal.getActualMaximum(Calendar.DAY_OF_MONTH) != 31)
\r
988 errln("Actual maximum date for 3/10/1967 should have been 31; got " +
\r
989 cal.getActualMaximum(Calendar.DAY_OF_MONTH));
\r
991 cal.set(Calendar.MONTH, Calendar.FEBRUARY);
\r
992 if (cal.getActualMaximum(Calendar.DAY_OF_MONTH) != 28)
\r
993 errln("Actual maximum date for 2/10/1967 should have been 28; got " +
\r
994 cal.getActualMaximum(Calendar.DAY_OF_MONTH));
\r
995 if (cal.getActualMaximum(Calendar.DAY_OF_YEAR) != 365)
\r
996 errln("Number of days in 1967 should have been 365; got " +
\r
997 cal.getActualMaximum(Calendar.DAY_OF_YEAR));
\r
999 cal.set(Calendar.YEAR, 1968);
\r
1000 if (cal.getActualMaximum(Calendar.DAY_OF_MONTH) != 29)
\r
1001 errln("Actual maximum date for 2/10/1968 should have been 29; got " +
\r
1002 cal.getActualMaximum(Calendar.DAY_OF_MONTH));
\r
1003 if (cal.getActualMaximum(Calendar.DAY_OF_YEAR) != 366)
\r
1004 errln("Number of days in 1968 should have been 366; got " +
\r
1005 cal.getActualMaximum(Calendar.DAY_OF_YEAR));
\r
1006 // Using week settings of SUNDAY/3 (see above)
\r
1007 if (cal.getActualMaximum(Calendar.WEEK_OF_YEAR) != 52)
\r
1008 errln("Number of weeks in 1968 should have been 52; got " +
\r
1009 cal.getActualMaximum(Calendar.WEEK_OF_YEAR));
\r
1011 cal.set(Calendar.YEAR, 1976);
\r
1012 cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); // Added - Liu 11/6/00
\r
1013 // Using week settings of SUNDAY/3 (see above)
\r
1014 if (cal.getActualMaximum(Calendar.WEEK_OF_YEAR) != 53)
\r
1015 errln("Number of weeks in 1976 should have been 53; got " +
\r
1016 cal.getActualMaximum(Calendar.WEEK_OF_YEAR));
\r
1019 public void TestRoll() {
\r
1020 Calendar cal = new GregorianCalendar(1997, Calendar.JANUARY, 31);
\r
1022 int[] dayValues = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31 };
\r
1023 for (int i = 0; i < dayValues.length; i++) {
\r
1024 Calendar cal2 = (Calendar)cal.clone();
\r
1025 cal2.roll(Calendar.MONTH, i);
\r
1026 if (cal2.get(Calendar.DAY_OF_MONTH) != dayValues[i])
\r
1027 errln("Rolling the month in 1/31/1997 up by " + i + " should have yielded "
\r
1028 + ((i + 1) % 12) + "/" + dayValues[i] + "/1997, but actually yielded "
\r
1029 + ((i + 1) % 12) + "/" + cal2.get(Calendar.DAY_OF_MONTH) + "/1997.");
\r
1032 cal.set(1996, Calendar.FEBRUARY, 29);
\r
1034 //int[] monthValues = { 1, 2, 2, 2, 1, 2, 2, 2, 1, 2 };
\r
1035 //int[] dayValues2 = { 29, 1, 1, 1, 29, 1, 1, 1, 29, 1 };
\r
1037 // I've revised the expected values to make more sense -- rolling
\r
1038 // the year should pin the DAY_OF_MONTH. - Liu 11/6/00
\r
1039 int[] monthValues = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
\r
1040 int[] dayValues2 = { 29, 28, 28, 28, 29, 28, 28, 28, 29, 28 };
\r
1042 for (int i = 0; i < dayValues2.length; i++) {
\r
1043 Calendar cal2 = (Calendar)cal.clone();
\r
1044 cal2.roll(Calendar.YEAR, i);
\r
1045 if (cal2.get(Calendar.DAY_OF_MONTH) != dayValues2[i] || cal2.get(Calendar.MONTH)
\r
1046 != monthValues[i])
\r
1047 errln("Roll 2/29/1996 by " + i + " year: expected "
\r
1048 + (monthValues[i] + 1) + "/" + dayValues2[i] + "/"
\r
1049 + (1996 + i) + ", got "
\r
1050 + (cal2.get(Calendar.MONTH) + 1) + "/" +
\r
1051 cal2.get(Calendar.DAY_OF_MONTH) + "/" + cal2.get(Calendar.YEAR));
\r
1054 // Test rolling hour of day
\r
1055 cal.set(Calendar.HOUR_OF_DAY, 0);
\r
1056 cal.roll(Calendar.HOUR_OF_DAY, -2);
\r
1057 int f = cal.get(Calendar.HOUR_OF_DAY);
\r
1058 if (f != 22) errln("Rolling HOUR_OF_DAY=0 delta=-2 gave " + f + " Wanted 22");
\r
1059 cal.roll(Calendar.HOUR_OF_DAY, 5);
\r
1060 f = cal.get(Calendar.HOUR_OF_DAY);
\r
1061 if (f != 3) errln("Rolling HOUR_OF_DAY=22 delta=5 gave " + f + " Wanted 3");
\r
1062 cal.roll(Calendar.HOUR_OF_DAY, 21);
\r
1063 f = cal.get(Calendar.HOUR_OF_DAY);
\r
1064 if (f != 0) errln("Rolling HOUR_OF_DAY=3 delta=21 gave " + f + " Wanted 0");
\r
1066 // Test rolling hour
\r
1067 cal.set(Calendar.HOUR_OF_DAY, 0);
\r
1068 cal.roll(Calendar.HOUR, -2);
\r
1069 f = cal.get(Calendar.HOUR);
\r
1070 if (f != 10) errln("Rolling HOUR=0 delta=-2 gave " + f + " Wanted 10");
\r
1071 cal.roll(Calendar.HOUR, 5);
\r
1072 f = cal.get(Calendar.HOUR);
\r
1073 if (f != 3) errln("Rolling HOUR=10 delta=5 gave " + f + " Wanted 3");
\r
1074 cal.roll(Calendar.HOUR, 9);
\r
1075 f = cal.get(Calendar.HOUR);
\r
1076 if (f != 0) errln("Rolling HOUR=3 delta=9 gave " + f + " Wanted 0");
\r
1079 public void TestComputeJulianDay4406() {
\r
1080 // jb4406 is probably not a bug, this is to document the behavior
\r
1081 GregorianCalendar cal = new GregorianCalendar();
\r
1082 final int MILLIS_IN_DAY = 1000 * 60 * 60 * 24;
\r
1084 logln("julian day value jumps at changeover");
\r
1085 for (int day = 12; day < 18; ++day) {
\r
1086 cal.set(1582, 9, day);
\r
1087 logln("[" + day + "] " + (cal.getTimeInMillis()/MILLIS_IN_DAY));
\r
1090 logln("\njulian days not accurate before 1 March 0004");
\r
1091 for (int day = 1; day < 3; ++day) {
\r
1092 cal.set(1, 0, day);
\r
1093 logln("[" + day + "] " + (cal.getTimeInMillis()/MILLIS_IN_DAY));
\r
1096 DateFormat fmt = cal.getDateTimeFormat(DateFormat.LONG, 0, Locale.getDefault());
\r
1098 logln("\nswitchover in 1582");
\r
1099 cal.set(1582, 9, 4);
\r
1100 logln(fmt.format(cal));
\r
1101 cal.add(Calendar.DATE, 1);
\r
1102 logln(fmt.format(cal));
\r
1103 cal.set(Calendar.JULIAN_DAY, 1721426);
\r
1104 logln(fmt.format(cal));
\r
1106 logln("\nlate switchover - proleptic Julian");
\r
1107 cal.set(1582, 9, 4);
\r
1108 cal.setGregorianChange(new Date(Long.MAX_VALUE));
\r
1109 logln(fmt.format(cal));
\r
1110 cal.add(Calendar.DATE, 1);
\r
1111 logln(fmt.format(cal));
\r
1112 cal.set(Calendar.JULIAN_DAY, 1721426);
\r
1113 logln(fmt.format(cal));
\r
1115 logln("\nearly switchover - proleptic Gregorian");
\r
1116 cal.set(1582, 9, 4);
\r
1117 cal.setGregorianChange(new Date(Long.MIN_VALUE));
\r
1118 logln(fmt.format(cal));
\r
1119 cal.add(Calendar.DATE, 1);
\r
1120 logln(fmt.format(cal));
\r
1121 cal.set(Calendar.JULIAN_DAY, 1721426);
\r
1122 logln(fmt.format(cal));
\r