Home | History | Annotate | Download | only in intltest
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 2003-2010, International Business Machines Corporation
      4  * and others. All Rights Reserved.
      5  ********************************************************************
      6  * Calendar Case Test is a type of CalendarTest which compares the
      7  * behavior of a calendar to a certain set of 'test cases', involving
      8  * conversion between julian-day to fields and vice versa.
      9  ********************************************************************/
     10 
     11 #include "calcasts.h"
     12 
     13 #if !UCONFIG_NO_FORMATTING
     14 // ======= 'Main' ===========================
     15 
     16 #include "hebrwcal.h" // for Eras
     17 #include "indiancal.h"
     18 #include "coptccal.h"
     19 #include "ethpccal.h"
     20 #include "unicode/datefmt.h"
     21 
     22 #define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break
     23 
     24 
     25 void CalendarCaseTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
     26 {
     27     if (exec) logln("TestSuite CalendarCaseTest");
     28     switch (index) {
     29     CASE(0,IslamicCivil);
     30     CASE(1,Hebrew);
     31     CASE(2,Indian);
     32     CASE(3,Coptic);
     33     CASE(4,Ethiopic);
     34     default: name = ""; break;
     35     }
     36 }
     37 
     38 #undef CASE
     39 
     40 // ======= Utility functions =================
     41 
     42 void CalendarCaseTest::doTestCases(const TestCase *cases, Calendar *cal) {
     43   static const int32_t  ONE_SECOND = 1000;
     44   static const int32_t  ONE_MINUTE = 60*ONE_SECOND;
     45   static const int32_t  ONE_HOUR   = 60*ONE_MINUTE;
     46   static const double ONE_DAY    = 24*ONE_HOUR;
     47   static const double JULIAN_EPOCH = -210866760000000.;   // 1/1/4713 BC 12:00
     48   int32_t i;
     49   UErrorCode status = U_ZERO_ERROR;
     50   cal->adoptTimeZone(TimeZone::getGMT()->clone());
     51   for(i=0;cases[i].era>=0;i++) {
     52     UDate t = (JULIAN_EPOCH+(ONE_DAY*cases[i].julian));
     53 
     54     logln("Test case %d:  julianday%f -> date %f\n", i, cases[i].julian, t);
     55 
     56     // Millis -> fields
     57     cal->setTime(t, status);
     58 
     59     logln(calToStr(*cal));
     60 
     61     checkField(cal, UCAL_ERA, cases[i].era, status);
     62     checkField(cal, UCAL_YEAR, cases[i].year,status);
     63     checkField(cal, UCAL_MONTH, cases[i].month - 1,status);
     64     checkField(cal, UCAL_DATE, cases[i].day,status);
     65     checkField(cal, UCAL_DAY_OF_WEEK, cases[i].dayOfWeek,status);
     66     checkField(cal, UCAL_HOUR, cases[i].hour,status);
     67     checkField(cal, UCAL_MINUTE, cases[i].min,status);
     68     checkField(cal, UCAL_SECOND, cases[i].sec,status);
     69 
     70     // Fields -> millis
     71     cal->clear();
     72 
     73     cal->set(UCAL_ERA, cases[i].era);
     74     cal->set(UCAL_YEAR, cases[i].year);
     75     cal->set(UCAL_MONTH, cases[i].month - 1);
     76     cal->set(UCAL_DATE, cases[i].day);
     77     cal->set(UCAL_DAY_OF_WEEK, cases[i].dayOfWeek);
     78     cal->set(UCAL_HOUR, cases[i].hour);
     79     cal->set(UCAL_MINUTE, cases[i].min);
     80     cal->set(UCAL_SECOND, cases[i].sec);
     81 
     82     UDate t2 = cal->getTime(status);
     83 
     84     if(t != t2) {
     85       errln("Field->millis: Expected %.0f but got %.0f\n", t, t2);
     86       logln(calToStr(*cal));
     87     }
     88   }
     89 }
     90 
     91 UBool CalendarCaseTest::checkField(Calendar *cal, UCalendarDateFields field, int32_t value, UErrorCode &status)
     92 {
     93   if(U_FAILURE(status)) return FALSE;
     94   int32_t res = cal->get(field, status);
     95   if(U_FAILURE(status)) {
     96     errln((UnicodeString)"Checking field " + fieldName(field) + " and got " + u_errorName(status));
     97     return FALSE;
     98   }
     99   if(res != value) {
    100     errln((UnicodeString)"FAIL: Checking field " + fieldName(field) + " expected " + value + " and got " + res + UnicodeString("\n"));
    101     return FALSE;
    102   } else {
    103     logln((UnicodeString)"Checking field " + fieldName(field) + " == " + value + UnicodeString("\n"));
    104   }
    105   return TRUE;
    106 }
    107 
    108 // =========== Test Cases =====================
    109 enum { SUN=UCAL_SUNDAY,
    110        MON=UCAL_MONDAY,
    111        TUE=UCAL_TUESDAY,
    112        WED=UCAL_WEDNESDAY,
    113        THU=UCAL_THURSDAY,
    114        FRI=UCAL_FRIDAY,
    115        SAT=UCAL_SATURDAY};
    116 
    117 void CalendarCaseTest::IslamicCivil()
    118 {
    119     static const TestCase tests[] = {
    120         //
    121         // Most of these test cases were taken from the back of
    122         // "Calendrical Calculations", with some extras added to help
    123         // debug a few of the problems that cropped up in development.
    124         //
    125         // The months in this table are 1-based rather than 0-based,
    126         // because it's easier to edit that way.
    127         //                       Islamic
    128         //          Julian Day  Era  Year  Month Day  WkDay Hour Min Sec
    129         { 1507231.5,  0, -1245,   12,   9,  SUN,   0,  0,  0},
    130         { 1660037.5,  0,  -813,    2,  23,  WED,   0,  0,  0},
    131         { 1746893.5,  0,  -568,    4,   1,  WED,   0,  0,  0},
    132         { 1770641.5,  0,  -501,    4,   6,  SUN,   0,  0,  0},
    133         { 1892731.5,  0,  -157,   10,  17,  WED,   0,  0,  0},
    134         { 1931579.5,  0,   -47,    6,   3,  MON,   0,  0,  0},
    135         { 1974851.5,  0,    75,    7,  13,  SAT,   0,  0,  0},
    136         { 2091164.5,  0,   403,   10,   5,  SUN,   0,  0,  0},
    137         { 2121509.5,  0,   489,    5,  22,  SUN,   0,  0,  0},
    138         { 2155779.5,  0,   586,    2,   7,  FRI,   0,  0,  0},
    139         { 2174029.5,  0,   637,    8,   7,  SAT,   0,  0,  0},
    140         { 2191584.5,  0,   687,    2,  20,  FRI,   0,  0,  0},
    141         { 2195261.5,  0,   697,    7,   7,  SUN,   0,  0,  0},
    142         { 2229274.5,  0,   793,    7,   1,  SUN,   0,  0,  0},
    143         { 2245580.5,  0,   839,    7,   6,  WED,   0,  0,  0},
    144         { 2266100.5,  0,   897,    6,   1,  SAT,   0,  0,  0},
    145         { 2288542.5,  0,   960,    9,  30,  SAT,   0,  0,  0},
    146         { 2290901.5,  0,   967,    5,  27,  SAT,   0,  0,  0},
    147         { 2323140.5,  0,  1058,    5,  18,  WED,   0,  0,  0},
    148         { 2334848.5,  0,  1091,    6,   2,  SUN,   0,  0,  0},
    149         { 2348020.5,  0,  1128,    8,   4,  FRI,   0,  0,  0},
    150         { 2366978.5,  0,  1182,    2,   3,  SUN,   0,  0,  0},
    151         { 2385648.5,  0,  1234,   10,  10,  MON,   0,  0,  0},
    152         { 2392825.5,  0,  1255,    1,  11,  WED,   0,  0,  0},
    153         { 2416223.5,  0,  1321,    1,  21,  SUN,   0,  0,  0},
    154         { 2425848.5,  0,  1348,    3,  19,  SUN,   0,  0,  0},
    155         { 2430266.5,  0,  1360,    9,   8,  MON,   0,  0,  0},
    156         { 2430833.5,  0,  1362,    4,  13,  MON,   0,  0,  0},
    157         { 2431004.5,  0,  1362,   10,   7,  THU,   0,  0,  0},
    158         { 2448698.5,  0,  1412,    9,  13,  TUE,   0,  0,  0},
    159         { 2450138.5,  0,  1416,   10,   5,  SUN,   0,  0,  0},
    160         { 2465737.5,  0,  1460,   10,  12,  WED,   0,  0,  0},
    161         { 2486076.5,  0,  1518,    3,   5,  SUN,   0,  0,  0},
    162         { -1,-1,-1,-1,-1,-1,-1,-1,-1 }
    163     };
    164 
    165     UErrorCode status = U_ZERO_ERROR;
    166     Calendar *c = Calendar::createInstance("ar@calendar=islamic-civil", status);
    167     if (failure(status, "Calendar::createInstance", TRUE)) return;
    168     c->setLenient(TRUE);
    169     doTestCases(tests, c);
    170 
    171     static const UChar expectedUChars[] = {
    172         0x0627, 0x0644, 0x062e, 0x0645, 0x064a, 0x0633, 0x060c, 0x0020, 0x0662, 0x0662,
    173         0x0020, 0x0634, 0x0648, 0x0627, 0x0644, 0x060c, 0x0020, 0x0661, 0x0663, 0x0668,
    174         0x0669, 0
    175     };
    176     UnicodeString result;
    177     DateFormat *fmt = DateFormat::createDateInstance(DateFormat::kFull, Locale("ar_JO@calendar=islamic-civil"));
    178     if (fmt == NULL) {
    179         dataerrln("Error calling DateFormat::createDateInstance");
    180         delete c;
    181         return;
    182     }
    183 
    184     fmt->setTimeZone(*TimeZone::getGMT());
    185     fmt->format((UDate)2486076.5, result);
    186     if (result != expectedUChars) {
    187         errln((UnicodeString)"FAIL: DateFormatting failed. Got " + result + " and expected " + UnicodeString(expectedUChars) + UnicodeString("\n"));
    188         errln("Maybe the resource aliasing isn't working");
    189     }
    190     delete fmt;
    191     delete c;
    192 }
    193 
    194 void CalendarCaseTest::Hebrew() {
    195     static const int32_t TISHRI  = HebrewCalendar::TISHRI;
    196     //static const int32_t HESHVAN = HebrewCalendar::HESHVAN;
    197     //static const int32_t KISLEV  = HebrewCalendar::KISLEV;
    198     //static const int32_t TEVET   = HebrewCalendar::TEVET;
    199     //static const int32_t SHEVAT  = HebrewCalendar::SHEVAT;
    200     //static const int32_t ADAR_1  = HebrewCalendar::ADAR_1;
    201     //static const int32_t ADAR    = HebrewCalendar::ADAR;
    202     //static const int32_t NISAN   = HebrewCalendar::NISAN;
    203     //static const int32_t IYAR    = HebrewCalendar::IYAR;
    204     //static const int32_t SIVAN   = HebrewCalendar::SIVAN;
    205     //static const int32_t TAMUZ   = HebrewCalendar::TAMUZ;
    206     static const int32_t AV      = HebrewCalendar::AV;
    207     static const int32_t ELUL    = HebrewCalendar::ELUL;
    208 
    209     static const TestCase tests[] = {
    210         //
    211         // Most of these test cases were taken from the back of
    212         // "Calendrical Calculations", with some extras added to help
    213         // debug a few of the problems that cropped up in development.
    214         //
    215         // The months in this table are 1-based rather than 0-based,
    216         // because it's easier to edit that way.
    217         //
    218         //         Julian Day  Era  Year  Month Day  WkDay Hour Min Sec
    219         {1507231.5,  0,  3174,   12,  10,  SUN,   0,  0,  0},
    220         {1660037.5,  0,  3593,    3,  25,  WED,   0,  0,  0},
    221         {1746893.5,  0,  3831,    1,   3,  WED,   0,  0,  0},
    222         {1770641.5,  0,  3896,    1,   9,  SUN,   0,  0,  0},
    223         {1892731.5,  0,  4230,    4,  18,  WED,   0,  0,  0},
    224         {1931579.5,  0,  4336,   10,   4,  MON,   0,  0,  0},
    225         {1974851.5,  0,  4455,    2,  13,  SAT,   0,  0,  0},
    226         {2091164.5,  0,  4773,    9,   6,  SUN,   0,  0,  0},
    227         {2121509.5,  0,  4856,    9,  23,  SUN,   0,  0,  0},
    228         {2155779.5,  0,  4950,    8,   7,  FRI,   0,  0,  0},
    229         {2174029.5,  0,  5000,    7,   8,  SAT,   0,  0,  0},
    230         {2191584.5,  0,  5048,    8,  21,  FRI,   0,  0,  0},
    231         {2195261.5,  0,  5058,    9,   7,  SUN,   0,  0,  0},
    232         {2229274.5,  0,  5151,   11,   1,  SUN,   0,  0,  0},
    233         {2245580.5,  0,  5196,    5,   7,  WED,   0,  0,  0},
    234         {2266100.5,  0,  5252,    8,   3,  SAT,   0,  0,  0},
    235         {2288542.5,  0,  5314,    1,   1,  SAT,   0,  0,  0},
    236         {2290901.5,  0,  5320,    6,  27,  SAT,   0,  0,  0},
    237         {2323140.5,  0,  5408,   10,  20,  WED,   0,  0,  0},
    238         {2334551.5,  0,  5440,    1,   1,  THU,   0,  0,  0},
    239         {2334581.5,  0,  5440,    2,   1,  SAT,   0,  0,  0},
    240         {2334610.5,  0,  5440,    3,   1,  SUN,   0,  0,  0},
    241         {2334639.5,  0,  5440,    4,   1,  MON,   0,  0,  0},
    242         {2334668.5,  0,  5440,    5,   1,  TUE,   0,  0,  0},
    243         {2334698.5,  0,  5440,    6,   1,  THU,   0,  0,  0},
    244         {2334728.5,  0,  5440,    7,   1,  SAT,   0,  0,  0},
    245         {2334757.5,  0,  5440,    8,   1,  SUN,   0,  0,  0},
    246         {2334787.5,  0,  5440,    9,   1,  TUE,   0,  0,  0},
    247         {2334816.5,  0,  5440,   10,   1,  WED,   0,  0,  0},
    248         {2334846.5,  0,  5440,   11,   1,  FRI,   0,  0,  0},
    249         {2334848.5,  0,  5440,   11,   3,  SUN,   0,  0,  0},
    250         {2334934.5,  0,  5441,    1,   1,  TUE,   0,  0,  0},
    251         {2348020.5,  0,  5476,   12,   5,  FRI,   0,  0,  0},
    252         {2366978.5,  0,  5528,   11,   4,  SUN,   0,  0,  0},
    253         {2385648.5,  0,  5579,   12,  11,  MON,   0,  0,  0},
    254         {2392825.5,  0,  5599,    8,  12,  WED,   0,  0,  0},
    255         {2416223.5,  0,  5663,    8,  22,  SUN,   0,  0,  0},
    256         {2425848.5,  0,  5689,   12,  19,  SUN,   0,  0,  0},
    257         {2430266.5,  0,  5702,    1,   8,  MON,   0,  0,  0},
    258         {2430833.5,  0,  5703,    8,  14,  MON,   0,  0,  0},
    259         {2431004.5,  0,  5704,    1,   8,  THU,   0,  0,  0},
    260         {2448698.5,  0,  5752,    7,  12,  TUE,   0,  0,  0},
    261         {2450138.5,  0,  5756,    7,   5,  SUN,   0,  0,  0},
    262         {2465737.5,  0,  5799,    2,  12,  WED,   0,  0,  0},
    263         {2486076.5,  0,  5854,   12,   5,  SUN,   0,  0,  0},
    264 
    265         // Test cases taken from a table of 14 "year types" in the Help file
    266         // of the application "Hebrew Calendar"
    267         {2456187.5,  0,  5773,    1,   1,  MON,   0,  0,  0},
    268         {2459111.5,  0,  5781,    1,   1,  SAT,   0,  0,  0},
    269         {2453647.5,  0,  5766,    1,   1,  TUE,   0,  0,  0},
    270         {2462035.5,  0,  5789,    1,   1,  THU,   0,  0,  0},
    271         {2458756.5,  0,  5780,    1,   1,  MON,   0,  0,  0},
    272         {2460586.5,  0,  5785,    1,   1,  THU,   0,  0,  0},
    273         {2463864.5,  0,  5794,    1,   1,  SAT,   0,  0,  0},
    274         {2463481.5,  0,  5793,    1,   1,  MON,   0,  0,  0},
    275         {2470421.5,  0,  5812,    1,   1,  THU,   0,  0,  0},
    276         {2460203.5,  0,  5784,    1,   1,  SAT,   0,  0,  0},
    277         {2459464.5,  0,  5782,    1,   1,  TUE,   0,  0,  0},
    278         {2467142.5,  0,  5803,    1,   1,  MON,   0,  0,  0},
    279         {2455448.5,  0,  5771,    1,   1,  THU,   0,  0,  0},
    280         // Test cases for JB#2327
    281         // http://www.fourmilab.com/documents/calendar/
    282         // http://www.calendarhome.com/converter/
    283         //      2452465.5, 2002, JULY, 10, 5762, AV, 1,
    284         //      2452494.5, 2002, AUGUST, 8, 5762, AV, 30,
    285         //      2452495.5, 2002, AUGUST, 9, 5762, ELUL, 1,
    286         //      2452523.5, 2002, SEPTEMBER, 6, 5762, ELUL, 29,
    287         //      2452524.5, 2002, SEPTEMBER, 7, 5763, TISHRI, 1,
    288         //         Julian Day  Era  Year  Month Day  WkDay Hour Min Sec
    289         {2452465.5,  0,  5762,    AV+1,  1,  WED,   0,  0,  0},
    290         {2452494.5,  0,  5762,    AV+1, 30,  THU,   0,  0,  0},
    291         {2452495.5,  0,  5762,  ELUL+1,  1,  FRI,   0,  0,  0},
    292         {2452523.5,  0,  5762,  ELUL+1, 29,  FRI,   0,  0,  0},
    293         {2452524.5,  0,  5763, TISHRI+1,  1,  SAT,   0,  0,  0},
    294         { -1,-1,-1,-1,-1,-1,-1,-1,-1 }
    295     };
    296 
    297     UErrorCode status = U_ZERO_ERROR;
    298     Calendar *c = Calendar::createInstance("he_HE@calendar=hebrew", status);
    299     if (failure(status, "Calendar::createInstance", TRUE)) return;
    300     c->setLenient(TRUE);
    301     doTestCases(tests, c);
    302 
    303 
    304     // Additional test cases for bugs found during development
    305     //           G.YY/MM/DD  Era  Year  Month Day  WkDay Hour Min Sec
    306     //{1013, 9, 8, 0,  4774,    1,   1,  TUE,   0,  0,  0},
    307     //{1239, 9, 1, 0,  5000,    1,   1,  THU,   0,  0,  0},
    308     //{1240, 9,18, 0,  5001,    1,   1,  TUE,   0,  0,  0},
    309 
    310 
    311     delete c;
    312 }
    313 
    314 void CalendarCaseTest::Indian() {
    315     // Months in indian calendar are 0-based. Here taking 1-based names:
    316     static const int32_t CHAITRA    = IndianCalendar::CHAITRA + 1;
    317     static const int32_t VAISAKHA   = IndianCalendar::VAISAKHA + 1;
    318     static const int32_t JYAISTHA   = IndianCalendar::JYAISTHA + 1;
    319     static const int32_t ASADHA     = IndianCalendar::ASADHA + 1;
    320     static const int32_t SRAVANA    = IndianCalendar::SRAVANA + 1 ;
    321     static const int32_t BHADRA     = IndianCalendar::BHADRA + 1 ;
    322     static const int32_t ASVINA     = IndianCalendar::ASVINA  + 1 ;
    323     static const int32_t KARTIKA    = IndianCalendar::KARTIKA + 1 ;
    324     static const int32_t AGRAHAYANA = IndianCalendar::AGRAHAYANA + 1 ;
    325     static const int32_t PAUSA      = IndianCalendar::PAUSA + 1 ;
    326     static const int32_t MAGHA      = IndianCalendar::MAGHA + 1 ;
    327     static const int32_t PHALGUNA   = IndianCalendar::PHALGUNA + 1 ;
    328 
    329 
    330     static const TestCase tests[] = {
    331     // Test dates generated from:
    332     // http://www.fourmilab.ch/documents/calendar/
    333 
    334     // A huge list of test cases to make sure that computeTime and computeFields
    335     // work properly for a wide range of data in the Indian civil calendar.
    336     //
    337     // Julian Day   Era Year     Month         Day  WkDay Hour Min Sec
    338        {1770641.5,  0,    57,    ASVINA,       10,  SUN,   0,  0,  0},
    339        {1892731.5,  0,   391,    PAUSA,        18,  WED,   0,  0,  0},
    340        {1931579.5,  0,   498,    VAISAKHA,     30,  MON,   0,  0,  0},
    341        {1974851.5,  0,   616,    KARTIKA,      19,  SAT,   0,  0,  0},
    342        {2091164.5,  0,   935,    VAISAKHA,      5,  SUN,   0,  0,  0},
    343        {2121509.5,  0,  1018,    JYAISTHA,      3,  SUN,   0,  0,  0},
    344        {2155779.5,  0,  1112,    CHAITRA,       2,  FRI,   0,  0,  0},
    345        {2174029.5,  0,  1161,    PHALGUNA,     20,  SAT,   0,  0,  0},
    346        {2191584.5,  0,  1210,    CHAITRA,      13,  FRI,   0,  0,  0},
    347        {2195261.5,  0,  1220,    VAISAKHA,      7,  SUN,   0,  0,  0},
    348        {2229274.5,  0,  1313,    JYAISTHA,     22,  SUN,   0,  0,  0},
    349        {2245580.5,  0,  1357,    MAGHA,        14,  WED,   0,  0,  0},
    350        {2266100.5,  0,  1414,    CHAITRA,      20,  SAT,   0,  0,  0},
    351        {2288542.5,  0,  1475,    BHADRA,       28,  SAT,   0,  0,  0},
    352        {2290901.5,  0,  1481,    PHALGUNA,     15,  SAT,   0,  0,  0},
    353        {2323140.5,  0,  1570,    JYAISTHA,     20,  WED,   0,  0,  0},
    354        {2334551.5,  0,  1601,    BHADRA,       16,  THU,   0,  0,  0},
    355        {2334581.5,  0,  1601,    ASVINA,       15,  SAT,   0,  0,  0},
    356        {2334610.5,  0,  1601,    KARTIKA,      14,  SUN,   0,  0,  0},
    357        {2334639.5,  0,  1601,    AGRAHAYANA,   13,  MON,   0,  0,  0},
    358        {2334668.5,  0,  1601,    PAUSA,        12,  TUE,   0,  0,  0},
    359        {2334698.5,  0,  1601,    MAGHA,        12,  THU,   0,  0,  0},
    360        {2334728.5,  0,  1601,    PHALGUNA,     12,  SAT,   0,  0,  0},
    361        {2334757.5,  0,  1602,    CHAITRA,      11,  SUN,   0,  0,  0},
    362        {2334787.5,  0,  1602,    VAISAKHA,     10,  TUE,   0,  0,  0},
    363        {2334816.5,  0,  1602,    JYAISTHA,      8,  WED,   0,  0,  0},
    364        {2334846.5,  0,  1602,    ASADHA,        7,  FRI,   0,  0,  0},
    365        {2334848.5,  0,  1602,    ASADHA,        9,  SUN,   0,  0,  0},
    366        {2348020.5,  0,  1638,    SRAVANA,       2,  FRI,   0,  0,  0},
    367        {2334934.5,  0,  1602,    ASVINA,        2,  TUE,   0,  0,  0},
    368        {2366978.5,  0,  1690,    JYAISTHA,     29,  SUN,   0,  0,  0},
    369        {2385648.5,  0,  1741,    SRAVANA,      11,  MON,   0,  0,  0},
    370        {2392825.5,  0,  1761,    CHAITRA,       6,  WED,   0,  0,  0},
    371        {2416223.5,  0,  1825,    CHAITRA,      29,  SUN,   0,  0,  0},
    372        {2425848.5,  0,  1851,    BHADRA,        3,  SUN,   0,  0,  0},
    373        {2430266.5,  0,  1863,    ASVINA,        7,  MON,   0,  0,  0},
    374        {2430833.5,  0,  1865,    CHAITRA,      29,  MON,   0,  0,  0},
    375        {2431004.5,  0,  1865,    ASVINA,       15,  THU,   0,  0,  0},
    376        {2448698.5,  0,  1913,    PHALGUNA,     27,  TUE,   0,  0,  0},
    377        {2450138.5,  0,  1917,    PHALGUNA,      6,  SUN,   0,  0,  0},
    378        {2465737.5,  0,  1960,    KARTIKA,      19,  WED,   0,  0,  0},
    379        {2486076.5,  0,  2016,    ASADHA,       27,  SUN,   0,  0,  0},
    380         { -1,-1,-1,-1,-1,-1,-1,-1,-1 }
    381     };
    382 
    383     UErrorCode status = U_ZERO_ERROR;
    384     Calendar *c = Calendar::createInstance("hi_IN@calendar=indian", status);
    385     if (failure(status, "Calendar::createInstance", TRUE)) return;
    386     c->setLenient(TRUE);
    387     doTestCases(tests, c);
    388 
    389     delete c;
    390 }
    391 
    392 void CalendarCaseTest::Coptic() {
    393     static const TestCase tests[] = {
    394         //      JD Era  Year  Month  Day WkDay  Hour Min Sec
    395         {2401442.5,  1,  1579,    2,  20,  WED,    0,  0,  0}, // Gregorian: 20/10/1862
    396         {2402422.5,  1,  1581,   10,  29,  WED,    0,  0,  0}, // Gregorian: 05/07/1865
    397         {2402630.5,  1,  1582,    5,  22,  MON,    0,  0,  0}, // Gregorian: 29/01/1866
    398         {2402708.5,  1,  1582,    8,  10,  TUE,    0,  0,  0}, // Gregorian: 17/04/1866
    399         {2402971.5,  1,  1583,    4,  28,  SAT,    0,  0,  0}, // Gregorian: 05/01/1867
    400         {2403344.5,  1,  1584,    5,   5,  MON,    0,  0,  0}, // Gregorian: 13/01/1868
    401         {1721059.5,  0,   285,    5,   7,  SAT,    0,  0,  0}, // Gregorian: 01/01/0000
    402         {1721425.5,  0,   284,    5,   8,  MON,    0,  0,  0}, // Gregorian: 01/01/0001
    403         {1824663.5,  0,     2,   13,   6,  WED,    0,  0,  0}, // Gregorian: 29/08/0283
    404         {1824664.5,  0,     1,    1,   1,  THU,    0,  0,  0}, // Gregorian: 30/08/0283
    405         {1825029.5,  1,     1,    1,   1,  FRI,    0,  0,  0}, // Gregorian: 29/08/0284
    406         {1825394.5,  1,     2,    1,   1,  SAT,    0,  0,  0}, // Gregorian: 29/08/0285
    407         {1825759.5,  1,     3,    1,   1,  SUN,    0,  0,  0}, // Gregorian: 29/08/0286
    408         {1826125.5,  1,     4,    1,   1,  TUE,    0,  0,  0}, // Gregorian: 30/08/0287
    409         {1825028.5,  0,     1,   13,   5,  THU,    0,  0,  0}, // Gregorian: 28/08/0284
    410         {1825393.5,  1,     1,   13,   5,  FRI,    0,  0,  0}, // Gregorian: 28/08/0285
    411         {1825758.5,  1,     2,   13,   5,  SAT,    0,  0,  0}, // Gregorian: 28/08/0286
    412         {1826123.5,  1,     3,   13,   5,  SUN,    0,  0,  0}, // Gregorian: 28/08/0287
    413         {1826124.5,  1,     3,   13,   6,  MON,    0,  0,  0}, // Gregorian: 29/08/0287
    414           // above is first coptic leap year
    415         {1826489.5,  1,     4,   13,   5,  TUE,    0,  0,  0}, // Gregorian: 28/08/0288
    416         {2299158.5,  1,  1299,    2,   6,  WED,    0,  0,  0}, // Gregorian: 13/10/1582
    417         {2299159.5,  1,  1299,    2,   7,  THU,    0,  0,  0}, // Gregorian: 14/10/1582
    418         {2299160.5,  1,  1299,    2,   8,  FRI,    0,  0,  0}, // Gregorian: 15/10/1582
    419         {2299161.5,  1,  1299,    2,   9,  SAT,    0,  0,  0}, // Gregorian: 16/10/1582
    420 
    421         {2415020.5,  1,  1616,    4,  23,  MON,    0,  0,  0}, // Gregorian: 01/01/1900
    422         {2453371.5,  1,  1721,    4,  23,  SAT,    0,  0,  0}, // Gregorian: 01/01/2005
    423         {2555528.5,  1,  2000,   13,   5,  FRI,    0,  0,  0}, // Gregorian: 12/09/2284
    424         {       -1, -1,    -1,   -1,  -1,   -1,   -1, -1, -1}
    425     };
    426 
    427     UErrorCode status = U_ZERO_ERROR;
    428     Calendar *c = Calendar::createInstance("cop_EG@calendar=coptic", status);
    429     if (failure(status, "Calendar::createInstance", TRUE)) return;
    430 
    431     c->setLenient(TRUE);
    432     doTestCases(tests, c);
    433 
    434     delete c;
    435 }
    436 
    437 void CalendarCaseTest::Ethiopic() {
    438     static TestCase tests[] = {
    439         //      JD Era  Year  Month  Day WkDay  Hour Min Sec
    440         {2401442.5,  1,  1855,    2,  20,  WED,    0,  0,  0}, // Gregorian: 29/10/1862
    441         {2402422.5,  1,  1857,   10,  29,  WED,    0,  0,  0}, // Gregorian: 05/07/1865
    442         {2402630.5,  1,  1858,    5,  22,  MON,    0,  0,  0}, // Gregorian: 29/01/1866
    443         {2402708.5,  1,  1858,    8,  10,  TUE,    0,  0,  0}, // Gregorian: 17/04/1866
    444         {2402971.5,  1,  1859,    4,  28,  SAT,    0,  0,  0}, // Gregorian: 05/01/1867
    445         {2403344.5,  1,  1860,    5,   5,  MON,    0,  0,  0}, // Gregorian: 13/01/1868
    446         {1721059.5,  0,  5492,    5,   7,  SAT,    0,  0,  0}, // Gregorian: 01/01/0000
    447         {1721425.5,  0,  5493,    5,   8,  MON,    0,  0,  0}, // Gregorian: 01/01/0001
    448         {1723854.5,  0,  5499,   13,   6,  MON,    0,  0,  0}, // Gregorian: 27/08/0007
    449 
    450         {1723855.5,  0,  5500,    1,   1,  TUE,    0,  0,  0}, // Gregorian: 28/08/0007
    451         {1724220.5,  1,     1,    1,   1,  WED,    0,  0,  0}, // Gregorian: 27/08/0008
    452         {1724585.5,  1,     2,    1,   1,  THU,    0,  0,  0}, // Gregorian: 27/08/0009
    453         {1724950.5,  1,     3,    1,   1,  FRI,    0,  0,  0}, // Gregorian: 27/08/0010
    454 
    455         //{1724536.5,  1,     4,    1,   1,  SUN,    0,  0,  0}, // Gregorian: 28/08/0011
    456         {1725316.5,  1,     4,    1,   1,  SUN,    0,  0,  0}, // Gregorian: 28/08/0011 - dlf
    457         {1724219.5,  0,  5500,   13,   5,  TUE,    0,  0,  0}, // Gregorian: 26/08/0008
    458         {1724584.5,  1,     1,   13,   5,  WED,    0,  0,  0}, // Gregorian: 26/08/0009
    459         {1724949.5,  1,     2,   13,   5,  THU,    0,  0,  0}, // Gregorian: 26/08/0010
    460         {1725314.5,  1,     3,   13,   5,  FRI,    0,  0,  0}, // Gregorian: 26/08/0011
    461         {1725315.5,  1,     3,   13,   6,  SAT,    0,  0,  0}, // Gregorian: 27/08/0011 - first ethiopic leap year
    462         //{1725560.5,  1,     4,   13,   5,  SUN,    0,  0,  0}, // Gregorian: 26/08/0012 - dlf
    463         {1725680.5,  1,     4,   13,   5,  SUN,    0,  0,  0}, // Gregorian: 26/08/0012
    464         {2299158.5,  1,  1575,    2,   6,  WED,    0,  0,  0}, // Gregorian: 13/10/1582
    465         {2299159.5,  1,  1575,    2,   7,  THU,    0,  0,  0}, // Gregorian: 14/10/1582  Julian 04/10/1582
    466 
    467         {2299160.5,  1,  1575,    2,   8,  FRI,    0,  0,  0}, // Gregorian: 15/10/1582
    468         {2299161.5,  1,  1575,    2,   9,  SAT,    0,  0,  0}, // Gregorian: 16/10/1582
    469 
    470         {2415020.5,  1,  1892,    4,  23,  MON,    0,  0,  0}, // Gregorian: 01/01/1900
    471         {2453371.5,  1,  1997,    4,  23,  SAT,    0,  0,  0}, // Gregorian: 01/01/2005
    472         {2454719.5,  1,  2000,   13,   5,  WED,    0,  0,  0}, // Gregorian: 10/09/2008
    473         {       -1, -1,    -1,   -1,  -1,   -1,   -1, -1, -1}
    474     };
    475 
    476     UErrorCode status = U_ZERO_ERROR;
    477     Calendar *c = Calendar::createInstance("am_ET@calendar=ethiopic", status);
    478     if (failure(status, "Calendar::createInstance", TRUE)) return;
    479     c->setLenient(TRUE);
    480     doTestCases(tests, c);
    481 
    482     delete c;
    483 
    484     // Testing Amete Alem mode
    485     int32_t i;
    486     TestCase *tcase = tests;
    487     for (i = 0; tcase[i].era >= 0; i++) {
    488         if (tcase[i].era == 1) {
    489             tcase[i].era = 0; // Change to Amete Alem era
    490             tcase[i].year += 5500; // Amete Mihret 1 = Amete Alem 5501
    491         }
    492     }
    493     c = Calendar::createInstance("am_ET@calendar=ethiopic-amete-alem", status);
    494     if (failure(status, "Calendar::createInstance", TRUE)) return;
    495     c->setLenient(TRUE);
    496     doTestCases(tests, c);
    497 
    498     delete c;
    499 }
    500 
    501 
    502 #endif
    503