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