1/* 2 ******************************************************************************* 3 * Copyright (C) 1996-2013, International Business Machines Corporation and * 4 * others. All Rights Reserved. * 5 ******************************************************************************* 6 */ 7 8package com.ibm.icu.dev.test.calendar; 9import java.util.Date; 10import java.util.Locale; 11import java.util.MissingResourceException; 12 13import com.ibm.icu.impl.LocaleUtility; 14import com.ibm.icu.text.DateFormat; 15import com.ibm.icu.util.Calendar; 16import com.ibm.icu.util.HebrewCalendar; 17import com.ibm.icu.util.TimeZone; 18import com.ibm.icu.util.ULocale; 19 20/** 21 * Tests for the <code>HebrewCalendar</code> class. 22 */ 23public class HebrewTest extends CalendarTest { 24 public static void main(String args[]) throws Exception { 25 new HebrewTest().run(args); 26 } 27 28 // Constants to save typing. 29 public static final int TISHRI = HebrewCalendar.TISHRI; 30 public static final int HESHVAN = HebrewCalendar.HESHVAN; 31 public static final int KISLEV = HebrewCalendar.KISLEV; 32 public static final int TEVET = HebrewCalendar.TEVET; 33 public static final int SHEVAT = HebrewCalendar.SHEVAT; 34 public static final int ADAR_1 = HebrewCalendar.ADAR_1; 35 public static final int ADAR = HebrewCalendar.ADAR; 36 public static final int NISAN = HebrewCalendar.NISAN; 37 public static final int IYAR = HebrewCalendar.IYAR; 38 public static final int SIVAN = HebrewCalendar.SIVAN; 39 public static final int TAMUZ = HebrewCalendar.TAMUZ; 40 public static final int AV = HebrewCalendar.AV; 41 public static final int ELUL = HebrewCalendar.ELUL; 42 43 /** 44 * Test the behavior of HebrewCalendar.roll 45 * The only real nastiness with roll is the MONTH field, since a year can 46 * have a variable number of months. 47 */ 48 public void TestRoll() { 49 int[][] tests = new int[][] { 50 // input roll by output 51 // year month day field amount year month day 52 53 { 5759, HESHVAN, 2, MONTH, 1, 5759, KISLEV, 2 }, // non-leap years 54 { 5759, SHEVAT, 2, MONTH, 1, 5759, ADAR, 2 }, 55 { 5759, SHEVAT, 2, MONTH, 2, 5759, NISAN, 2 }, 56 { 5759, SHEVAT, 2, MONTH, 12, 5759, SHEVAT, 2 }, 57 { 5759, AV, 1, MONTH, 12, 5759, AV, 1 }, // Alan 58 59 { 5757, HESHVAN, 2, MONTH, 1, 5757, KISLEV, 2 }, // leap years 60 { 5757, SHEVAT, 2, MONTH, 1, 5757, ADAR_1, 2 }, 61 { 5757, SHEVAT, 2, MONTH, 2, 5757, ADAR, 2 }, 62 { 5757, SHEVAT, 2, MONTH, 3, 5757, NISAN, 2 }, 63 { 5757, SHEVAT, 2, MONTH, 12, 5757, TEVET, 2 }, 64 { 5757, SHEVAT, 2, MONTH, 13, 5757, SHEVAT, 2 }, 65 { 5757, AV, 1, MONTH, 12, 5757, TAMUZ, 1 }, // Alan 66 67 { 5757, KISLEV, 1, DATE, 30, 5757, KISLEV, 2 }, // 29-day month 68 { 5758, KISLEV, 1, DATE, 31, 5758, KISLEV, 2 }, // 30-day month 69 70 // Try some other fields too 71 { 5757, TISHRI, 1, YEAR, 1, 5758, TISHRI, 1 }, 72 73 74 // Try some rolls that require other fields to be adjusted 75 { 5757, TISHRI, 30, MONTH, 1, 5757, HESHVAN, 29 }, 76 { 5758, KISLEV, 30, YEAR, -1, 5757, KISLEV, 29 }, 77 }; 78// try{ 79 HebrewCalendar cal = new HebrewCalendar(UTC, Locale.getDefault()); 80 81 doRollAdd(ROLL, cal, tests); 82 // }catch(MissingResourceException ex){ 83// warnln("Got Exception: "+ ex.getMessage()); 84 // } 85 } 86 87 /** 88 * Test the behavior of HebrewCalendar.roll 89 * The only real nastiness with roll is the MONTH field, since a year can 90 * have a variable number of months. 91 */ 92 public void TestAdd() { 93 int[][] tests = new int[][] { 94 // input add by output 95 // year month day field amount year month day 96 { 5759, HESHVAN, 2, MONTH, 1, 5759, KISLEV, 2 }, // non-leap years 97 { 5759, SHEVAT, 2, MONTH, 1, 5759, ADAR, 2 }, 98 { 5759, SHEVAT, 2, MONTH, 2, 5759, NISAN, 2 }, 99 { 5759, SHEVAT, 2, MONTH, 12, 5760, SHEVAT, 2 }, 100 101 { 5757, HESHVAN, 2, MONTH, 1, 5757, KISLEV, 2 }, // leap years 102 { 5757, SHEVAT, 2, MONTH, 1, 5757, ADAR_1, 2 }, 103 { 5757, SHEVAT, 2, MONTH, 2, 5757, ADAR, 2 }, 104 { 5757, SHEVAT, 2, MONTH, 3, 5757, NISAN, 2 }, 105 { 5757, SHEVAT, 2, MONTH, 12, 5758, TEVET, 2 }, 106 { 5757, SHEVAT, 2, MONTH, 13, 5758, SHEVAT, 2 }, 107 108 { 5762, AV, 1, MONTH, 1, 5762, ELUL, 1 }, // JB#2327 109 { 5762, AV, 30, DATE, 1, 5762, ELUL, 1 }, // JB#2327 110 { 5762, ELUL, 1, DATE, -1, 5762, AV, 30 }, // JB#2327 111 { 5762, ELUL, 1, MONTH, -1, 5762, AV, 1 }, // JB#2327 112 113 { 5757, KISLEV, 1, DATE, 30, 5757, TEVET, 2 }, // 29-day month 114 { 5758, KISLEV, 1, DATE, 31, 5758, TEVET, 2 }, // 30-day month 115 }; 116 try{ 117 HebrewCalendar cal = new HebrewCalendar(UTC, Locale.getDefault()); 118 119 doRollAdd(ADD, cal, tests); 120 }catch( MissingResourceException ex){ 121 warnln("Could not load the locale data"); 122 } 123 } 124 125 /** 126 * A huge list of test cases to make sure that computeTime and computeFields 127 * work properly for a wide range of data. 128 */ 129 public void TestCases() { 130 try{ 131 final TestCase[] testCases = { 132 // 133 // Most of these test cases were taken from the back of 134 // "Calendrical Calculations", with some extras added to help 135 // debug a few of the problems that cropped up in development. 136 // 137 // The months in this table are 1-based rather than 0-based, 138 // because it's easier to edit that way. 139 // 140 // Julian Day Era Year Month Day WkDay Hour Min Sec 141 new TestCase(1507231.5, 0, 3174, 12, 10, SUN, 0, 0, 0), 142 new TestCase(1660037.5, 0, 3593, 3, 25, WED, 0, 0, 0), 143 new TestCase(1746893.5, 0, 3831, 1, 3, WED, 0, 0, 0), 144 new TestCase(1770641.5, 0, 3896, 1, 9, SUN, 0, 0, 0), 145 new TestCase(1892731.5, 0, 4230, 4, 18, WED, 0, 0, 0), 146 new TestCase(1931579.5, 0, 4336, 10, 4, MON, 0, 0, 0), 147 new TestCase(1974851.5, 0, 4455, 2, 13, SAT, 0, 0, 0), 148 new TestCase(2091164.5, 0, 4773, 9, 6, SUN, 0, 0, 0), 149 new TestCase(2121509.5, 0, 4856, 9, 23, SUN, 0, 0, 0), 150 new TestCase(2155779.5, 0, 4950, 8, 7, FRI, 0, 0, 0), 151 new TestCase(2174029.5, 0, 5000, 7, 8, SAT, 0, 0, 0), 152 new TestCase(2191584.5, 0, 5048, 8, 21, FRI, 0, 0, 0), 153 new TestCase(2195261.5, 0, 5058, 9, 7, SUN, 0, 0, 0), 154 new TestCase(2229274.5, 0, 5151, 11, 1, SUN, 0, 0, 0), 155 new TestCase(2245580.5, 0, 5196, 5, 7, WED, 0, 0, 0), 156 new TestCase(2266100.5, 0, 5252, 8, 3, SAT, 0, 0, 0), 157 new TestCase(2288542.5, 0, 5314, 1, 1, SAT, 0, 0, 0), 158 new TestCase(2290901.5, 0, 5320, 6, 27, SAT, 0, 0, 0), 159 new TestCase(2323140.5, 0, 5408, 10, 20, WED, 0, 0, 0), 160 new TestCase(2334551.5, 0, 5440, 1, 1, THU, 0, 0, 0), 161 new TestCase(2334581.5, 0, 5440, 2, 1, SAT, 0, 0, 0), 162 new TestCase(2334610.5, 0, 5440, 3, 1, SUN, 0, 0, 0), 163 new TestCase(2334639.5, 0, 5440, 4, 1, MON, 0, 0, 0), 164 new TestCase(2334668.5, 0, 5440, 5, 1, TUE, 0, 0, 0), 165 new TestCase(2334698.5, 0, 5440, 6, 1, THU, 0, 0, 0), 166 new TestCase(2334728.5, 0, 5440, 7, 1, SAT, 0, 0, 0), 167 new TestCase(2334757.5, 0, 5440, 8, 1, SUN, 0, 0, 0), 168 new TestCase(2334787.5, 0, 5440, 9, 1, TUE, 0, 0, 0), 169 new TestCase(2334816.5, 0, 5440, 10, 1, WED, 0, 0, 0), 170 new TestCase(2334846.5, 0, 5440, 11, 1, FRI, 0, 0, 0), 171 new TestCase(2334848.5, 0, 5440, 11, 3, SUN, 0, 0, 0), 172 new TestCase(2334934.5, 0, 5441, 1, 1, TUE, 0, 0, 0), 173 new TestCase(2348020.5, 0, 5476, 12, 5, FRI, 0, 0, 0), 174 new TestCase(2366978.5, 0, 5528, 11, 4, SUN, 0, 0, 0), 175 new TestCase(2385648.5, 0, 5579, 12, 11, MON, 0, 0, 0), 176 new TestCase(2392825.5, 0, 5599, 8, 12, WED, 0, 0, 0), 177 new TestCase(2416223.5, 0, 5663, 8, 22, SUN, 0, 0, 0), 178 new TestCase(2425848.5, 0, 5689, 12, 19, SUN, 0, 0, 0), 179 new TestCase(2430266.5, 0, 5702, 1, 8, MON, 0, 0, 0), 180 new TestCase(2430833.5, 0, 5703, 8, 14, MON, 0, 0, 0), 181 new TestCase(2431004.5, 0, 5704, 1, 8, THU, 0, 0, 0), 182 new TestCase(2448698.5, 0, 5752, 7, 12, TUE, 0, 0, 0), 183 new TestCase(2450138.5, 0, 5756, 7, 5, SUN, 0, 0, 0), 184 new TestCase(2465737.5, 0, 5799, 2, 12, WED, 0, 0, 0), 185 new TestCase(2486076.5, 0, 5854, 12, 5, SUN, 0, 0, 0), 186 187 // Additional test cases for bugs found during development 188 // G.YY/MM/DD Era Year Month Day WkDay Hour Min Sec 189 new TestCase(1013, 9, 8, 0, 4774, 1, 1, TUE, 0, 0, 0), 190 new TestCase(1239, 9, 1, 0, 5000, 1, 1, THU, 0, 0, 0), 191 new TestCase(1240, 9,18, 0, 5001, 1, 1, TUE, 0, 0, 0), 192 193 // Test cases taken from a table of 14 "year types" in the Help file 194 // of the application "Hebrew Calendar" 195 new TestCase(2456187.5, 0, 5773, 1, 1, MON, 0, 0, 0), 196 new TestCase(2459111.5, 0, 5781, 1, 1, SAT, 0, 0, 0), 197 new TestCase(2453647.5, 0, 5766, 1, 1, TUE, 0, 0, 0), 198 new TestCase(2462035.5, 0, 5789, 1, 1, THU, 0, 0, 0), 199 new TestCase(2458756.5, 0, 5780, 1, 1, MON, 0, 0, 0), 200 new TestCase(2460586.5, 0, 5785, 1, 1, THU, 0, 0, 0), 201 new TestCase(2463864.5, 0, 5794, 1, 1, SAT, 0, 0, 0), 202 new TestCase(2463481.5, 0, 5793, 1, 1, MON, 0, 0, 0), 203 new TestCase(2470421.5, 0, 5812, 1, 1, THU, 0, 0, 0), 204 new TestCase(2460203.5, 0, 5784, 1, 1, SAT, 0, 0, 0), 205 new TestCase(2459464.5, 0, 5782, 1, 1, TUE, 0, 0, 0), 206 new TestCase(2467142.5, 0, 5803, 1, 1, MON, 0, 0, 0), 207 new TestCase(2455448.5, 0, 5771, 1, 1, THU, 0, 0, 0), 208 209 // Test cases for JB#2327 210 // http://www.fourmilab.com/documents/calendar/ 211 // http://www.calendarhome.com/converter/ 212// 2452465.5, 2002, JULY, 10, 5762, AV, 1, 213// 2452494.5, 2002, AUGUST, 8, 5762, AV, 30, 214// 2452495.5, 2002, AUGUST, 9, 5762, ELUL, 1, 215// 2452523.5, 2002, SEPTEMBER, 6, 5762, ELUL, 29, 216// 2452524.5, 2002, SEPTEMBER, 7, 5763, TISHRI, 1, 217 // Julian Day Era Year Month Day WkDay Hour Min Sec 218 new TestCase(2452465.5, 0, 5762, AV+1, 1, WED, 0, 0, 0), 219 new TestCase(2452494.5, 0, 5762, AV+1, 30, THU, 0, 0, 0), 220 new TestCase(2452495.5, 0, 5762, ELUL+1, 1, FRI, 0, 0, 0), 221 new TestCase(2452523.5, 0, 5762, ELUL+1, 29, FRI, 0, 0, 0), 222 new TestCase(2452524.5, 0, 5763,TISHRI+1, 1, SAT, 0, 0, 0), 223 }; 224 doTestCases(testCases, new HebrewCalendar()); 225 226 }catch(MissingResourceException ex){ 227 warnln("Got Exception: "+ ex.getMessage()); 228 } 229 } 230 231 /** 232 * Problem reported by Armand Bendanan in which setting of the MONTH 233 * field in a Hebrew calendar causes the time fields to go negative. 234 */ 235 public void TestTimeFields() { 236 try{ 237 HebrewCalendar calendar = new HebrewCalendar(5761, 0, 11, 12, 28, 15); 238 calendar.set(Calendar.YEAR, 5717); 239 calendar.set(Calendar.MONTH, 2); 240 calendar.set(Calendar.DAY_OF_MONTH, 23); 241 if (calendar.get(Calendar.HOUR_OF_DAY) != 12) { 242 errln("Fail: HebrewCalendar HOUR_OF_DAY = " + calendar.get(Calendar.HOUR_OF_DAY)); 243 } 244 }catch(MissingResourceException ex){ 245 warnln("Got Exception: "+ ex.getMessage()); 246 } 247 } 248 249 /** 250 * Problem reported by Armand Bendanan (armand.bendanan@free.fr) 251 * in which setting of the MONTH field in a Hebrew calendar to 252 * ELUL on non leap years causes the date to be set on TISHRI next year. 253 */ 254 public void TestElulMonth() { 255 try{ 256 HebrewCalendar cal = new HebrewCalendar(); 257 // Leap years are: 258 // 3 6 8 11 14 17 19 (and so on - 19-year cycle) 259 for (int year=1; year<50; year++) { 260 // I hope that year = 0 does not exists 261 // because the test fails for it ! 262 cal.clear(); 263 264 cal.set(Calendar.YEAR, year); 265 cal.set(Calendar.MONTH, ELUL); 266 cal.set(Calendar.DAY_OF_MONTH, 1); 267 268 int yact = cal.get(Calendar.YEAR); 269 int mact = cal.get(Calendar.MONTH); 270 271 if (year != yact || ELUL != mact) { 272 errln("Fail: " + ELUL + "/" + year + 273 " -> " + 274 mact + "/" + yact); 275 } 276 } 277 }catch(MissingResourceException ex){ 278 warnln("Got Exception: "+ ex.getMessage()); 279 } 280 } 281 282 /** 283 * Test of the behavior of the month field. This requires special 284 * handling in the Hebrew calendar because of the pattern of leap 285 * years. 286 */ 287 public void TestMonthMovement() { 288 try{ 289 HebrewCalendar cal = new HebrewCalendar(); 290 // Leap years are: 291 // 3 6 8 11 14 17 19 (and so on - 19-year cycle) 292 // We can't test complete() on some lines below because of ADAR_1 -- if 293 // the calendar is set to ADAR_1 on a non-leap year, the result is undefined. 294 int[] DATA = { 295 // m1/y1 - month/year before (month is 1-based) 296 // delta - amount to add to month field 297 // m2/y2 - month/year after add(MONTH, delta) 298 // m3/y3 - month/year after set(MONTH, m1+delta) 299 //m1 y1 delta m2 y2 m3 y3 300 10, 2, +24, 9, 4, 9, 4, 301 10, 2, +60, 8, 7, 8, 7, 302 1 , 2, +12, 1, 3, 13, 2, //*set != add; also see '*' below 303 3 , 18, -24, 4, 16, 4, 16, 304 1 , 6, -24, 1, 4, 1, 4, 305 4 , 3, +2, 6, 3, 6, 3, // Leap year - no skip 4,5,6,7,8 306 8 , 3, -2, 6, 3, 6, 3, // Leap year - no skip 307 4 , 2, +2, 7, 2, 7, 2, // Skip leap month 4,5,(6),7,8 308 8 , 2, -2, 5, 2, 7, 2, //*Skip leap month going backward 309 }; 310 for (int i=0; i<DATA.length; ) { 311 int m = DATA[i++], y = DATA[i++]; 312 int monthDelta = DATA[i++]; 313 int m2 = DATA[i++], y2 = DATA[i++]; 314 int m3 = DATA[i++], y3 = DATA[i++]; 315 int mact, yact; 316 317 cal.clear(); 318 cal.set(Calendar.YEAR, y); 319 cal.set(Calendar.MONTH, m-1); 320 cal.add(Calendar.MONTH, monthDelta); 321 yact = cal.get(Calendar.YEAR); mact = cal.get(Calendar.MONTH) + 1; 322 if (y2 != yact || m2 != mact) { 323 errln("Fail: " + m + "/" + y + 324 " -> add(MONTH, " + monthDelta + ") -> " + 325 mact + "/" + yact + ", expected " + 326 m2 + "/" + y2); 327 cal.clear(); 328 cal.set(Calendar.YEAR, y); 329 cal.set(Calendar.MONTH, m-1); 330 logln("Start: " + m + "/" + y); 331 int delta = monthDelta > 0 ? 1 : -1; 332 for (int c=0; c!=monthDelta; c+=delta) { 333 cal.add(Calendar.MONTH, delta); 334 logln("+ " + delta + " MONTH -> " + 335 (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.YEAR)); 336 } 337 } 338 339 cal.clear(); 340 cal.set(Calendar.YEAR, y); 341 cal.set(Calendar.MONTH, m + monthDelta - 1); 342 yact = cal.get(Calendar.YEAR); mact = cal.get(Calendar.MONTH) + 1; 343 if (y3 != yact || m3 != mact) { 344 errln("Fail: " + (m+monthDelta) + "/" + y + 345 " -> complete() -> " + 346 mact + "/" + yact + ", expected " + 347 m3 + "/" + y3); 348 } 349 } 350 }catch(MissingResourceException ex){ 351 warnln("Got Exception: "+ ex.getMessage()); 352 } 353 } 354 355 /** 356 * Test handling of ADAR_1. 357 */ 358 /* 359 public void TestAdar1() { 360 HebrewCalendar cal = new HebrewCalendar(); 361 cal.clear(); 362 cal.set(Calendar.YEAR, 1903); // leap 363 cal.set(Calendar.MONTH, HebrewCalendar.ADAR_1); 364 logln("1903(leap)/ADAR_1 => " + 365 cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH)+1)); 366 367 cal.clear(); 368 cal.set(Calendar.YEAR, 1904); // non-leap 369 cal.set(Calendar.MONTH, HebrewCalendar.ADAR_1); 370 logln("1904(non-leap)/ADAR_1 => " + 371 cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH)+1)); 372 } 373 */ 374 375 /** 376 * With no fields set, the calendar should use default values. 377 */ 378 public void TestDefaultFieldValues() { 379 try{ 380 HebrewCalendar cal = new HebrewCalendar(); 381 cal.clear(); 382 logln("cal.clear() -> " + cal.getTime()); 383 }catch(MissingResourceException ex){ 384 warnln("could not load the locale data"); 385 } 386 } 387 388 /** 389 * Test limits of the Hebrew calendar 390 */ 391 public void TestLimits() { 392 Calendar cal = Calendar.getInstance(); 393 cal.set(2007, Calendar.JANUARY, 1); 394 HebrewCalendar hebrew = new HebrewCalendar(); 395 doLimitsTest(hebrew, null, cal.getTime()); 396 doTheoreticalLimitsTest(hebrew, true); 397 } 398 399 public void TestCoverage() { 400 try{ 401 { 402 // new HebrewCalendar(TimeZone) 403 HebrewCalendar cal = new HebrewCalendar(TimeZone.getDefault()); 404 if(cal == null){ 405 errln("could not create HebrewCalendar with TimeZone"); 406 } 407 } 408 409 { 410 // new HebrewCalendar(ULocale) 411 HebrewCalendar cal = new HebrewCalendar(ULocale.getDefault()); 412 if(cal == null){ 413 errln("could not create HebrewCalendar with ULocale"); 414 } 415 } 416 417 { 418 // new HebrewCalendar(Locale) 419 HebrewCalendar cal = new HebrewCalendar(Locale.getDefault()); 420 if(cal == null){ 421 errln("could not create HebrewCalendar with locale"); 422 } 423 } 424 425 { 426 // new HebrewCalendar(Date) 427 HebrewCalendar cal = new HebrewCalendar(new Date()); 428 if(cal == null){ 429 errln("could not create HebrewCalendar with date"); 430 } 431 } 432 433 { 434 // data 435 HebrewCalendar cal = new HebrewCalendar(2800, HebrewCalendar.SHEVAT, 1); 436 Date time = cal.getTime(); 437 438 String[] calendarLocales = { 439 "iw_IL" 440 }; 441 442 String[] formatLocales = { 443 "en", "fi", "fr", "hu", "iw", "nl" 444 }; 445 for (int i = 0; i < calendarLocales.length; ++i) { 446 String calLocName = calendarLocales[i]; 447 Locale calLocale = LocaleUtility.getLocaleFromName(calLocName); 448 cal = new HebrewCalendar(calLocale); 449 450 for (int j = 0; j < formatLocales.length; ++j) { 451 String locName = formatLocales[j]; 452 Locale formatLocale = LocaleUtility.getLocaleFromName(locName); 453 DateFormat format = DateFormat.getDateTimeInstance(cal, DateFormat.FULL, DateFormat.FULL, formatLocale); 454 logln(calLocName + "/" + locName + " --> " + format.format(time)); 455 } 456 } 457 } 458 }catch( MissingResourceException ex){ 459 warnln("Could not load the locale data. "+ ex.getMessage()); 460 } 461 } 462 public void Test1624() { 463 464 HebrewCalendar hc = new HebrewCalendar (5742, HebrewCalendar.AV, 22); 465 DateFormat df = hc.getDateTimeFormat(DateFormat.FULL, DateFormat.FULL, Locale.getDefault()); 466 String dateString = df.format(hc.getTime()); 467 468 for (int year = 5600; year < 5800; year ++) { 469 boolean leapYear = HebrewCalendar.isLeapYear (year); 470 for (int month = HebrewCalendar.TISHRI; month <= HebrewCalendar.ELUL;month++) { 471 // skip the adar 1 month if year is not a leap year 472 if (leapYear == false && month == HebrewCalendar.ADAR_1) { 473 continue; 474 } 475 int day = 15; 476 hc = new HebrewCalendar (year, month, day); 477 478 dateString = df.format(hc.getTime()); 479 int dayHC = hc.get (HebrewCalendar.DATE); 480 int monthHC = hc.get (HebrewCalendar.MONTH); 481 int yearHC = hc.get (HebrewCalendar.YEAR); 482 483 String header = "year:" + year + " isleap:" + leapYear + " " + dateString; 484 if (dayHC != day) { 485 errln (header + " ==> day:" + dayHC + " incorrect, should be:" + day); 486 break; 487 } 488 if (monthHC != month) { 489 errln (header + " ==> month:" + monthHC + " incorrect, should be:" + month); 490 break; 491 } 492 if (yearHC != year) { 493 errln (header + " ==> year:" + yearHC + " incorrecte, should be:" + year); 494 break; 495 } 496 } 497 } 498 } 499 500 // Test case for Ticket#10313. HebrewCalendar requires 501 // special handling for validating month value, because 502 // month Adar I is only available in leap years. 503 public void TestMonthValidation() { 504 HebrewCalendar cal = new HebrewCalendar(); 505 cal.setLenient(false); 506 507 // 5776 is a leap year and has month Adar I 508 cal.set(5776, ADAR_1, 1); 509 try { 510 /* Date d = */ cal.getTime(); 511 } catch (IllegalArgumentException e) { 512 errln("Fail: 5776 Adar I 1 is a valid date."); 513 } 514 515 // 5777 is NOT a lear year and does not have month Adar I 516 cal.set(5777, ADAR_1, 1); 517 try { 518 /* Date d = */ cal.getTime(); 519 errln("Fail: IllegalArgumentException should be thrown for input date 5777 Adar I 1."); 520 } catch (IllegalArgumentException e) { 521 logln("Info: IllegalArgumentException, because 5777 Adar I 1 is not a valid date."); 522 } 523 } 524} 525