|  | /******************************************************************** | 
|  | * COPYRIGHT: | 
|  | * Copyright (c) 2003, International Business Machines Corporation | 
|  | * and others. All Rights Reserved. | 
|  | ******************************************************************** | 
|  | * Calendar Case Test is a type of CalendarTest which compares the | 
|  | * behavior of a calendar to a certain set of 'test cases', involving | 
|  | * conversion between julian-day to fields and vice versa. | 
|  | ********************************************************************/ | 
|  |  | 
|  | #include "calcasts.h" | 
|  |  | 
|  | #if !UCONFIG_NO_FORMATTING | 
|  | // ======= 'Main' =========================== | 
|  |  | 
|  | #include "hebrwcal.h" // for Eras | 
|  |  | 
|  | #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break | 
|  |  | 
|  |  | 
|  | void CalendarCaseTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ ) | 
|  | { | 
|  | if (exec) logln("TestSuite CalendarCaseTest"); | 
|  | switch (index) { | 
|  | CASE(0,IslamicCivil); | 
|  | CASE(1,Hebrew); | 
|  | default: name = ""; break; | 
|  | } | 
|  | } | 
|  |  | 
|  | #undef CASE | 
|  |  | 
|  | // ======= Utility functions ================= | 
|  |  | 
|  | void CalendarCaseTest::doTestCases(const TestCase *cases, Calendar *cal) { | 
|  | static const int32_t  ONE_SECOND = 1000; | 
|  | static const int32_t  ONE_MINUTE = 60*ONE_SECOND; | 
|  | static const int32_t  ONE_HOUR   = 60*ONE_MINUTE; | 
|  | static const double ONE_DAY    = 24*ONE_HOUR; | 
|  | static const double JULIAN_EPOCH = -210866760000000.;   // 1/1/4713 BC 12:00 | 
|  | int32_t i; | 
|  | UErrorCode status = U_ZERO_ERROR; | 
|  | cal->adoptTimeZone(TimeZone::getGMT()->clone()); | 
|  | for(i=0;cases[i].era>=0;i++) { | 
|  | UDate t = (JULIAN_EPOCH+(ONE_DAY*cases[i].julian)); | 
|  |  | 
|  | logln("Test case %d:  julianday%f -> date %f\n", i, cases[i].julian, t); | 
|  |  | 
|  | // Millis -> fields | 
|  | cal->setTime(t, status); | 
|  |  | 
|  | logln(calToStr(*cal)); | 
|  |  | 
|  | checkField(cal, UCAL_ERA, cases[i].era, status); | 
|  | checkField(cal, UCAL_YEAR, cases[i].year,status); | 
|  | checkField(cal, UCAL_MONTH, cases[i].month - 1,status); | 
|  | checkField(cal, UCAL_DATE, cases[i].day,status); | 
|  | checkField(cal, UCAL_DAY_OF_WEEK, cases[i].dayOfWeek,status); | 
|  | checkField(cal, UCAL_HOUR, cases[i].hour,status); | 
|  | checkField(cal, UCAL_MINUTE, cases[i].min,status); | 
|  | checkField(cal, UCAL_SECOND, cases[i].sec,status); | 
|  |  | 
|  | // Fields -> millis | 
|  | cal->clear(); | 
|  |  | 
|  | cal->set(UCAL_ERA, cases[i].era); | 
|  | cal->set(UCAL_YEAR, cases[i].year); | 
|  | cal->set(UCAL_MONTH, cases[i].month - 1); | 
|  | cal->set(UCAL_DATE, cases[i].day); | 
|  | cal->set(UCAL_DAY_OF_WEEK, cases[i].dayOfWeek); | 
|  | cal->set(UCAL_HOUR, cases[i].hour); | 
|  | cal->set(UCAL_MINUTE, cases[i].min); | 
|  | cal->set(UCAL_SECOND, cases[i].sec); | 
|  |  | 
|  | UDate t2 = cal->getTime(status); | 
|  |  | 
|  | if(t != t2) { | 
|  | errln("Field->millis: Expected %.0f but got %.0f\n", t, t2); | 
|  | logln(calToStr(*cal)); | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | UBool CalendarCaseTest::checkField(Calendar *cal, UCalendarDateFields field, int32_t value, UErrorCode &status) | 
|  | { | 
|  | if(U_FAILURE(status)) return FALSE; | 
|  | int32_t res = cal->get(field, status); | 
|  | if(U_FAILURE(status)) { | 
|  | errln((UnicodeString)"Checking field " + fieldName(field) + " and got " + u_errorName(status)); | 
|  | return FALSE; | 
|  | } | 
|  | if(res != value) { | 
|  | errln((UnicodeString)"FAIL: Checking field " + fieldName(field) + " expected " + value + " and got " + res + UnicodeString("\n")); | 
|  | return FALSE; | 
|  | } else { | 
|  | logln((UnicodeString)"Checking field " + fieldName(field) + " == " + value + UnicodeString("\n")); | 
|  | } | 
|  | return TRUE; | 
|  | } | 
|  |  | 
|  | // =========== Test Cases ===================== | 
|  | enum { SUN=UCAL_SUNDAY, | 
|  | MON=UCAL_MONDAY, | 
|  | TUE=UCAL_TUESDAY, | 
|  | WED=UCAL_WEDNESDAY, | 
|  | THU=UCAL_THURSDAY, | 
|  | FRI=UCAL_FRIDAY, | 
|  | SAT=UCAL_SATURDAY}; | 
|  |  | 
|  | void CalendarCaseTest::IslamicCivil() | 
|  | { | 
|  | static const TestCase tests[] = { | 
|  | // | 
|  | // Most of these test cases were taken from the back of | 
|  | // "Calendrical Calculations", with some extras added to help | 
|  | // debug a few of the problems that cropped up in development. | 
|  | // | 
|  | // The months in this table are 1-based rather than 0-based, | 
|  | // because it's easier to edit that way. | 
|  | //                       Islamic | 
|  | //          Julian Day  Era  Year  Month Day  WkDay Hour Min Sec | 
|  | {1507231.5,  0, -1245,   12,   9,  SUN,   0,  0,  0}, | 
|  | { 1660037.5,  0,  -813,    2,  23,  WED,   0,  0,  0}, | 
|  | { 1746893.5,  0,  -568,    4,   1,  WED,   0,  0,  0}, | 
|  | { 1770641.5,  0,  -501,    4,   6,  SUN,   0,  0,  0}, | 
|  | { 1892731.5,  0,  -157,   10,  17,  WED,   0,  0,  0}, | 
|  | { 1931579.5,  0,   -47,    6,   3,  MON,   0,  0,  0}, | 
|  | { 1974851.5,  0,    75,    7,  13,  SAT,   0,  0,  0}, | 
|  | { 2091164.5,  0,   403,   10,   5,  SUN,   0,  0,  0}, | 
|  | { 2121509.5,  0,   489,    5,  22,  SUN,   0,  0,  0}, | 
|  | { 2155779.5,  0,   586,    2,   7,  FRI,   0,  0,  0}, | 
|  | { 2174029.5,  0,   637,    8,   7,  SAT,   0,  0,  0}, | 
|  | { 2191584.5,  0,   687,    2,  20,  FRI,   0,  0,  0}, | 
|  | { 2195261.5,  0,   697,    7,   7,  SUN,   0,  0,  0}, | 
|  | { 2229274.5,  0,   793,    7,   1,  SUN,   0,  0,  0}, | 
|  | { 2245580.5,  0,   839,    7,   6,  WED,   0,  0,  0}, | 
|  | { 2266100.5,  0,   897,    6,   1,  SAT,   0,  0,  0}, | 
|  | { 2288542.5,  0,   960,    9,  30,  SAT,   0,  0,  0}, | 
|  | { 2290901.5,  0,   967,    5,  27,  SAT,   0,  0,  0}, | 
|  | { 2323140.5,  0,  1058,    5,  18,  WED,   0,  0,  0}, | 
|  | { 2334848.5,  0,  1091,    6,   2,  SUN,   0,  0,  0}, | 
|  | { 2348020.5,  0,  1128,    8,   4,  FRI,   0,  0,  0}, | 
|  | { 2366978.5,  0,  1182,    2,   3,  SUN,   0,  0,  0}, | 
|  | { 2385648.5,  0,  1234,   10,  10,  MON,   0,  0,  0}, | 
|  | { 2392825.5,  0,  1255,    1,  11,  WED,   0,  0,  0}, | 
|  | { 2416223.5,  0,  1321,    1,  21,  SUN,   0,  0,  0}, | 
|  | { 2425848.5,  0,  1348,    3,  19,  SUN,   0,  0,  0}, | 
|  | { 2430266.5,  0,  1360,    9,   8,  MON,   0,  0,  0}, | 
|  | { 2430833.5,  0,  1362,    4,  13,  MON,   0,  0,  0}, | 
|  | { 2431004.5,  0,  1362,   10,   7,  THU,   0,  0,  0}, | 
|  | { 2448698.5,  0,  1412,    9,  13,  TUE,   0,  0,  0}, | 
|  | { 2450138.5,  0,  1416,   10,   5,  SUN,   0,  0,  0}, | 
|  | { 2465737.5,  0,  1460,   10,  12,  WED,   0,  0,  0}, | 
|  | { 2486076.5,  0,  1518,    3,   5,  SUN,   0,  0,  0}, | 
|  | { -1,-1,-1,-1,-1,-1,-1,-1,-1 } | 
|  | }; | 
|  |  | 
|  | UErrorCode status = U_ZERO_ERROR; | 
|  | Calendar *c = Calendar::createInstance("ar@calendar=islamic-civil", status); | 
|  | c->setLenient(TRUE); | 
|  | doTestCases(tests, c); | 
|  | delete c; | 
|  | } | 
|  |  | 
|  | void CalendarCaseTest::Hebrew() { | 
|  | static const int32_t TISHRI  = HebrewCalendar::TISHRI; | 
|  | //     static const int32_t HESHVAN = HebrewCalendar::HESHVAN; | 
|  | //     static const int32_t KISLEV  = HebrewCalendar::KISLEV; | 
|  | //     static const int32_t TEVET   = HebrewCalendar::TEVET; | 
|  | //     static const int32_t SHEVAT  = HebrewCalendar::SHEVAT; | 
|  | //     static const int32_t ADAR_1  = HebrewCalendar::ADAR_1; | 
|  | //     static const int32_t ADAR    = HebrewCalendar::ADAR; | 
|  | //     static const int32_t NISAN   = HebrewCalendar::NISAN; | 
|  | //     static const int32_t IYAR    = HebrewCalendar::IYAR; | 
|  | //     static const int32_t SIVAN   = HebrewCalendar::SIVAN; | 
|  | //     static const int32_t TAMUZ   = HebrewCalendar::TAMUZ; | 
|  | static const int32_t AV      = HebrewCalendar::AV; | 
|  | static const int32_t ELUL    = HebrewCalendar::ELUL; | 
|  |  | 
|  | static const TestCase tests[] = { | 
|  | // | 
|  | // Most of these test cases were taken from the back of | 
|  | // "Calendrical Calculations", with some extras added to help | 
|  | // debug a few of the problems that cropped up in development. | 
|  | // | 
|  | // The months in this table are 1-based rather than 0-based, | 
|  | // because it's easier to edit that way. | 
|  | // | 
|  | //         Julian Day  Era  Year  Month Day  WkDay Hour Min Sec | 
|  | {1507231.5,  0,  3174,   12,  10,  SUN,   0,  0,  0}, | 
|  | {1660037.5,  0,  3593,    3,  25,  WED,   0,  0,  0}, | 
|  | {1746893.5,  0,  3831,    1,   3,  WED,   0,  0,  0}, | 
|  | {1770641.5,  0,  3896,    1,   9,  SUN,   0,  0,  0}, | 
|  | {1892731.5,  0,  4230,    4,  18,  WED,   0,  0,  0}, | 
|  | {1931579.5,  0,  4336,   10,   4,  MON,   0,  0,  0}, | 
|  | {1974851.5,  0,  4455,    2,  13,  SAT,   0,  0,  0}, | 
|  | {2091164.5,  0,  4773,    9,   6,  SUN,   0,  0,  0}, | 
|  | {2121509.5,  0,  4856,    9,  23,  SUN,   0,  0,  0}, | 
|  | {2155779.5,  0,  4950,    8,   7,  FRI,   0,  0,  0}, | 
|  | {2174029.5,  0,  5000,    7,   8,  SAT,   0,  0,  0}, | 
|  | {2191584.5,  0,  5048,    8,  21,  FRI,   0,  0,  0}, | 
|  | {2195261.5,  0,  5058,    9,   7,  SUN,   0,  0,  0}, | 
|  | {2229274.5,  0,  5151,   11,   1,  SUN,   0,  0,  0}, | 
|  | {2245580.5,  0,  5196,    5,   7,  WED,   0,  0,  0}, | 
|  | {2266100.5,  0,  5252,    8,   3,  SAT,   0,  0,  0}, | 
|  | {2288542.5,  0,  5314,    1,   1,  SAT,   0,  0,  0}, | 
|  | {2290901.5,  0,  5320,    6,  27,  SAT,   0,  0,  0}, | 
|  | {2323140.5,  0,  5408,   10,  20,  WED,   0,  0,  0}, | 
|  | {2334551.5,  0,  5440,    1,   1,  THU,   0,  0,  0}, | 
|  | {2334581.5,  0,  5440,    2,   1,  SAT,   0,  0,  0}, | 
|  | {2334610.5,  0,  5440,    3,   1,  SUN,   0,  0,  0}, | 
|  | {2334639.5,  0,  5440,    4,   1,  MON,   0,  0,  0}, | 
|  | {2334668.5,  0,  5440,    5,   1,  TUE,   0,  0,  0}, | 
|  | {2334698.5,  0,  5440,    6,   1,  THU,   0,  0,  0}, | 
|  | {2334728.5,  0,  5440,    7,   1,  SAT,   0,  0,  0}, | 
|  | {2334757.5,  0,  5440,    8,   1,  SUN,   0,  0,  0}, | 
|  | {2334787.5,  0,  5440,    9,   1,  TUE,   0,  0,  0}, | 
|  | {2334816.5,  0,  5440,   10,   1,  WED,   0,  0,  0}, | 
|  | {2334846.5,  0,  5440,   11,   1,  FRI,   0,  0,  0}, | 
|  | {2334848.5,  0,  5440,   11,   3,  SUN,   0,  0,  0}, | 
|  | {2334934.5,  0,  5441,    1,   1,  TUE,   0,  0,  0}, | 
|  | {2348020.5,  0,  5476,   12,   5,  FRI,   0,  0,  0}, | 
|  | {2366978.5,  0,  5528,   11,   4,  SUN,   0,  0,  0}, | 
|  | {2385648.5,  0,  5579,   12,  11,  MON,   0,  0,  0}, | 
|  | {2392825.5,  0,  5599,    8,  12,  WED,   0,  0,  0}, | 
|  | {2416223.5,  0,  5663,    8,  22,  SUN,   0,  0,  0}, | 
|  | {2425848.5,  0,  5689,   12,  19,  SUN,   0,  0,  0}, | 
|  | {2430266.5,  0,  5702,    1,   8,  MON,   0,  0,  0}, | 
|  | {2430833.5,  0,  5703,    8,  14,  MON,   0,  0,  0}, | 
|  | {2431004.5,  0,  5704,    1,   8,  THU,   0,  0,  0}, | 
|  | {2448698.5,  0,  5752,    7,  12,  TUE,   0,  0,  0}, | 
|  | {2450138.5,  0,  5756,    7,   5,  SUN,   0,  0,  0}, | 
|  | {2465737.5,  0,  5799,    2,  12,  WED,   0,  0,  0}, | 
|  | {2486076.5,  0,  5854,   12,   5,  SUN,   0,  0,  0}, | 
|  |  | 
|  | // Test cases taken from a table of 14 "year types" in the Help file | 
|  | // of the application "Hebrew Calendar" | 
|  | {2456187.5,  0,  5773,    1,   1,  MON,   0,  0,  0}, | 
|  | {2459111.5,  0,  5781,    1,   1,  SAT,   0,  0,  0}, | 
|  | {2453647.5,  0,  5766,    1,   1,  TUE,   0,  0,  0}, | 
|  | {2462035.5,  0,  5789,    1,   1,  THU,   0,  0,  0}, | 
|  | {2458756.5,  0,  5780,    1,   1,  MON,   0,  0,  0}, | 
|  | {2460586.5,  0,  5785,    1,   1,  THU,   0,  0,  0}, | 
|  | {2463864.5,  0,  5794,    1,   1,  SAT,   0,  0,  0}, | 
|  | {2463481.5,  0,  5793,    1,   1,  MON,   0,  0,  0}, | 
|  | {2470421.5,  0,  5812,    1,   1,  THU,   0,  0,  0}, | 
|  | {2460203.5,  0,  5784,    1,   1,  SAT,   0,  0,  0}, | 
|  | {2459464.5,  0,  5782,    1,   1,  TUE,   0,  0,  0}, | 
|  | {2467142.5,  0,  5803,    1,   1,  MON,   0,  0,  0}, | 
|  | {2455448.5,  0,  5771,    1,   1,  THU,   0,  0,  0}, | 
|  | // Test cases for JB#2327 | 
|  | // http://www.fourmilab.com/documents/calendar/ | 
|  | // http://www.calendarhome.com/converter/ | 
|  | //      2452465.5, 2002, JULY, 10, 5762, AV, 1, | 
|  | //      2452494.5, 2002, AUGUST, 8, 5762, AV, 30, | 
|  | //      2452495.5, 2002, AUGUST, 9, 5762, ELUL, 1, | 
|  | //      2452523.5, 2002, SEPTEMBER, 6, 5762, ELUL, 29, | 
|  | //      2452524.5, 2002, SEPTEMBER, 7, 5763, TISHRI, 1, | 
|  | //         Julian Day  Era  Year  Month Day  WkDay Hour Min Sec | 
|  | {2452465.5,  0,  5762,    AV+1,  1,  WED,   0,  0,  0}, | 
|  | {2452494.5,  0,  5762,    AV+1, 30,  THU,   0,  0,  0}, | 
|  | {2452495.5,  0,  5762,  ELUL+1,  1,  FRI,   0,  0,  0}, | 
|  | {2452523.5,  0,  5762,  ELUL+1, 29,  FRI,   0,  0,  0}, | 
|  | {2452524.5,  0,  5763, TISHRI+1,  1,  SAT,   0,  0,  0}, | 
|  | { -1,-1,-1,-1,-1,-1,-1,-1,-1 } | 
|  | }; | 
|  |  | 
|  | UErrorCode status = U_ZERO_ERROR; | 
|  | Calendar *c = Calendar::createInstance("he_HE@calendar=hebrew", status); | 
|  | c->setLenient(TRUE); | 
|  | doTestCases(tests, c); | 
|  |  | 
|  |  | 
|  | // Additional test cases for bugs found during development | 
|  | //           G.YY/MM/DD  Era  Year  Month Day  WkDay Hour Min Sec | 
|  | //{1013, 9, 8, 0,  4774,    1,   1,  TUE,   0,  0,  0}, | 
|  | //{1239, 9, 1, 0,  5000,    1,   1,  THU,   0,  0,  0}, | 
|  | //{1240, 9,18, 0,  5001,    1,   1,  TUE,   0,  0,  0}, | 
|  |  | 
|  |  | 
|  | delete c; | 
|  | } | 
|  |  | 
|  |  | 
|  | #endif |