1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package tests.api.java.util; 19 20 import java.text.DateFormatSymbols; 21 import java.util.ArrayList; 22 import java.util.Calendar; 23 import java.util.Date; 24 import java.util.GregorianCalendar; 25 import java.util.List; 26 import java.util.Locale; 27 import java.util.Map; 28 import java.util.TimeZone; 29 30 import org.apache.harmony.testframework.serialization.SerializationTest; 31 32 public class CalendarTest extends junit.framework.TestCase { 33 34 Locale defaultLocale; 35 36 /** 37 * java.util.Calendar#set(int, int) 38 */ 39 public void test_setII() { 40 // Test for correct result defined by the last set field 41 Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("EST")); 42 43 cal.clear(); 44 cal.set(Calendar.YEAR, 2002); 45 assertTrue("Incorrect result 0: " + cal.getTime().getTime(), cal 46 .getTime().getTime() == 1009861200000L); 47 48 cal.clear(); 49 cal.set(Calendar.YEAR, 2002); 50 cal.set(Calendar.MONTH, Calendar.MARCH); 51 assertTrue("Incorrect result 0a: " + cal.getTime(), cal.getTime() 52 .getTime() == 1014958800000L); 53 54 cal.clear(); 55 cal.set(Calendar.YEAR, 2002); 56 cal.set(Calendar.DATE, 24); 57 assertTrue("Incorrect result 0b: " + cal.getTime(), cal.getTime() 58 .getTime() == 1011848400000L); 59 60 cal.set(Calendar.MONTH, Calendar.OCTOBER); 61 cal.set(Calendar.DATE, 31); 62 cal.set(Calendar.MONTH, Calendar.NOVEMBER); 63 cal.set(Calendar.DATE, 26); 64 assertTrue("Incorrect month: " + cal.get(Calendar.MONTH), cal 65 .get(Calendar.MONTH) == Calendar.NOVEMBER); 66 67 int dow = cal.get(Calendar.DAY_OF_WEEK); 68 cal.set(Calendar.DATE, 27); 69 assertTrue("Incorrect DAY_OF_WEEK: " + cal.get(Calendar.DAY_OF_WEEK) 70 + " expected: " + dow, cal.get(Calendar.DAY_OF_WEEK) != dow); 71 72 cal.clear(); 73 cal.set(Calendar.YEAR, 2002); 74 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 75 assertTrue("Incorrect result 0c1: " + cal.getTime().getTime(), cal 76 .getTime().getTime() == 1010379600000L); 77 78 cal.clear(); 79 cal.set(Calendar.YEAR, 2002); 80 cal.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); 81 assertTrue("Incorrect result 0c2: " + cal.getTime().getTime(), cal 82 .getTime().getTime() == 1009861200000L); 83 84 cal.clear(); 85 cal.set(Calendar.YEAR, 2002); 86 cal.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); 87 assertTrue("Incorrect result 0c3: " + cal.getTime(), cal.getTime() 88 .getTime() == 1010034000000L); 89 90 cal.clear(); 91 cal.set(Calendar.YEAR, 2002); 92 cal.set(Calendar.WEEK_OF_MONTH, 2); 93 assertTrue("Incorrect result 0d: " + cal.getTime(), cal.getTime() 94 .getTime() == 1010293200000L); 95 96 cal.clear(); 97 cal.set(Calendar.YEAR, 2002); 98 cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2); 99 assertTrue("Incorrect result 0e: " + cal.getTime(), cal.getTime() 100 .getTime() == 1010898000000L); 101 102 cal.clear(); 103 cal.set(Calendar.YEAR, 2002); 104 cal.set(Calendar.WEEK_OF_YEAR, 11); 105 assertTrue("Incorrect result 0f: " + cal.getTime(), cal.getTime() 106 .getTime() == 1015736400000L); 107 108 cal.clear(); 109 cal.set(Calendar.YEAR, 2002); 110 cal.set(Calendar.DATE, 24); 111 cal.set(Calendar.WEEK_OF_YEAR, 11); 112 assertTrue("Incorrect result 0g: " + cal.getTime(), cal.getTime() 113 .getTime() == 1011848400000L); 114 115 cal.clear(); 116 cal.set(Calendar.YEAR, 2002); 117 cal.get(Calendar.WEEK_OF_YEAR); // Force fields to compute 118 cal.set(Calendar.WEEK_OF_YEAR, 11); 119 assertTrue("Incorrect result 0h: " + cal.getTime(), cal.getTime() 120 .getTime() == 1015909200000L); 121 122 // WEEK_OF_YEAR has priority over MONTH/DATE 123 cal.clear(); 124 cal.set(Calendar.YEAR, 2002); 125 cal.set(Calendar.DAY_OF_YEAR, 170); 126 cal.set(Calendar.WEEK_OF_YEAR, 11); 127 cal.set(Calendar.MONTH, Calendar.JANUARY); 128 cal.set(Calendar.DATE, 5); 129 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 130 assertTrue("Incorrect result 1: " + cal.getTime(), cal.getTime() 131 .getTime() == 1015822800000L); 132 133 // WEEK_OF_YEAR has priority over MONTH/DATE 134 cal.clear(); 135 cal.set(Calendar.YEAR, 2002); 136 cal.set(Calendar.WEEK_OF_YEAR, 11); 137 cal.set(Calendar.MONTH, Calendar.JANUARY); 138 cal.set(Calendar.DATE, 5); 139 cal.set(Calendar.DAY_OF_YEAR, 170); 140 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 141 assertTrue("Incorrect result 1a: " + cal.getTime(), cal.getTime() 142 .getTime() == 1015822800000L); 143 144 // DAY_OF_WEEK has no effect when other fields not set 145 cal.clear(); 146 cal.set(Calendar.YEAR, 2002); 147 cal.set(Calendar.MONTH, Calendar.MARCH); 148 cal.set(Calendar.DATE, 11); 149 cal.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); 150 assertTrue("Incorrect result 1b: " + cal.getTime(), cal.getTime() 151 .getTime() == 1015822800000L); 152 // Regression for HARMONY-4384 153 // Set DAY_OF_WEEK without DATE 154 cal.clear(); 155 cal.set(Calendar.YEAR, 2002); 156 cal.set(Calendar.MONTH, Calendar.MARCH); 157 cal.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); 158 assertEquals("Incorrect result 1b: " + cal.getTime(), 1015304400000L, cal.getTime() 159 .getTime()); 160 161 162 // WEEK_OF_MONTH has priority 163 cal.clear(); 164 cal.set(Calendar.YEAR, 2002); 165 cal.set(Calendar.WEEK_OF_YEAR, 12); 166 cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); 167 cal.set(Calendar.WEEK_OF_MONTH, 3); 168 cal.set(Calendar.MONTH, Calendar.MARCH); 169 cal.set(Calendar.DATE, 5); 170 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 171 assertTrue("Incorrect result 2: " + cal.getTime(), cal.getTime() 172 .getTime() == 1015822800000L); 173 174 // DAY_OF_WEEK_IN_MONTH has priority over WEEK_OF_YEAR 175 cal.clear(); 176 cal.set(Calendar.YEAR, 2002); 177 cal.set(Calendar.WEEK_OF_YEAR, 12); 178 cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2); 179 cal.set(Calendar.MONTH, Calendar.MARCH); 180 cal.set(Calendar.DATE, 5); 181 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 182 assertTrue("Incorrect result 3: " + cal.getTime(), cal.getTime() 183 .getTime() == 1015822800000L); 184 185 // WEEK_OF_MONTH has priority, MONTH not set 186 cal.clear(); 187 cal.set(Calendar.YEAR, 2002); 188 cal.set(Calendar.WEEK_OF_YEAR, 12); 189 cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); 190 cal.set(Calendar.WEEK_OF_MONTH, 3); 191 cal.set(Calendar.DATE, 25); 192 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 193 assertTrue("Incorrect result 4: " + cal.getTime(), cal.getTime() 194 .getTime() == 1010984400000L); 195 196 // WEEK_OF_YEAR has priority when MONTH set last and DAY_OF_WEEK set 197 cal.clear(); 198 cal.set(Calendar.YEAR, 2002); 199 cal.set(Calendar.WEEK_OF_YEAR, 11); 200 cal.set(Calendar.DATE, 25); 201 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 202 cal.set(Calendar.MONTH, Calendar.JANUARY); 203 assertTrue("Incorrect result 5: " + cal.getTime(), cal.getTime() 204 .getTime() == 1015822800000L); 205 206 // Use MONTH/DATE when WEEK_OF_YEAR set but not DAY_OF_WEEK 207 cal.clear(); 208 cal.set(Calendar.YEAR, 2002); 209 cal.set(Calendar.WEEK_OF_YEAR, 12); 210 cal.set(Calendar.DATE, 11); 211 cal.set(Calendar.MONTH, Calendar.MARCH); 212 assertTrue("Incorrect result 5a: " + cal.getTime(), cal.getTime() 213 .getTime() == 1015822800000L); 214 215 // Use MONTH/DATE when DAY_OF_WEEK is not set 216 cal.clear(); 217 cal.set(Calendar.YEAR, 2002); 218 cal.set(Calendar.WEEK_OF_YEAR, 12); 219 cal.set(Calendar.DATE, 11); 220 cal.set(Calendar.WEEK_OF_MONTH, 1); 221 cal.set(Calendar.MONTH, Calendar.MARCH); 222 assertTrue("Incorrect result 5b: " + cal.getTime(), cal.getTime() 223 .getTime() == 1015822800000L); 224 225 // WEEK_OF_MONTH has priority 226 cal.clear(); 227 cal.set(Calendar.YEAR, 2002); 228 cal.set(Calendar.WEEK_OF_YEAR, 12); 229 cal.set(Calendar.DATE, 5); 230 cal.set(Calendar.WEEK_OF_MONTH, 3); 231 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 232 cal.set(Calendar.MONTH, Calendar.MARCH); 233 assertTrue("Incorrect result 5c: " + cal.getTime(), cal.getTime() 234 .getTime() == 1015822800000L); 235 236 // DATE has priority when set last 237 cal.clear(); 238 cal.set(Calendar.YEAR, 2002); 239 cal.set(Calendar.WEEK_OF_YEAR, 12); 240 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 241 cal.set(Calendar.MONTH, Calendar.MARCH); 242 cal.set(Calendar.DATE, 11); 243 assertTrue("Incorrect result 6: " + cal.getTime(), cal.getTime() 244 .getTime() == 1015822800000L); 245 246 // DATE has priority when set last, MONTH not set 247 cal.clear(); 248 cal.set(Calendar.YEAR, 2002); 249 cal.set(Calendar.WEEK_OF_YEAR, 12); 250 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 251 cal.set(Calendar.DATE, 14); 252 assertTrue("Incorrect result 7: " + cal.getTime(), cal.getTime() 253 .getTime() == 1010984400000L); 254 255 // DAY_OF_YEAR has priority when MONTH set last and DATE not set 256 cal.clear(); 257 cal.set(Calendar.YEAR, 2002); 258 cal.set(Calendar.DAY_OF_YEAR, 70); 259 cal.set(Calendar.MONTH, Calendar.JANUARY); 260 assertTrue("Incorrect result 8: " + cal.getTime(), cal.getTime() 261 .getTime() == 1015822800000L); 262 263 // DAY/MONTH has priority when DATE set after DAY_OF_YEAR 264 cal.clear(); 265 cal.set(Calendar.YEAR, 2002); 266 cal.set(Calendar.DAY_OF_YEAR, 170); 267 cal.set(Calendar.DATE, 11); 268 cal.set(Calendar.MONTH, Calendar.MARCH); 269 assertTrue("Incorrect result 8a: " + cal.getTime(), cal.getTime() 270 .getTime() == 1015822800000L); 271 272 // DAY_OF_YEAR has priority when set after DATE 273 cal.clear(); 274 cal.set(Calendar.YEAR, 2002); 275 cal.set(Calendar.DATE, 15); 276 cal.set(Calendar.DAY_OF_YEAR, 70); 277 cal.set(Calendar.MONTH, Calendar.JANUARY); 278 assertTrue("Incorrect result 8b: " + cal.getTime(), cal.getTime() 279 .getTime() == 1015822800000L); 280 281 // DATE has priority when set last 282 cal.clear(); 283 cal.set(Calendar.YEAR, 2002); 284 cal.set(Calendar.DAY_OF_YEAR, 70); 285 cal.set(Calendar.DATE, 14); 286 assertTrue("Incorrect result 9: " + cal.getTime(), cal.getTime() 287 .getTime() == 1010984400000L); 288 289 // DATE has priority when set last 290 cal.clear(); 291 cal.set(Calendar.YEAR, 2002); 292 cal.set(Calendar.WEEK_OF_YEAR, 15); 293 cal.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); 294 cal.set(Calendar.DATE, 14); 295 assertTrue("Incorrect result 9a: " + cal.getTime(), cal.getTime() 296 .getTime() == 1010984400000L); 297 298 cal.clear(); 299 cal.set(Calendar.YEAR, 2002); 300 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 301 cal.set(Calendar.DATE, 14); 302 cal.set(Calendar.WEEK_OF_YEAR, 11); 303 assertTrue("Incorrect result 9b: " + cal.getTime(), cal.getTime() 304 .getTime() == 1015822800000L); 305 306 cal.clear(); 307 cal.set(Calendar.YEAR, 2002); 308 cal.set(Calendar.DATE, 14); 309 cal.set(Calendar.WEEK_OF_YEAR, 11); 310 assertTrue("Incorrect result 9c: " + cal.getTime(), cal.getTime() 311 .getTime() == 1010984400000L); 312 313 cal.clear(); 314 cal.set(Calendar.YEAR, 2002); 315 cal.set(Calendar.WEEK_OF_MONTH, 1); 316 cal.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); 317 cal.set(Calendar.MONTH, Calendar.MARCH); 318 cal.set(Calendar.DATE, 11); 319 assertTrue("Incorrect result 9d: " + cal.getTime(), cal.getTime() 320 .getTime() == 1015822800000L); 321 322 // DAY_OF_YEAR has priority when DAY_OF_MONTH set last and other fields 323 // not set 324 cal.clear(); 325 cal.set(Calendar.YEAR, 2002); 326 cal.set(Calendar.DAY_OF_YEAR, 70); 327 cal.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); 328 assertTrue("Incorrect result 10: " + cal.getTime(), cal.getTime() 329 .getTime() == 1015822800000L); 330 331 // MONTH/DATE has priority when DAY_OF_WEEK_IN_MONTH set last but 332 // DAY_OF_WEEK not set 333 cal.clear(); 334 cal.set(Calendar.YEAR, 2002); 335 cal.set(Calendar.DATE, 11); 336 cal.set(Calendar.MONTH, Calendar.MARCH); 337 cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); 338 assertTrue("Incorrect result 11: " + cal.getTime(), cal.getTime() 339 .getTime() == 1015822800000L); 340 341 // MONTH/DATE has priority when WEEK_OF_YEAR set last but DAY_OF_WEEK 342 // not set 343 cal.clear(); 344 cal.set(Calendar.YEAR, 2002); 345 cal.set(Calendar.DATE, 11); 346 cal.set(Calendar.MONTH, Calendar.MARCH); 347 cal.set(Calendar.WEEK_OF_YEAR, 15); 348 assertTrue("Incorrect result 12: " + cal.getTime(), cal.getTime() 349 .getTime() == 1015822800000L); 350 351 // MONTH/DATE has priority when WEEK_OF_MONTH set last but DAY_OF_WEEK 352 // not set 353 cal.clear(); 354 cal.set(Calendar.YEAR, 2002); 355 cal.set(Calendar.DATE, 11); 356 cal.set(Calendar.MONTH, Calendar.MARCH); 357 cal.set(Calendar.WEEK_OF_MONTH, 1); 358 assertTrue("Incorrect result 13: " + cal.getTime(), cal.getTime() 359 .getTime() == 1015822800000L); 360 361 // Ensure last date field set is reset after computing 362 cal.clear(); 363 cal.set(Calendar.YEAR, 2002); 364 cal.set(Calendar.DAY_OF_YEAR, 111); 365 cal.get(Calendar.YEAR); 366 cal.set(Calendar.MONTH, Calendar.MARCH); 367 cal.set(Calendar.AM_PM, Calendar.AM); 368 assertTrue("Incorrect result 14: " + cal.getTime(), cal.getTime() 369 .getTime() == 1016686800000L); 370 371 int hour = cal.get(Calendar.HOUR); 372 cal.set(Calendar.HOUR, hour); 373 cal.set(Calendar.AM_PM, Calendar.PM); 374 assertEquals("AM_PM not changed", Calendar.PM, cal.get(Calendar.AM_PM)); 375 // setting AM_PM without HOUR should not have any affect 376 cal.set(Calendar.AM_PM, Calendar.AM); 377 assertEquals("AM_PM was changed 1", 378 Calendar.AM, cal.get(Calendar.AM_PM)); 379 int hourOfDay = cal.get(Calendar.HOUR_OF_DAY); 380 hour = cal.get(Calendar.HOUR); 381 cal.set(Calendar.AM_PM, Calendar.PM); 382 assertEquals("AM_PM was changed 2", 383 Calendar.PM, cal.get(Calendar.AM_PM)); 384 assertEquals(hour, cal.get(Calendar.HOUR)); 385 assertEquals(hourOfDay + 12, cal.get(Calendar.HOUR_OF_DAY)); 386 387 // regression test for Harmony-2122 388 cal = Calendar.getInstance(); 389 int oldValue = cal.get(Calendar.AM_PM); 390 int newValue = (oldValue == Calendar.AM) ? Calendar.PM : Calendar.AM; 391 cal.set(Calendar.AM_PM, newValue); 392 newValue = cal.get(Calendar.AM_PM); 393 assertTrue(newValue != oldValue); 394 } 395 396 /** 397 * java.util.Calendar#setTime(java.util.Date) 398 */ 399 public void test_setTimeLjava_util_Date() { 400 Calendar cal = Calendar.getInstance(); 401 // Use millisecond time for testing in Core 402 cal.setTime(new Date(884581200000L)); // (98, Calendar.JANUARY, 12) 403 assertEquals("incorrect millis", 884581200000L, cal.getTime().getTime()); 404 cal.setTimeZone(TimeZone.getTimeZone("EST")); 405 cal.setTime(new Date(943506000000L)); // (99, Calendar.NOVEMBER, 25) 406 assertTrue("incorrect fields", cal.get(Calendar.YEAR) == 1999 407 && cal.get(Calendar.MONTH) == Calendar.NOVEMBER 408 && cal.get(Calendar.DATE) == 25); 409 } 410 411 /** 412 * java.util.Calendar#compareTo(Calendar) 413 */ 414 public void test_compareToLjava_util_Calendar_null() { 415 Calendar cal = Calendar.getInstance(); 416 try { 417 cal.compareTo(null); 418 fail("should throw NullPointerException"); 419 } catch (NullPointerException e) { 420 // expected 421 } 422 } 423 424 /** 425 * java.util.Calendar#compareTo(Calendar) 426 */ 427 public void test_compareToLjava_util_Calendar() { 428 Calendar cal = Calendar.getInstance(); 429 cal.clear(); 430 cal.set(1997, 12, 13, 23, 57); 431 432 Calendar anotherCal = Calendar.getInstance(); 433 anotherCal.clear(); 434 anotherCal.set(1997, 12, 13, 23, 57); 435 assertEquals(0, cal.compareTo(anotherCal)); 436 437 anotherCal = Calendar.getInstance(); 438 anotherCal.clear(); 439 anotherCal.set(1997, 11, 13, 24, 57); 440 assertEquals(1, cal.compareTo(anotherCal)); 441 442 anotherCal = Calendar.getInstance(); 443 anotherCal.clear(); 444 anotherCal.set(1997, 12, 13, 23, 58); 445 assertEquals(-1, cal.compareTo(anotherCal)); 446 } 447 448 /** 449 * java.util.Calendar#clone() 450 */ 451 public void test_clone() { 452 // Regression for HARMONY-475 453 Calendar cal = Calendar.getInstance(); 454 cal.set(2006, 5, 6, 11, 35); 455 Calendar anotherCal = (Calendar) cal.clone(); 456 // should be deep clone 457 assertNotSame("getTimeZone", cal.getTimeZone(), anotherCal 458 .getTimeZone()); 459 } 460 461 /** 462 * java.util.Calendar#getTimeInMillis() 463 */ 464 public void test_getTimeInMillis() { 465 Calendar cal = Calendar.getInstance(); 466 467 int year = Integer.MIN_VALUE + 71; 468 cal.setTimeZone(TimeZone.getTimeZone("GMT")); 469 cal.set(Calendar.YEAR, year + 1900); 470 cal.set(Calendar.MONTH, Calendar.JANUARY); 471 cal.set(Calendar.DATE, 1); 472 cal.set(Calendar.HOUR_OF_DAY, 0); 473 cal.set(Calendar.MINUTE, 0); 474 cal.set(Calendar.SECOND, 0); 475 cal.set(Calendar.MILLISECOND, 0); 476 477 assertEquals(6017546357372606464L, cal.getTimeInMillis()); 478 } 479 480 private static final Locale[] locales = new Locale[] { Locale.getDefault(), 481 Locale.US, Locale.UK, Locale.TAIWAN, Locale.PRC, Locale.KOREA, 482 Locale.JAPAN, Locale.ITALIAN, Locale.GERMAN, Locale.ENGLISH, 483 Locale.CHINA, Locale.CANADA, Locale.FRANCE }; 484 485 /** 486 * java.util.Calendar#before(Object) 487 * java.util.Calendar#after(Object) 488 */ 489 public void test_before_after() { 490 Calendar early = Calendar.getInstance(); 491 Calendar late = Calendar.getInstance(); 492 // test by second 493 early.set(2008, 3, 20, 17, 28, 12); 494 late.set(2008, 3, 20, 17, 28, 22); 495 // test before() 496 assertTrue(early.before(late)); 497 assertFalse(early.before(early)); 498 assertFalse(late.before(early)); 499 // test after(); 500 assertTrue(late.after(early)); 501 assertFalse(late.after(late)); 502 assertFalse(early.after(late)); 503 504 // test by minute 505 early.set(2008, 3, 20, 17, 18, 12); 506 late.set(2008, 3, 20, 17, 28, 12); 507 // test before() 508 assertTrue(early.before(late)); 509 assertFalse(early.before(early)); 510 assertFalse(late.before(early)); 511 // test after(); 512 assertTrue(late.after(early)); 513 assertFalse(late.after(late)); 514 assertFalse(early.after(late)); 515 516 // test by hour 517 early.set(2008, 3, 20, 17, 28, 12); 518 late.set(2008, 3, 20, 27, 28, 12); 519 // test before() 520 assertTrue(early.before(late)); 521 assertFalse(early.before(early)); 522 assertFalse(late.before(early)); 523 // test after(); 524 assertTrue(late.after(early)); 525 assertFalse(late.after(late)); 526 assertFalse(early.after(late)); 527 528 // test by day 529 early.set(2008, 3, 10, 17, 28, 12); 530 late.set(2008, 3, 20, 17, 28, 12); 531 // test before() 532 assertTrue(early.before(late)); 533 assertFalse(early.before(early)); 534 assertFalse(late.before(early)); 535 // test after(); 536 assertTrue(late.after(early)); 537 assertFalse(late.after(late)); 538 assertFalse(early.after(late)); 539 540 // test by month 541 early.set(2008, 2, 20, 17, 28, 12); 542 late.set(2008, 3, 20, 17, 28, 12); 543 // test before() 544 assertTrue(early.before(late)); 545 assertFalse(early.before(early)); 546 assertFalse(late.before(early)); 547 // test after(); 548 assertTrue(late.after(early)); 549 assertFalse(late.after(late)); 550 assertFalse(early.after(late)); 551 552 // test by year 553 early.set(2007, 3, 20, 17, 28, 12); 554 late.set(2008, 3, 20, 17, 28, 12); 555 // test before() 556 assertTrue(early.before(late)); 557 assertFalse(early.before(early)); 558 assertFalse(late.before(early)); 559 // test after(); 560 assertTrue(late.after(early)); 561 assertFalse(late.after(late)); 562 assertFalse(early.after(late)); 563 } 564 565 /** 566 * java.util.Calendar#clear() 567 * java.util.Calendar#clear(int) 568 */ 569 public void test_clear() { 570 Calendar calendar = Calendar.getInstance(); 571 572 int count = 6; 573 int[] fields = new int[count]; 574 int[] defaults = new int[count]; 575 576 fields[0] = Calendar.YEAR; 577 fields[1] = Calendar.MONTH; 578 fields[2] = Calendar.DATE; 579 fields[3] = Calendar.HOUR_OF_DAY; 580 fields[4] = Calendar.MINUTE; 581 fields[5] = Calendar.SECOND; 582 583 defaults[0] = 1970; 584 defaults[1] = 0; 585 defaults[2] = 1; 586 defaults[3] = 0; 587 defaults[4] = 0; 588 defaults[5] = 0; 589 590 calendar.set(2008, 3, 20, 17, 28, 12); 591 592 // test clear(int) 593 for (int i = 0; i < fields.length; i++) { 594 int index = fields[i]; 595 calendar.clear(index); 596 if (5 == index) { 597 // RI also doesn't change the value of DATE 598 assertEquals("Field " + index + " Should equal to 20.", 20, 599 calendar.get(index)); 600 } else if (11 == index) { 601 // RI also doesn't change the value of HOUR 602 assertEquals("Field " + index + " Should equal to 17.", 17, 603 calendar.get(index)); 604 } else { 605 // Other have been set to default values 606 assertEquals("Field " + index + " Should equal to " 607 + defaults[i] + ".", defaults[i], calendar.get(index)); 608 } 609 } 610 611 // test clear() 612 calendar.set(2008, 3, 20, 17, 28, 12); 613 614 calendar.clear(); 615 616 for (int i = 0; i < fields.length; i++) { 617 int index = fields[i]; 618 assertEquals("Field " + index + " Should equal to " 619 + defaults[i] + ".", defaults[i], calendar.get(index)); 620 } 621 } 622 623 /** 624 * java.util.Calendar#isSet(int) 625 */ 626 public void test_isSet() { 627 Calendar calendar = Calendar.getInstance(); 628 calendar.clear(); 629 for (int i = 0; i < Calendar.FIELD_COUNT; i++) { 630 assertFalse(calendar.isSet(i)); 631 } 632 } 633 634 /** 635 * java.util.Calendar#getAvailableLocales() 636 */ 637 public void test_getAvailableLocales() { 638 Locale[] locales = Calendar.getAvailableLocales(); 639 boolean exist = false; 640 for (int i = 0; i < locales.length; i++) { 641 Locale l = locales[i]; 642 if (Locale.US.equals(l)) { 643 exist = true; 644 break; 645 } 646 } 647 assertTrue(exist); 648 } 649 650 /** 651 * java.util.Calendar#getInstance(Locale) 652 * java.util.Calendar#getInstance(TimeZone, Locale) 653 */ 654 public void test_getInstance() { 655 // test getInstance(Locale) 656 Calendar us_calendar = Calendar.getInstance(Locale.US); 657 Calendar ch_calendar = Calendar.getInstance(Locale.CHINESE); 658 assertEquals(Calendar.SUNDAY, us_calendar 659 .getFirstDayOfWeek()); 660 assertEquals(Calendar.MONDAY, ch_calendar 661 .getFirstDayOfWeek()); 662 663 // test getInstance(Locale, TimeZone) 664 Calendar gmt_calendar = Calendar.getInstance(TimeZone 665 .getTimeZone("GMT"), Locale.US); 666 assertEquals(TimeZone.getTimeZone("GMT"), 667 gmt_calendar.getTimeZone()); 668 Calendar est_calendar = Calendar.getInstance(TimeZone 669 .getTimeZone("EST"), Locale.US); 670 assertEquals(TimeZone.getTimeZone("EST") 671 .getID(), est_calendar.getTimeZone().getID()); 672 } 673 674 /** 675 * java.util.Calendar#internalGet(int) 676 */ 677 public void test_internalGet() { 678 MockGregorianCalendar c = new MockGregorianCalendar(); 679 c.clear(Calendar.YEAR); 680 assertEquals(0, c.internal_get(Calendar.YEAR)); 681 } 682 683 /** 684 * java.util.Calendar#hashCode() 685 */ 686 public void test_hashcode() { 687 Calendar calendar = Calendar.getInstance(Locale.JAPAN); 688 assertTrue(calendar.hashCode() == calendar.hashCode()); 689 } 690 691 /** 692 * java.util.Calendar#roll(int, int) 693 */ 694 public void test_roll() { 695 Calendar calendar = Calendar.getInstance(); 696 calendar.set(2008, 3, 20, 17, 28, 12); 697 698 // roll up 699 calendar.roll(Calendar.DATE, 5); 700 assertEquals(25, calendar.get(Calendar.DATE)); 701 702 // roll down 703 calendar.roll(Calendar.DATE, -5); 704 assertEquals(20, calendar.get(Calendar.DATE)); 705 706 // roll 0 707 calendar.roll(Calendar.DATE, 0); 708 assertEquals(20, calendar.get(Calendar.DATE)); 709 710 // roll overweight 711 calendar.set(2008, 1, 31, 17, 28, 12); 712 calendar.roll(Calendar.MONTH, 1); 713 assertEquals(2, calendar.get(Calendar.DATE)); 714 715 } 716 717 /** 718 * java.util.Calendar#toString() 719 */ 720 public void test_toString() { 721 Calendar calendar = Calendar.getInstance(); 722 //Should be the current time with no interrogation in the string. 723 assertTrue(calendar.toString() instanceof String); 724 assertEquals(-1, calendar.toString().indexOf("?")); 725 calendar.clear(); 726 assertTrue(calendar.toString() instanceof String); 727 assertTrue(0 <= calendar.toString().indexOf("?")); 728 } 729 730 /** 731 * serialization/deserialization. 732 */ 733 public void testSerializationSelf() throws Exception { 734 Calendar calendar = Calendar.getInstance(); 735 calendar.set(2008, 3, 20, 17, 28, 12); 736 737 SerializationTest.verifySelf(calendar); 738 } 739 740 741 private class MockGregorianCalendar extends GregorianCalendar { 742 public int internal_get(int field) { 743 return super.internalGet(field); 744 } 745 } 746 747 private class MockCalendar extends Calendar { 748 749 public MockCalendar() { 750 super(); 751 } 752 753 @Override 754 public void add(int field, int value) { 755 } 756 757 @Override 758 protected void computeFields() { 759 } 760 761 @Override 762 protected void computeTime() { 763 } 764 765 @Override 766 public int getGreatestMinimum(int field) { 767 return 0; 768 } 769 770 @Override 771 public int getLeastMaximum(int field) { 772 return 0; 773 } 774 775 @Override 776 public int getMaximum(int field) { 777 return 0; 778 } 779 780 @Override 781 public int getMinimum(int field) { 782 return 0; 783 } 784 785 @Override 786 public void roll(int field, boolean increment) { 787 } 788 } 789 790 /** 791 * {@link java.util.Calendar#getDisplayName(int, int, Locale)} 792 * @since 1.6 793 */ 794 public void test_getDisplayNameIILjava_util_Locale() { 795 Calendar cal = Calendar.getInstance(); 796 for (int field = 0; field < Calendar.FIELD_COUNT; field++) { 797 for (Locale locale : locales) { 798 DateFormatSymbols symbols = new DateFormatSymbols(locale); 799 String value = null; 800 switch (field) { 801 case Calendar.AM_PM: 802 cal.set(Calendar.AM_PM, Calendar.AM); 803 value = symbols.getAmPmStrings()[0]; 804 assertEquals(cal.getDisplayName(field, Calendar.SHORT, 805 locale), value); 806 assertEquals(cal.getDisplayName(field, Calendar.LONG, 807 locale), value); 808 cal.set(Calendar.AM_PM, Calendar.PM); 809 value = symbols.getAmPmStrings()[1]; 810 assertEquals(cal.getDisplayName(field, Calendar.SHORT, 811 locale), value); 812 assertEquals(cal.getDisplayName(field, Calendar.LONG, 813 locale), value); 814 break; 815 case Calendar.ERA: 816 cal.set(Calendar.ERA, GregorianCalendar.BC); 817 value = symbols.getEras()[0]; 818 assertEquals(cal.getDisplayName(field, Calendar.SHORT, 819 locale), value); 820 assertEquals(cal.getDisplayName(field, Calendar.LONG, 821 locale), value); 822 cal.set(Calendar.ERA, GregorianCalendar.AD); 823 value = symbols.getEras()[1]; 824 assertEquals(cal.getDisplayName(field, Calendar.SHORT, 825 locale), value); 826 assertEquals(cal.getDisplayName(field, Calendar.LONG, 827 locale), value); 828 break; 829 case Calendar.MONTH: 830 cal.set(Calendar.DAY_OF_MONTH, 1); 831 for (int month = 0; month <= 11; month++) { 832 cal.set(Calendar.MONTH, month); 833 value = symbols.getShortMonths()[month]; 834 assertEquals(cal.getDisplayName(field, Calendar.SHORT, 835 locale), value); 836 value = symbols.getMonths()[month]; 837 assertEquals(cal.getDisplayName(field, Calendar.LONG, 838 locale), value); 839 } 840 break; 841 case Calendar.DAY_OF_WEEK: 842 for (int day = 1; day <= 7; day++) { 843 cal.set(Calendar.DAY_OF_WEEK, day); 844 value = symbols.getShortWeekdays()[day]; 845 assertEquals(cal.getDisplayName(field, Calendar.SHORT, 846 locale), value); 847 value = symbols.getWeekdays()[day]; 848 assertEquals(cal.getDisplayName(field, Calendar.LONG, 849 locale), value); 850 } 851 break; 852 default: 853 assertNull(cal 854 .getDisplayName(field, Calendar.SHORT, locale)); 855 assertNull(cal.getDisplayName(field, Calendar.LONG, locale)); 856 } 857 } 858 } 859 860 cal.setLenient(true); 861 862 try { 863 cal.getDisplayName(-1, Calendar.SHORT, Locale.US); 864 fail("Should throw IllegalArgumentException"); 865 } catch (IllegalArgumentException e) { 866 // expected 867 } 868 try { 869 cal.getDisplayName(Calendar.FIELD_COUNT, Calendar.LONG, Locale.US); 870 fail("Should throw IllegalArgumentException"); 871 } catch (IllegalArgumentException e) { 872 // expected 873 } 874 try { 875 cal.getDisplayName(Calendar.MONTH, -1, Locale.US); 876 fail("Should throw IllegalArgumentException"); 877 } catch (IllegalArgumentException e) { 878 // expected 879 } 880 try { 881 cal.getDisplayName(Calendar.MONTH, 3, Locale.US); 882 fail("Should throw IllegalArgumentException"); 883 } catch (IllegalArgumentException e) { 884 // expected 885 } 886 try { 887 cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, null); 888 fail("Should throw NullPointerException"); 889 } catch (NullPointerException e) { 890 // expected 891 } 892 try { 893 cal.getDisplayName(-1, Calendar.SHORT, null); 894 fail("Should throw IllegalArgumentException"); 895 } catch (IllegalArgumentException e) { 896 // expected 897 } 898 try { 899 cal.getDisplayName(Calendar.MONTH, -1, null); 900 fail("Should throw IllegalArgumentException"); 901 } catch (IllegalArgumentException e) { 902 // expected 903 } 904 // in lenient mode, following cases pass 905 cal.set(Calendar.SECOND, 999); 906 cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.US); 907 // test for ALL_STYLES, it is equal to use SHORT 908 for (int field = 0; field < Calendar.FIELD_COUNT; field++) { 909 for (Locale locale : locales) { 910 String result = cal.getDisplayName(field, Calendar.ALL_STYLES, 911 locale); 912 if (field == Calendar.AM_PM || field == Calendar.ERA 913 || field == Calendar.MONTH 914 || field == Calendar.DAY_OF_WEEK) { 915 assertEquals(result, cal.getDisplayName(field, 916 Calendar.SHORT, locale)); 917 } else { 918 assertNull(result); 919 } 920 } 921 } 922 923 // invalid value for an un-related field when the calendar is not 924 // lenient 925 cal.setLenient(false); 926 assertNotNull(cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, 927 Locale.US)); 928 cal.set(Calendar.SECOND, 999); 929 try { 930 cal.getDisplayName(Calendar.MONTH, Calendar.SHORT, Locale.US); 931 fail("Should throw IllegalArgumentException"); 932 } catch (IllegalArgumentException e) { 933 // expected 934 } 935 try { 936 cal.getDisplayName(Calendar.MONTH, Calendar.ALL_STYLES, Locale.US); 937 fail("Should throw IllegalArgumentException"); 938 } catch (IllegalArgumentException e) { 939 // expected 940 } 941 } 942 943 /** 944 * {@link java.util.Calendar#getDisplayNames(int, int, Locale)} 945 * @since 1.6 946 */ 947 public void test_getDisplayNamesIILjava_util_Locale() { 948 assertEquals(0, Calendar.ALL_STYLES); 949 assertEquals(1, Calendar.SHORT); 950 assertEquals(2, Calendar.LONG); 951 952 Calendar cal = Calendar.getInstance(Locale.US); 953 954 for (int field = 0; field < Calendar.FIELD_COUNT; field++) { 955 for (Locale locale : locales) { 956 Map<String, Integer> shortResult = cal.getDisplayNames(field, 957 Calendar.SHORT, locale); 958 Map<String, Integer> longResult = cal.getDisplayNames(field, 959 Calendar.LONG, locale); 960 Map<String, Integer> allResult = cal.getDisplayNames(field, 961 Calendar.ALL_STYLES, locale); 962 DateFormatSymbols symbols = new DateFormatSymbols(locale); 963 String[] values = null; 964 switch (field) { 965 case Calendar.AM_PM: 966 case Calendar.ERA: 967 values = (field == Calendar.AM_PM) ? symbols 968 .getAmPmStrings() : symbols.getEras(); 969 assertDisplayNameMap(values, shortResult, 0); 970 assertDisplayNameMap(values, longResult, 0); 971 assertDisplayNameMap(values, allResult, 0); 972 break; 973 case Calendar.MONTH: 974 values = symbols.getShortMonths(); 975 assertDisplayNameMap(values, shortResult, 0); 976 values = symbols.getMonths(); 977 assertDisplayNameMap(values, longResult, 0); 978 assertTrue(allResult.size() >= shortResult.size()); 979 assertTrue(allResult.size() >= longResult.size()); 980 assertTrue(allResult.size() <= shortResult.size() 981 + longResult.size()); 982 break; 983 case Calendar.DAY_OF_WEEK: 984 values = symbols.getShortWeekdays(); 985 assertDisplayNameMap(values, shortResult, 1); 986 values = symbols.getWeekdays(); 987 assertDisplayNameMap(values, longResult, 1); 988 assertTrue(allResult.size() >= shortResult.size()); 989 assertTrue(allResult.size() >= longResult.size()); 990 assertTrue(allResult.size() <= shortResult.size() 991 + longResult.size()); 992 break; 993 default: 994 assertNull(shortResult); 995 assertNull(longResult); 996 assertNull(allResult); 997 } 998 } 999 } 1000 1001 cal.setLenient(true); 1002 1003 try { 1004 cal.getDisplayNames(-1, Calendar.SHORT, Locale.US); 1005 fail("Should throw IllegalArgumentException"); 1006 } catch (IllegalArgumentException e) { 1007 // expected 1008 } 1009 try { 1010 cal.getDisplayNames(Calendar.FIELD_COUNT, Calendar.LONG, Locale.US); 1011 fail("Should throw IllegalArgumentException"); 1012 } catch (IllegalArgumentException e) { 1013 // expected 1014 } 1015 try { 1016 cal.getDisplayNames(Calendar.MONTH, -1, Locale.US); 1017 fail("Should throw IllegalArgumentException"); 1018 } catch (IllegalArgumentException e) { 1019 // expected 1020 } 1021 try { 1022 cal.getDisplayNames(Calendar.MONTH, 3, Locale.US); 1023 fail("Should throw IllegalArgumentException"); 1024 } catch (IllegalArgumentException e) { 1025 // expected 1026 } 1027 try { 1028 cal.getDisplayNames(Calendar.MONTH, Calendar.SHORT, null); 1029 fail("Should throw NullPointerException"); 1030 } catch (NullPointerException e) { 1031 // expected 1032 } 1033 try { 1034 cal.getDisplayNames(-1, Calendar.SHORT, null); 1035 fail("Should throw IllegalArgumentException"); 1036 } catch (IllegalArgumentException e) { 1037 // expected 1038 } 1039 try { 1040 cal.getDisplayNames(Calendar.MONTH, -1, null); 1041 fail("Should throw IllegalArgumentException"); 1042 } catch (IllegalArgumentException e) { 1043 // expected 1044 } 1045 cal.set(Calendar.SECOND, 999); 1046 cal.getDisplayNames(Calendar.MONTH, Calendar.SHORT, Locale.US); 1047 1048 // RI fails here 1049 // invalid value for an un-related field when the calendar is not 1050 // lenient 1051 cal.setLenient(false); 1052 cal.set(Calendar.SECOND, 999); 1053 try { 1054 cal.getDisplayNames(Calendar.MONTH, Calendar.SHORT, Locale.US); 1055 fail("Should throw IllegalArgumentException"); 1056 } catch (IllegalArgumentException e) { 1057 // expected 1058 } 1059 } 1060 1061 private void assertDisplayNameMap(String[] values, 1062 Map<String, Integer> result, int shift) { 1063 List<String> trimValue = new ArrayList<String>(); 1064 for (String value : values) { 1065 if (value.trim().length() > 0) { 1066 trimValue.add(value); 1067 } 1068 } 1069 assertEquals(trimValue.size(), result.size()); 1070 for (int i = 0; i < trimValue.size(); i++) { 1071 assertEquals(i + shift, result.get(trimValue.get(i)).intValue()); 1072 } 1073 } 1074 1075 /** 1076 * {@link java.util.Calendar#getActualMaximum(int)} 1077 */ 1078 public void test_getActualMaximum_I() { 1079 Calendar c = new MockCalendar(); 1080 assertEquals("should be equal to 0", 0, c.getActualMaximum(0)); 1081 } 1082 1083 /** 1084 * {@link java.util.Calendar#getActualMinimum(int)} 1085 */ 1086 public void test_getActualMinimum_I() { 1087 Calendar c = new MockCalendar(); 1088 assertEquals("should be equal to 0", 0, c.getActualMinimum(0)); 1089 } 1090 1091 protected void setUp() { 1092 defaultLocale = Locale.getDefault(); 1093 Locale.setDefault(Locale.US); 1094 } 1095 1096 protected void tearDown() { 1097 Locale.setDefault(defaultLocale); 1098 } 1099 } 1100