Home | History | Annotate | Download | only in intltest
      1 /************************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 1997-2011, International Business Machines Corporation
      4  * and others. All Rights Reserved.
      5  ************************************************************************/
      6 
      7 #include "unicode/utypes.h"
      8 
      9 #if !UCONFIG_NO_FORMATTING
     10 
     11 #include "caltest.h"
     12 #include "unicode/dtfmtsym.h"
     13 #include "unicode/gregocal.h"
     14 #include "hebrwcal.h"
     15 #include "unicode/smpdtfmt.h"
     16 #include "unicode/simpletz.h"
     17 #include "dbgutil.h"
     18 #include "unicode/udat.h"
     19 #include "unicode/ustring.h"
     20 #include "cstring.h"
     21 
     22 #define mkcstr(U) u_austrcpy(calloc(8, u_strlen(U) + 1), U)
     23 
     24 // *****************************************************************************
     25 // class CalendarTest
     26 // *****************************************************************************
     27 
     28 UnicodeString CalendarTest::calToStr(const Calendar & cal)
     29 {
     30   UnicodeString out;
     31   UErrorCode status = U_ZERO_ERROR;
     32   int i;
     33   UDate d;
     34   for(i = 0;i<UCAL_FIELD_COUNT;i++) {
     35     out += (UnicodeString("") + fieldName((UCalendarDateFields)i) + "=" +  cal.get((UCalendarDateFields)i, status) + UnicodeString(" "));
     36   }
     37   out += "[" + UnicodeString(cal.getType()) + "]";
     38 
     39   if(cal.inDaylightTime(status)) {
     40     out += UnicodeString(" (in DST), zone=");
     41   }
     42   else {
     43     out += UnicodeString(", zone=");
     44   }
     45 
     46   UnicodeString str2;
     47   out += cal.getTimeZone().getDisplayName(str2);
     48   d = cal.getTime(status);
     49   out += UnicodeString(" :","") + d;
     50 
     51   return out;
     52 }
     53 
     54 void CalendarTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
     55 {
     56     if (exec) logln("TestSuite TestCalendar");
     57     switch (index) {
     58         case 0:
     59             name = "TestDOW943";
     60             if (exec) {
     61                 logln("TestDOW943---"); logln("");
     62                 TestDOW943();
     63             }
     64             break;
     65         case 1:
     66             name = "TestClonesUnique908";
     67             if (exec) {
     68                 logln("TestClonesUnique908---"); logln("");
     69                 TestClonesUnique908();
     70             }
     71             break;
     72         case 2:
     73             name = "TestGregorianChange768";
     74             if (exec) {
     75                 logln("TestGregorianChange768---"); logln("");
     76                 TestGregorianChange768();
     77             }
     78             break;
     79         case 3:
     80             name = "TestDisambiguation765";
     81             if (exec) {
     82                 logln("TestDisambiguation765---"); logln("");
     83                 TestDisambiguation765();
     84             }
     85             break;
     86         case 4:
     87             name = "TestGMTvsLocal4064654";
     88             if (exec) {
     89                 logln("TestGMTvsLocal4064654---"); logln("");
     90                 TestGMTvsLocal4064654();
     91             }
     92             break;
     93         case 5:
     94             name = "TestAddSetOrder621";
     95             if (exec) {
     96                 logln("TestAddSetOrder621---"); logln("");
     97                 TestAddSetOrder621();
     98             }
     99             break;
    100         case 6:
    101             name = "TestAdd520";
    102             if (exec) {
    103                 logln("TestAdd520---"); logln("");
    104                 TestAdd520();
    105             }
    106             break;
    107         case 7:
    108             name = "TestFieldSet4781";
    109             if (exec) {
    110                 logln("TestFieldSet4781---"); logln("");
    111                 TestFieldSet4781();
    112             }
    113             break;
    114         case 8:
    115             name = "TestSerialize337";
    116             if (exec) {
    117                 logln("TestSerialize337---"); logln("");
    118             //  TestSerialize337();
    119             }
    120             break;
    121         case 9:
    122             name = "TestSecondsZero121";
    123             if (exec) {
    124                 logln("TestSecondsZero121---"); logln("");
    125                 TestSecondsZero121();
    126             }
    127             break;
    128         case 10:
    129             name = "TestAddSetGet0610";
    130             if (exec) {
    131                 logln("TestAddSetGet0610---"); logln("");
    132                 TestAddSetGet0610();
    133             }
    134             break;
    135         case 11:
    136             name = "TestFields060";
    137             if (exec) {
    138                 logln("TestFields060---"); logln("");
    139                 TestFields060();
    140             }
    141             break;
    142         case 12:
    143             name = "TestEpochStartFields";
    144             if (exec) {
    145                 logln("TestEpochStartFields---"); logln("");
    146                 TestEpochStartFields();
    147             }
    148             break;
    149         case 13:
    150             name = "TestDOWProgression";
    151             if (exec) {
    152                 logln("TestDOWProgression---"); logln("");
    153                 TestDOWProgression();
    154             }
    155             break;
    156         case 14:
    157             name = "TestGenericAPI";
    158             if (exec) {
    159                 logln("TestGenericAPI---"); logln("");
    160                 TestGenericAPI();
    161             }
    162             break;
    163         case 15:
    164             name = "TestAddRollExtensive";
    165             if (exec) {
    166                 logln("TestAddRollExtensive---"); logln("");
    167                 TestAddRollExtensive();
    168             }
    169             break;
    170         case 16:
    171             name = "TestDOW_LOCALandYEAR_WOY";
    172             if (exec) {
    173                 logln("TestDOW_LOCALandYEAR_WOY---"); logln("");
    174                 TestDOW_LOCALandYEAR_WOY();
    175             }
    176             break;
    177         case 17:
    178             name = "TestWOY";
    179             if (exec) {
    180                 logln("TestWOY---"); logln("");
    181                 TestWOY();
    182             }
    183             break;
    184         case 18:
    185             name = "TestRog";
    186             if (exec) {
    187                 logln("TestRog---"); logln("");
    188                 TestRog();
    189             }
    190             break;
    191         case 19:
    192            name = "TestYWOY";
    193             if (exec) {
    194                 logln("TestYWOY---"); logln("");
    195                 TestYWOY();
    196             }
    197             break;
    198         case 20:
    199           name = "TestJD";
    200           if(exec) {
    201             logln("TestJD---"); logln("");
    202             TestJD();
    203           }
    204           break;
    205         case 21:
    206           name = "TestDebug";
    207           if(exec) {
    208             logln("TestDebug---"); logln("");
    209             TestDebug();
    210           }
    211           break;
    212         case 22:
    213           name = "Test6703";
    214           if(exec) {
    215             logln("Test6703---"); logln("");
    216             Test6703();
    217           }
    218           break;
    219         case 23:
    220           name = "Test3785";
    221           if(exec) {
    222             logln("Test3785---"); logln("");
    223             Test3785();
    224           }
    225           break;
    226         case 24:
    227           name = "Test1624";
    228           if(exec) {
    229             logln("Test1624---"); logln("");
    230             Test1624();
    231           }
    232           break;
    233         case 25:
    234           name = "TestTimeStamp";
    235           if(exec) {
    236             logln("TestTimeStamp---"); logln("");
    237             TestTimeStamp();
    238           }
    239           break;
    240         case 26:
    241           name = "TestISO8601";
    242           if(exec) {
    243             logln("TestISO8601---"); logln("");
    244             TestISO8601();
    245           }
    246           break;
    247         default: name = ""; break;
    248     }
    249 }
    250 
    251 // ---------------------------------------------------------------------------------
    252 
    253 UnicodeString CalendarTest::fieldName(UCalendarDateFields f) {
    254     switch (f) {
    255 #define FIELD_NAME_STR(x) case x: return (#x+5)
    256       FIELD_NAME_STR( UCAL_ERA );
    257       FIELD_NAME_STR( UCAL_YEAR );
    258       FIELD_NAME_STR( UCAL_MONTH );
    259       FIELD_NAME_STR( UCAL_WEEK_OF_YEAR );
    260       FIELD_NAME_STR( UCAL_WEEK_OF_MONTH );
    261       FIELD_NAME_STR( UCAL_DATE );
    262       FIELD_NAME_STR( UCAL_DAY_OF_YEAR );
    263       FIELD_NAME_STR( UCAL_DAY_OF_WEEK );
    264       FIELD_NAME_STR( UCAL_DAY_OF_WEEK_IN_MONTH );
    265       FIELD_NAME_STR( UCAL_AM_PM );
    266       FIELD_NAME_STR( UCAL_HOUR );
    267       FIELD_NAME_STR( UCAL_HOUR_OF_DAY );
    268       FIELD_NAME_STR( UCAL_MINUTE );
    269       FIELD_NAME_STR( UCAL_SECOND );
    270       FIELD_NAME_STR( UCAL_MILLISECOND );
    271       FIELD_NAME_STR( UCAL_ZONE_OFFSET );
    272       FIELD_NAME_STR( UCAL_DST_OFFSET );
    273       FIELD_NAME_STR( UCAL_YEAR_WOY );
    274       FIELD_NAME_STR( UCAL_DOW_LOCAL );
    275       FIELD_NAME_STR( UCAL_EXTENDED_YEAR );
    276       FIELD_NAME_STR( UCAL_JULIAN_DAY );
    277       FIELD_NAME_STR( UCAL_MILLISECONDS_IN_DAY );
    278 #undef FIELD_NAME_STR
    279     default:
    280         return UnicodeString("") + ((int32_t)f);
    281     }
    282 }
    283 
    284 /**
    285  * Test various API methods for API completeness.
    286  */
    287 void
    288 CalendarTest::TestGenericAPI()
    289 {
    290     UErrorCode status = U_ZERO_ERROR;
    291     UDate d;
    292     UnicodeString str;
    293     UBool eq = FALSE,b4 = FALSE,af = FALSE;
    294 
    295     UDate when = date(90, UCAL_APRIL, 15);
    296 
    297     UnicodeString tzid("TestZone");
    298     int32_t tzoffset = 123400;
    299 
    300     SimpleTimeZone *zone = new SimpleTimeZone(tzoffset, tzid);
    301     Calendar *cal = Calendar::createInstance(zone->clone(), status);
    302     if (failure(status, "Calendar::createInstance", TRUE)) return;
    303 
    304     if (*zone != cal->getTimeZone()) errln("FAIL: Calendar::getTimeZone failed");
    305 
    306     Calendar *cal2 = Calendar::createInstance(cal->getTimeZone(), status);
    307     if (failure(status, "Calendar::createInstance")) return;
    308     cal->setTime(when, status);
    309     cal2->setTime(when, status);
    310     if (failure(status, "Calendar::setTime")) return;
    311 
    312     if (!(*cal == *cal2)) errln("FAIL: Calendar::operator== failed");
    313     if ((*cal != *cal2))  errln("FAIL: Calendar::operator!= failed");
    314     if (!cal->equals(*cal2, status) ||
    315         cal->before(*cal2, status) ||
    316         cal->after(*cal2, status) ||
    317         U_FAILURE(status)) errln("FAIL: equals/before/after failed");
    318 
    319     logln(UnicodeString("cal=")  +cal->getTime(status)  + UnicodeString(calToStr(*cal)));
    320     logln(UnicodeString("cal2=")  +cal2->getTime(status)  + UnicodeString(calToStr(*cal2)));
    321     logln("cal2->setTime(when+1000)");
    322     cal2->setTime(when + 1000, status);
    323     logln(UnicodeString("cal2=")  +cal2->getTime(status)  + UnicodeString(calToStr(*cal2)));
    324 
    325     if (failure(status, "Calendar::setTime")) return;
    326     if (cal->equals(*cal2, status) ||
    327         cal2->before(*cal, status) ||
    328         cal->after(*cal2, status) ||
    329         U_FAILURE(status)) errln("FAIL: equals/before/after failed after setTime(+1000)");
    330 
    331     logln("cal->roll(UCAL_SECOND)");
    332     cal->roll(UCAL_SECOND, (UBool) TRUE, status);
    333     logln(UnicodeString("cal=")  +cal->getTime(status)  + UnicodeString(calToStr(*cal)));
    334     cal->roll(UCAL_SECOND, (int32_t)0, status);
    335     logln(UnicodeString("cal=")  +cal->getTime(status)  + UnicodeString(calToStr(*cal)));
    336     if (failure(status, "Calendar::roll")) return;
    337 
    338     if (!(eq=cal->equals(*cal2, status)) ||
    339         (b4=cal->before(*cal2, status)) ||
    340         (af=cal->after(*cal2, status)) ||
    341         U_FAILURE(status)) {
    342       errln("FAIL: equals[%c]/before[%c]/after[%c] failed after roll 1 second [should be T/F/F]",
    343             eq?'T':'F',
    344             b4?'T':'F',
    345             af?'T':'F');
    346       logln(UnicodeString("cal=")  +cal->getTime(status)  + UnicodeString(calToStr(*cal)));
    347       logln(UnicodeString("cal2=")  +cal2->getTime(status)  + UnicodeString(calToStr(*cal2)));
    348     }
    349 
    350     // Roll back to January
    351     cal->roll(UCAL_MONTH, (int32_t)(1 + UCAL_DECEMBER - cal->get(UCAL_MONTH, status)), status);
    352     if (failure(status, "Calendar::roll")) return;
    353     if (cal->equals(*cal2, status) ||
    354         cal2->before(*cal, status) ||
    355         cal->after(*cal2, status) ||
    356         U_FAILURE(status)) errln("FAIL: equals/before/after failed after rollback to January");
    357 
    358     TimeZone *z = cal->orphanTimeZone();
    359     if (z->getID(str) != tzid ||
    360         z->getRawOffset() != tzoffset)
    361         errln("FAIL: orphanTimeZone failed");
    362 
    363     int32_t i;
    364     for (i=0; i<2; ++i)
    365     {
    366         UBool lenient = ( i > 0 );
    367         cal->setLenient(lenient);
    368         if (lenient != cal->isLenient()) errln("FAIL: setLenient/isLenient failed");
    369         // Later: Check for lenient behavior
    370     }
    371 
    372     for (i=UCAL_SUNDAY; i<=UCAL_SATURDAY; ++i)
    373     {
    374         cal->setFirstDayOfWeek((UCalendarDaysOfWeek)i);
    375         if (cal->getFirstDayOfWeek() != i) errln("FAIL: set/getFirstDayOfWeek failed");
    376         UErrorCode aStatus = U_ZERO_ERROR;
    377         if (cal->getFirstDayOfWeek(aStatus) != i || U_FAILURE(aStatus)) errln("FAIL: getFirstDayOfWeek(status) failed");
    378     }
    379 
    380     for (i=1; i<=7; ++i)
    381     {
    382         cal->setMinimalDaysInFirstWeek((uint8_t)i);
    383         if (cal->getMinimalDaysInFirstWeek() != i) errln("FAIL: set/getFirstDayOfWeek failed");
    384     }
    385 
    386     for (i=0; i<UCAL_FIELD_COUNT; ++i)
    387     {
    388         if (cal->getMinimum((UCalendarDateFields)i) > cal->getGreatestMinimum((UCalendarDateFields)i))
    389             errln("FAIL: getMinimum larger than getGreatestMinimum for field " + i);
    390         if (cal->getLeastMaximum((UCalendarDateFields)i) > cal->getMaximum((UCalendarDateFields)i))
    391             errln("FAIL: getLeastMaximum larger than getMaximum for field " + i);
    392         if (cal->getMinimum((UCalendarDateFields)i) >= cal->getMaximum((UCalendarDateFields)i))
    393             errln("FAIL: getMinimum not less than getMaximum for field " + i);
    394     }
    395 
    396     cal->adoptTimeZone(TimeZone::createDefault());
    397     cal->clear();
    398     cal->set(1984, 5, 24);
    399     if (cal->getTime(status) != date(84, 5, 24) || U_FAILURE(status))
    400         errln("FAIL: Calendar::set(3 args) failed");
    401 
    402     cal->clear();
    403     cal->set(1985, 3, 2, 11, 49);
    404     if (cal->getTime(status) != date(85, 3, 2, 11, 49) || U_FAILURE(status))
    405         errln("FAIL: Calendar::set(5 args) failed");
    406 
    407     cal->clear();
    408     cal->set(1995, 9, 12, 1, 39, 55);
    409     if (cal->getTime(status) != date(95, 9, 12, 1, 39, 55) || U_FAILURE(status))
    410         errln("FAIL: Calendar::set(6 args) failed");
    411 
    412     cal->getTime(status);
    413     if (failure(status, "Calendar::getTime")) return;
    414     for (i=0; i<UCAL_FIELD_COUNT; ++i)
    415     {
    416         switch(i) {
    417             case UCAL_YEAR: case UCAL_MONTH: case UCAL_DATE:
    418             case UCAL_HOUR_OF_DAY: case UCAL_MINUTE: case UCAL_SECOND:
    419             case UCAL_EXTENDED_YEAR:
    420               if (!cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::isSet F, should be T " + fieldName((UCalendarDateFields)i));
    421                 break;
    422             default:
    423               if (cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::isSet = T, should be F  " + fieldName((UCalendarDateFields)i));
    424         }
    425         cal->clear((UCalendarDateFields)i);
    426         if (cal->isSet((UCalendarDateFields)i)) errln("FAIL: Calendar::clear/isSet failed " + fieldName((UCalendarDateFields)i));
    427     }
    428 
    429     if(cal->getActualMinimum(Calendar::SECOND, status) != 0){
    430         errln("Calendar is suppose to return 0 for getActualMinimum");
    431     }
    432 
    433     Calendar *cal3 = Calendar::createInstance(status);
    434     cal3->roll(Calendar::SECOND, (int32_t)0, status);
    435     if (failure(status, "Calendar::roll(EDateFields, int32_t, UErrorCode)")) return;
    436 
    437     delete cal;
    438     delete cal2;
    439     delete cal3;
    440 
    441     int32_t count;
    442     const Locale* loc = Calendar::getAvailableLocales(count);
    443     if (count < 1 || loc == 0)
    444     {
    445         dataerrln("FAIL: getAvailableLocales failed");
    446     }
    447     else
    448     {
    449         for (i=0; i<count; ++i)
    450         {
    451             cal = Calendar::createInstance(loc[i], status);
    452             if (failure(status, "Calendar::createInstance")) return;
    453             delete cal;
    454         }
    455     }
    456 
    457     cal = Calendar::createInstance(TimeZone::createDefault(), Locale::getEnglish(), status);
    458     if (failure(status, "Calendar::createInstance")) return;
    459     delete cal;
    460 
    461     cal = Calendar::createInstance(*zone, Locale::getEnglish(), status);
    462     if (failure(status, "Calendar::createInstance")) return;
    463     delete cal;
    464 
    465     GregorianCalendar *gc = new GregorianCalendar(*zone, status);
    466     if (failure(status, "new GregorianCalendar")) return;
    467     delete gc;
    468 
    469     gc = new GregorianCalendar(Locale::getEnglish(), status);
    470     if (failure(status, "new GregorianCalendar")) return;
    471     delete gc;
    472 
    473     gc = new GregorianCalendar(Locale::getEnglish(), status);
    474     delete gc;
    475 
    476     gc = new GregorianCalendar(*zone, Locale::getEnglish(), status);
    477     if (failure(status, "new GregorianCalendar")) return;
    478     delete gc;
    479 
    480     gc = new GregorianCalendar(zone, status);
    481     if (failure(status, "new GregorianCalendar")) return;
    482     delete gc;
    483 
    484     gc = new GregorianCalendar(1998, 10, 14, 21, 43, status);
    485     if (gc->getTime(status) != (d =date(98, 10, 14, 21, 43) )|| U_FAILURE(status))
    486       errln("FAIL: new GregorianCalendar(ymdhm) failed with " + UnicodeString(u_errorName(status)) + ",  cal="  + gc->getTime(status)  + UnicodeString(calToStr(*gc)) + ", d=" + d);
    487     else
    488       logln(UnicodeString("GOOD: cal=")  +gc->getTime(status)  + UnicodeString(calToStr(*gc)) + ", d=" + d);
    489     delete gc;
    490 
    491     gc = new GregorianCalendar(1998, 10, 14, 21, 43, 55, status);
    492     if (gc->getTime(status) != (d=date(98, 10, 14, 21, 43, 55)) || U_FAILURE(status))
    493       errln("FAIL: new GregorianCalendar(ymdhms) failed with " + UnicodeString(u_errorName(status)));
    494 
    495     GregorianCalendar gc2(Locale::getEnglish(), status);
    496     if (failure(status, "new GregorianCalendar")) return;
    497     gc2 = *gc;
    498     if (gc2 != *gc || !(gc2 == *gc)) errln("FAIL: GregorianCalendar assignment/operator==/operator!= failed");
    499     delete gc;
    500     delete z;
    501 
    502     /* Code coverage for Calendar class. */
    503     cal = Calendar::createInstance(status);
    504     if (failure(status, "Calendar::createInstance")) {
    505         return;
    506     }else {
    507         ((Calendar *)cal)->roll(UCAL_HOUR, (int32_t)100, status);
    508         ((Calendar *)cal)->clear(UCAL_HOUR);
    509 #if !UCONFIG_NO_SERVICE
    510         URegistryKey key = cal->registerFactory(NULL, status);
    511         cal->unregister(key, status);
    512 #endif
    513     }
    514     delete cal;
    515 
    516     status = U_ZERO_ERROR;
    517     cal = Calendar::createInstance(Locale("he_IL@calendar=hebrew"), status);
    518     if (failure(status, "Calendar::createInstance")) {
    519         return;
    520     } else {
    521         cal->roll(Calendar::MONTH, (int32_t)100, status);
    522     }
    523 
    524     StringEnumeration *en = Calendar::getKeywordValuesForLocale(NULL, Locale::getDefault(),FALSE, status);
    525     if (en == NULL || U_FAILURE(status)) {
    526         dataerrln("FAIL: getKeywordValuesForLocale for Calendar. : %s", u_errorName(status));
    527     }
    528     delete en;
    529     delete cal;
    530 }
    531 
    532 // -------------------------------------
    533 
    534 /**
    535  * This test confirms the correct behavior of add when incrementing
    536  * through subsequent days.
    537  */
    538 void
    539 CalendarTest::TestRog()
    540 {
    541     UErrorCode status = U_ZERO_ERROR;
    542     GregorianCalendar* gc = new GregorianCalendar(status);
    543     if (failure(status, "new GregorianCalendar", TRUE)) return;
    544     int32_t year = 1997, month = UCAL_APRIL, date = 1;
    545     gc->set(year, month, date);
    546     gc->set(UCAL_HOUR_OF_DAY, 23);
    547     gc->set(UCAL_MINUTE, 0);
    548     gc->set(UCAL_SECOND, 0);
    549     gc->set(UCAL_MILLISECOND, 0);
    550     for (int32_t i = 0; i < 9; i++, gc->add(UCAL_DATE, 1, status)) {
    551         if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
    552         if (gc->get(UCAL_YEAR, status) != year ||
    553             gc->get(UCAL_MONTH, status) != month ||
    554             gc->get(UCAL_DATE, status) != (date + i)) errln("FAIL: Date wrong");
    555         if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
    556     }
    557     delete gc;
    558 }
    559 
    560 // -------------------------------------
    561 
    562 /**
    563  * Test the handling of the day of the week, checking for correctness and
    564  * for correct minimum and maximum values.
    565  */
    566 void
    567 CalendarTest::TestDOW943()
    568 {
    569     dowTest(FALSE);
    570     dowTest(TRUE);
    571 }
    572 
    573 void CalendarTest::dowTest(UBool lenient)
    574 {
    575     UErrorCode status = U_ZERO_ERROR;
    576     GregorianCalendar* cal = new GregorianCalendar(status);
    577     if (failure(status, "new GregorianCalendar", TRUE)) return;
    578     logln("cal - Aug 12, 1997\n");
    579     cal->set(1997, UCAL_AUGUST, 12);
    580     cal->getTime(status);
    581     if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
    582     logln((lenient?UnicodeString("LENIENT0: "):UnicodeString("nonlenient0: ")) + UnicodeString(calToStr(*cal)));
    583     cal->setLenient(lenient);
    584     logln("cal - Dec 1, 1996\n");
    585     cal->set(1996, UCAL_DECEMBER, 1);
    586     logln((lenient?UnicodeString("LENIENT: "):UnicodeString("nonlenient: ")) + UnicodeString(calToStr(*cal)));
    587     int32_t dow = cal->get(UCAL_DAY_OF_WEEK, status);
    588     if (U_FAILURE(status)) { errln("Calendar::get failed [%s]", u_errorName(status)); return; }
    589     int32_t min = cal->getMinimum(UCAL_DAY_OF_WEEK);
    590     int32_t max = cal->getMaximum(UCAL_DAY_OF_WEEK);
    591     if (dow < min ||
    592         dow > max) errln(UnicodeString("FAIL: Day of week ") + (int32_t)dow + " out of range");
    593     if (dow != UCAL_SUNDAY) errln("FAIL: Day of week should be SUNDAY[%d] not %d", UCAL_SUNDAY, dow);
    594     if (min != UCAL_SUNDAY ||
    595         max != UCAL_SATURDAY) errln("FAIL: Min/max bad");
    596     delete cal;
    597 }
    598 
    599 // -------------------------------------
    600 
    601 /**
    602  * Confirm that cloned Calendar objects do not inadvertently share substructures.
    603  */
    604 void
    605 CalendarTest::TestClonesUnique908()
    606 {
    607     UErrorCode status = U_ZERO_ERROR;
    608     Calendar *c = Calendar::createInstance(status);
    609     if (failure(status, "Calendar::createInstance", TRUE)) return;
    610     Calendar *d = (Calendar*) c->clone();
    611     c->set(UCAL_MILLISECOND, 123);
    612     d->set(UCAL_MILLISECOND, 456);
    613     if (c->get(UCAL_MILLISECOND, status) != 123 ||
    614         d->get(UCAL_MILLISECOND, status) != 456) {
    615         errln("FAIL: Clones share fields");
    616     }
    617     if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
    618     delete c;
    619     delete d;
    620 }
    621 
    622 // -------------------------------------
    623 
    624 /**
    625  * Confirm that the Gregorian cutoff value works as advertised.
    626  */
    627 void
    628 CalendarTest::TestGregorianChange768()
    629 {
    630     UBool b;
    631     UErrorCode status = U_ZERO_ERROR;
    632     UnicodeString str;
    633     GregorianCalendar* c = new GregorianCalendar(status);
    634     if (failure(status, "new GregorianCalendar", TRUE)) return;
    635     logln(UnicodeString("With cutoff ") + dateToString(c->getGregorianChange(), str));
    636     b = c->isLeapYear(1800);
    637     logln(UnicodeString(" isLeapYear(1800) = ") + (b ? "true" : "false"));
    638     logln(UnicodeString(" (should be FALSE)"));
    639     if (b) errln("FAIL");
    640     c->setGregorianChange(date(0, 0, 1), status);
    641     if (U_FAILURE(status)) { errln("GregorianCalendar::setGregorianChange failed"); return; }
    642     logln(UnicodeString("With cutoff ") + dateToString(c->getGregorianChange(), str));
    643     b = c->isLeapYear(1800);
    644     logln(UnicodeString(" isLeapYear(1800) = ") + (b ? "true" : "false"));
    645     logln(UnicodeString(" (should be TRUE)"));
    646     if (!b) errln("FAIL");
    647     delete c;
    648 }
    649 
    650 // -------------------------------------
    651 
    652 /**
    653  * Confirm the functioning of the field disambiguation algorithm.
    654  */
    655 void
    656 CalendarTest::TestDisambiguation765()
    657 {
    658     UErrorCode status = U_ZERO_ERROR;
    659     Calendar *c = Calendar::createInstance("en_US", status);
    660     if (failure(status, "Calendar::createInstance", TRUE)) return;
    661     c->setLenient(FALSE);
    662     c->clear();
    663     c->set(UCAL_YEAR, 1997);
    664     c->set(UCAL_MONTH, UCAL_JUNE);
    665     c->set(UCAL_DATE, 3);
    666     verify765("1997 third day of June = ", c, 1997, UCAL_JUNE, 3);
    667     c->clear();
    668     c->set(UCAL_YEAR, 1997);
    669     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    670     c->set(UCAL_MONTH, UCAL_JUNE);
    671     c->set(UCAL_DAY_OF_WEEK_IN_MONTH, 1);
    672     verify765("1997 first Tuesday in June = ", c, 1997, UCAL_JUNE, 3);
    673     c->clear();
    674     c->set(UCAL_YEAR, 1997);
    675     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    676     c->set(UCAL_MONTH, UCAL_JUNE);
    677     c->set(UCAL_DAY_OF_WEEK_IN_MONTH, - 1);
    678     verify765("1997 last Tuesday in June = ", c, 1997, UCAL_JUNE, 24);
    679 
    680     status = U_ZERO_ERROR;
    681     c->clear();
    682     c->set(UCAL_YEAR, 1997);
    683     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    684     c->set(UCAL_MONTH, UCAL_JUNE);
    685     c->set(UCAL_DAY_OF_WEEK_IN_MONTH, 0);
    686     c->getTime(status);
    687     verify765("1997 zero-th Tuesday in June = ", status);
    688 
    689     c->clear();
    690     c->set(UCAL_YEAR, 1997);
    691     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    692     c->set(UCAL_MONTH, UCAL_JUNE);
    693     c->set(UCAL_WEEK_OF_MONTH, 1);
    694     verify765("1997 Tuesday in week 1 of June = ", c, 1997, UCAL_JUNE, 3);
    695     c->clear();
    696     c->set(UCAL_YEAR, 1997);
    697     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    698     c->set(UCAL_MONTH, UCAL_JUNE);
    699     c->set(UCAL_WEEK_OF_MONTH, 5);
    700     verify765("1997 Tuesday in week 5 of June = ", c, 1997, UCAL_JULY, 1);
    701 
    702     status = U_ZERO_ERROR;
    703     c->clear();
    704     c->set(UCAL_YEAR, 1997);
    705     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    706     c->set(UCAL_MONTH, UCAL_JUNE);
    707     c->set(UCAL_WEEK_OF_MONTH, 0);
    708     c->setMinimalDaysInFirstWeek(1);
    709     c->getTime(status);
    710     verify765("1997 Tuesday in week 0 of June = ", status);
    711 
    712     /* Note: The following test used to expect YEAR 1997, WOY 1 to
    713      * resolve to a date in Dec 1996; that is, to behave as if
    714      * YEAR_WOY were 1997.  With the addition of a new explicit
    715      * YEAR_WOY field, YEAR_WOY must itself be set if that is what is
    716      * desired.  Using YEAR in combination with WOY is ambiguous, and
    717      * results in the first WOY/DOW day of the year satisfying the
    718      * given fields (there may be up to two such days). In this case,
    719      * it propertly resolves to Tue Dec 30 1997, which has a WOY value
    720      * of 1 (for YEAR_WOY 1998) and a DOW of Tuesday, and falls in the
    721      * _calendar_ year 1997, as specified. - aliu */
    722     c->clear();
    723     c->set(UCAL_YEAR_WOY, 1997); // aliu
    724     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    725     c->set(UCAL_WEEK_OF_YEAR, 1);
    726     verify765("1997 Tuesday in week 1 of yearWOY = ", c, 1996, UCAL_DECEMBER, 31);
    727     c->clear(); // - add test for YEAR
    728     c->setMinimalDaysInFirstWeek(1);
    729     c->set(UCAL_YEAR, 1997);
    730     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    731     c->set(UCAL_WEEK_OF_YEAR, 1);
    732     verify765("1997 Tuesday in week 1 of year = ", c, 1997, UCAL_DECEMBER, 30);
    733     c->clear();
    734     c->set(UCAL_YEAR, 1997);
    735     c->set(UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
    736     c->set(UCAL_WEEK_OF_YEAR, 10);
    737     verify765("1997 Tuesday in week 10 of year = ", c, 1997, UCAL_MARCH, 4);
    738     //try {
    739 
    740     // {sfb} week 0 is no longer a valid week of year
    741     /*c->clear();
    742     c->set(Calendar::YEAR, 1997);
    743     c->set(Calendar::DAY_OF_WEEK, Calendar::TUESDAY);
    744     //c->set(Calendar::WEEK_OF_YEAR, 0);
    745     c->set(Calendar::WEEK_OF_YEAR, 1);
    746     verify765("1997 Tuesday in week 0 of year = ", c, 1996, Calendar::DECEMBER, 24);*/
    747 
    748     //}
    749     //catch(IllegalArgumentException ex) {
    750     //    errln("FAIL: Exception seen:");
    751     //    ex.printStackTrace(log);
    752     //}
    753     delete c;
    754 }
    755 
    756 // -------------------------------------
    757 
    758 void
    759 CalendarTest::verify765(const UnicodeString& msg, Calendar* c, int32_t year, int32_t month, int32_t day)
    760 {
    761     UnicodeString str;
    762     UErrorCode status = U_ZERO_ERROR;
    763     int32_t y = c->get(UCAL_YEAR, status);
    764     int32_t m = c->get(UCAL_MONTH, status);
    765     int32_t d = c->get(UCAL_DATE, status);
    766     if ( y == year &&
    767          m == month &&
    768          d == day) {
    769         if (U_FAILURE(status)) { errln("FAIL: Calendar::get failed"); return; }
    770         logln("PASS: " + msg + dateToString(c->getTime(status), str));
    771         if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
    772     }
    773     else {
    774         errln("FAIL: " + msg + dateToString(c->getTime(status), str) + "; expected " + (int32_t)year + "/" + (int32_t)(month + 1) + "/" + (int32_t)day +
    775             "; got " + (int32_t)y + "/" + (int32_t)(m + 1) + "/" + (int32_t)d + " for Locale: " + c->getLocaleID(ULOC_ACTUAL_LOCALE,status));
    776         if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
    777     }
    778 }
    779 
    780 // -------------------------------------
    781 
    782 void
    783 CalendarTest::verify765(const UnicodeString& msg/*, IllegalArgumentException e*/, UErrorCode status)
    784 {
    785     if (status != U_ILLEGAL_ARGUMENT_ERROR) errln("FAIL: No IllegalArgumentException for " + msg);
    786     else logln("PASS: " + msg + "IllegalArgument as expected");
    787 }
    788 
    789 // -------------------------------------
    790 
    791 /**
    792  * Confirm that the offset between local time and GMT behaves as expected.
    793  */
    794 void
    795 CalendarTest::TestGMTvsLocal4064654()
    796 {
    797     test4064654(1997, 1, 1, 12, 0, 0);
    798     test4064654(1997, 4, 16, 18, 30, 0);
    799 }
    800 
    801 // -------------------------------------
    802 
    803 void
    804 CalendarTest::test4064654(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn, int32_t sc)
    805 {
    806     UDate date;
    807     UErrorCode status = U_ZERO_ERROR;
    808     UnicodeString str;
    809     Calendar *gmtcal = Calendar::createInstance(status);
    810     if (failure(status, "Calendar::createInstance", TRUE)) return;
    811     gmtcal->adoptTimeZone(TimeZone::createTimeZone("Africa/Casablanca"));
    812     gmtcal->set(yr, mo - 1, dt, hr, mn, sc);
    813     gmtcal->set(UCAL_MILLISECOND, 0);
    814     date = gmtcal->getTime(status);
    815     if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
    816     logln("date = " + dateToString(date, str));
    817     Calendar *cal = Calendar::createInstance(status);
    818     if (U_FAILURE(status)) { errln("Calendar::createInstance failed"); return; }
    819     cal->setTime(date, status);
    820     if (U_FAILURE(status)) { errln("Calendar::setTime failed"); return; }
    821     int32_t offset = cal->getTimeZone().getOffset((uint8_t)cal->get(UCAL_ERA, status),
    822                                                   cal->get(UCAL_YEAR, status),
    823                                                   cal->get(UCAL_MONTH, status),
    824                                                   cal->get(UCAL_DATE, status),
    825                                                   (uint8_t)cal->get(UCAL_DAY_OF_WEEK, status),
    826                                                   cal->get(UCAL_MILLISECOND, status), status);
    827     if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
    828     logln("offset for " + dateToString(date, str) + "= " + (offset / 1000 / 60 / 60.0) + "hr");
    829     int32_t utc = ((cal->get(UCAL_HOUR_OF_DAY, status) * 60 +
    830                     cal->get(UCAL_MINUTE, status)) * 60 +
    831                    cal->get(UCAL_SECOND, status)) * 1000 +
    832         cal->get(UCAL_MILLISECOND, status) - offset;
    833     if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
    834     int32_t expected = ((hr * 60 + mn) * 60 + sc) * 1000;
    835     if (utc != expected) errln(UnicodeString("FAIL: Discrepancy of ") + (utc - expected) +
    836                                " millis = " + ((utc - expected) / 1000 / 60 / 60.0) + " hr");
    837     delete gmtcal;
    838     delete cal;
    839 }
    840 
    841 // -------------------------------------
    842 
    843 /**
    844  * The operations of adding and setting should not exhibit pathological
    845  * dependence on the order of operations.  This test checks for this.
    846  */
    847 void
    848 CalendarTest::TestAddSetOrder621()
    849 {
    850     UDate d = date(97, 4, 14, 13, 23, 45);
    851     UErrorCode status = U_ZERO_ERROR;
    852     Calendar *cal = Calendar::createInstance(status);
    853     if (failure(status, "Calendar::createInstance", TRUE)) return;
    854 
    855     cal->setTime(d, status);
    856     if (U_FAILURE(status)) {
    857         errln("Calendar::setTime failed");
    858         delete cal;
    859         return;
    860     }
    861     cal->add(UCAL_DATE, - 5, status);
    862     if (U_FAILURE(status)) {
    863         errln("Calendar::add failed");
    864         delete cal;
    865         return;
    866     }
    867     cal->set(UCAL_HOUR_OF_DAY, 0);
    868     cal->set(UCAL_MINUTE, 0);
    869     cal->set(UCAL_SECOND, 0);
    870     UnicodeString s;
    871     dateToString(cal->getTime(status), s);
    872     if (U_FAILURE(status)) {
    873         errln("Calendar::getTime failed");
    874         delete cal;
    875         return;
    876     }
    877     delete cal;
    878 
    879     cal = Calendar::createInstance(status);
    880     if (U_FAILURE(status)) {
    881         errln("Calendar::createInstance failed");
    882         delete cal;
    883         return;
    884     }
    885     cal->setTime(d, status);
    886     if (U_FAILURE(status)) {
    887         errln("Calendar::setTime failed");
    888         delete cal;
    889         return;
    890     }
    891     cal->set(UCAL_HOUR_OF_DAY, 0);
    892     cal->set(UCAL_MINUTE, 0);
    893     cal->set(UCAL_SECOND, 0);
    894     cal->add(UCAL_DATE, - 5, status);
    895     if (U_FAILURE(status)) {
    896         errln("Calendar::add failed");
    897         delete cal;
    898         return;
    899     }
    900     UnicodeString s2;
    901     dateToString(cal->getTime(status), s2);
    902     if (U_FAILURE(status)) {
    903         errln("Calendar::getTime failed");
    904         delete cal;
    905         return;
    906     }
    907     if (s == s2)
    908         logln("Pass: " + s + " == " + s2);
    909     else
    910         errln("FAIL: " + s + " != " + s2);
    911     delete cal;
    912 }
    913 
    914 // -------------------------------------
    915 
    916 /**
    917  * Confirm that adding to various fields works.
    918  */
    919 void
    920 CalendarTest::TestAdd520()
    921 {
    922     int32_t y = 1997, m = UCAL_FEBRUARY, d = 1;
    923     UErrorCode status = U_ZERO_ERROR;
    924     GregorianCalendar *temp = new GregorianCalendar(y, m, d, status);
    925     if (failure(status, "new GregorianCalendar", TRUE)) return;
    926     check520(temp, y, m, d);
    927     temp->add(UCAL_YEAR, 1, status);
    928     if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
    929     y++;
    930     check520(temp, y, m, d);
    931     temp->add(UCAL_MONTH, 1, status);
    932     if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
    933     m++;
    934     check520(temp, y, m, d);
    935     temp->add(UCAL_DATE, 1, status);
    936     if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
    937     d++;
    938     check520(temp, y, m, d);
    939     temp->add(UCAL_DATE, 2, status);
    940     if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
    941     d += 2;
    942     check520(temp, y, m, d);
    943     temp->add(UCAL_DATE, 28, status);
    944     if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
    945     d = 1;++m;
    946     check520(temp, y, m, d);
    947     delete temp;
    948 }
    949 
    950 // -------------------------------------
    951 
    952 /**
    953  * Execute adding and rolling in GregorianCalendar extensively,
    954  */
    955 void
    956 CalendarTest::TestAddRollExtensive()
    957 {
    958     int32_t maxlimit = 40;
    959     int32_t y = 1997, m = UCAL_FEBRUARY, d = 1, hr = 1, min = 1, sec = 0, ms = 0;
    960     UErrorCode status = U_ZERO_ERROR;
    961     GregorianCalendar *temp = new GregorianCalendar(y, m, d, status);
    962     if (failure(status, "new GregorianCalendar", TRUE)) return;
    963 
    964     temp->set(UCAL_HOUR, hr);
    965     temp->set(UCAL_MINUTE, min);
    966     temp->set(UCAL_SECOND, sec);
    967     temp->set(UCAL_MILLISECOND, ms);
    968     temp->setMinimalDaysInFirstWeek(1);
    969 
    970     UCalendarDateFields e;
    971 
    972     logln("Testing GregorianCalendar add...");
    973     e = UCAL_YEAR;
    974     while (e < UCAL_FIELD_COUNT) {
    975         int32_t i;
    976         int32_t limit = maxlimit;
    977         status = U_ZERO_ERROR;
    978         for (i = 0; i < limit; i++) {
    979             temp->add(e, 1, status);
    980             if (U_FAILURE(status)) { limit = i; status = U_ZERO_ERROR; }
    981         }
    982         for (i = 0; i < limit; i++) {
    983             temp->add(e, -1, status);
    984             if (U_FAILURE(status)) { errln("GregorianCalendar::add -1 failed"); return; }
    985         }
    986         check520(temp, y, m, d, hr, min, sec, ms, e);
    987 
    988         e = (UCalendarDateFields) ((int32_t) e + 1);
    989     }
    990 
    991     logln("Testing GregorianCalendar roll...");
    992     e = UCAL_YEAR;
    993     while (e < UCAL_FIELD_COUNT) {
    994         int32_t i;
    995         int32_t limit = maxlimit;
    996         status = U_ZERO_ERROR;
    997         for (i = 0; i < limit; i++) {
    998             logln(calToStr(*temp) + UnicodeString("  " ) + fieldName(e) + UnicodeString("++") );
    999             temp->roll(e, 1, status);
   1000             if (U_FAILURE(status)) {
   1001               logln("caltest.cpp:%d e=%d, i=%d - roll(+) err %s\n",  __LINE__, (int) e, (int) i, u_errorName(status));
   1002               logln(calToStr(*temp));
   1003               limit = i; status = U_ZERO_ERROR;
   1004             }
   1005         }
   1006         for (i = 0; i < limit; i++) {
   1007             logln("caltest.cpp:%d e=%d, i=%d\n",  __LINE__, (int) e, (int) i);
   1008             logln(calToStr(*temp) + UnicodeString("  " ) + fieldName(e) + UnicodeString("--") );
   1009             temp->roll(e, -1, status);
   1010             if (U_FAILURE(status)) { errln(UnicodeString("GregorianCalendar::roll ") + CalendarTest::fieldName(e) + " count=" + UnicodeString('@'+i) + " by -1 failed with " + u_errorName(status) ); return; }
   1011         }
   1012         check520(temp, y, m, d, hr, min, sec, ms, e);
   1013 
   1014         e = (UCalendarDateFields) ((int32_t) e + 1);
   1015     }
   1016 
   1017     delete temp;
   1018 }
   1019 
   1020 // -------------------------------------
   1021 void
   1022 CalendarTest::check520(Calendar* c,
   1023                         int32_t y, int32_t m, int32_t d,
   1024                         int32_t hr, int32_t min, int32_t sec,
   1025                         int32_t ms, UCalendarDateFields field)
   1026 
   1027 {
   1028     UErrorCode status = U_ZERO_ERROR;
   1029     if (c->get(UCAL_YEAR, status) != y ||
   1030         c->get(UCAL_MONTH, status) != m ||
   1031         c->get(UCAL_DATE, status) != d ||
   1032         c->get(UCAL_HOUR, status) != hr ||
   1033         c->get(UCAL_MINUTE, status) != min ||
   1034         c->get(UCAL_SECOND, status) != sec ||
   1035         c->get(UCAL_MILLISECOND, status) != ms) {
   1036         errln(UnicodeString("U_FAILURE for field ") + (int32_t)field +
   1037                 ": Expected y/m/d h:m:s:ms of " +
   1038                 y + "/" + (m + 1) + "/" + d + " " +
   1039               hr + ":" + min + ":" + sec + ":" + ms +
   1040               "; got " + c->get(UCAL_YEAR, status) +
   1041               "/" + (c->get(UCAL_MONTH, status) + 1) +
   1042               "/" + c->get(UCAL_DATE, status) +
   1043               " " + c->get(UCAL_HOUR, status) + ":" +
   1044               c->get(UCAL_MINUTE, status) + ":" +
   1045               c->get(UCAL_SECOND, status) + ":" +
   1046               c->get(UCAL_MILLISECOND, status)
   1047               );
   1048 
   1049         if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
   1050     }
   1051     else
   1052         logln(UnicodeString("Confirmed: ") + y + "/" +
   1053                 (m + 1) + "/" + d + " " +
   1054                 hr + ":" + min + ":" + sec + ":" + ms);
   1055 }
   1056 
   1057 // -------------------------------------
   1058 void
   1059 CalendarTest::check520(Calendar* c,
   1060                         int32_t y, int32_t m, int32_t d)
   1061 
   1062 {
   1063     UErrorCode status = U_ZERO_ERROR;
   1064     if (c->get(UCAL_YEAR, status) != y ||
   1065         c->get(UCAL_MONTH, status) != m ||
   1066         c->get(UCAL_DATE, status) != d) {
   1067         errln(UnicodeString("FAILURE: Expected y/m/d of ") +
   1068               y + "/" + (m + 1) + "/" + d + " " +
   1069               "; got " + c->get(UCAL_YEAR, status) +
   1070               "/" + (c->get(UCAL_MONTH, status) + 1) +
   1071               "/" + c->get(UCAL_DATE, status)
   1072               );
   1073 
   1074         if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
   1075     }
   1076     else
   1077         logln(UnicodeString("Confirmed: ") + y + "/" +
   1078                 (m + 1) + "/" + d);
   1079 }
   1080 
   1081 // -------------------------------------
   1082 
   1083 /**
   1084  * Test that setting of fields works.  In particular, make sure that all instances
   1085  * of GregorianCalendar don't share a static instance of the fields array.
   1086  */
   1087 void
   1088 CalendarTest::TestFieldSet4781()
   1089 {
   1090     // try {
   1091         UErrorCode status = U_ZERO_ERROR;
   1092         GregorianCalendar *g = new GregorianCalendar(status);
   1093         if (failure(status, "new GregorianCalendar", TRUE)) return;
   1094         GregorianCalendar *g2 = new GregorianCalendar(status);
   1095         if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; }
   1096         g2->set(UCAL_HOUR, 12, status);
   1097         g2->set(UCAL_MINUTE, 0, status);
   1098         g2->set(UCAL_SECOND, 0, status);
   1099         if (U_FAILURE(status)) { errln("Calendar::set failed"); return; }
   1100         if (*g == *g2) logln("Same");
   1101         else logln("Different");
   1102     //}
   1103         //catch(IllegalArgumentException e) {
   1104         //errln("Unexpected exception seen: " + e);
   1105     //}
   1106         delete g;
   1107         delete g2;
   1108 }
   1109 
   1110 // -------------------------------------
   1111 
   1112 /* We don't support serialization on C++
   1113 void
   1114 CalendarTest::TestSerialize337()
   1115 {
   1116     Calendar cal = Calendar::getInstance();
   1117     UBool ok = FALSE;
   1118     try {
   1119         FileOutputStream f = new FileOutputStream(FILENAME);
   1120         ObjectOutput s = new ObjectOutputStream(f);
   1121         s.writeObject(PREFIX);
   1122         s.writeObject(cal);
   1123         s.writeObject(POSTFIX);
   1124         f.close();
   1125         FileInputStream in = new FileInputStream(FILENAME);
   1126         ObjectInputStream t = new ObjectInputStream(in);
   1127         UnicodeString& pre = (UnicodeString&) t.readObject();
   1128         Calendar c = (Calendar) t.readObject();
   1129         UnicodeString& post = (UnicodeString&) t.readObject();
   1130         in.close();
   1131         ok = pre.equals(PREFIX) &&
   1132             post.equals(POSTFIX) &&
   1133             cal->equals(c);
   1134         File fl = new File(FILENAME);
   1135         fl.delete();
   1136     }
   1137     catch(IOException e) {
   1138         errln("FAIL: Exception received:");
   1139         e.printStackTrace(log);
   1140     }
   1141     catch(ClassNotFoundException e) {
   1142         errln("FAIL: Exception received:");
   1143         e.printStackTrace(log);
   1144     }
   1145     if (!ok) errln("Serialization of Calendar object failed.");
   1146 }
   1147 
   1148 UnicodeString& CalendarTest::PREFIX = "abc";
   1149 
   1150 UnicodeString& CalendarTest::POSTFIX = "def";
   1151 
   1152 UnicodeString& CalendarTest::FILENAME = "tmp337.bin";
   1153  */
   1154 
   1155 // -------------------------------------
   1156 
   1157 /**
   1158  * Verify that the seconds of a Calendar can be zeroed out through the
   1159  * expected sequence of operations.
   1160  */
   1161 void
   1162 CalendarTest::TestSecondsZero121()
   1163 {
   1164     UErrorCode status = U_ZERO_ERROR;
   1165     Calendar *cal = new GregorianCalendar(status);
   1166     if (failure(status, "new GregorianCalendar", TRUE)) return;
   1167     cal->setTime(Calendar::getNow(), status);
   1168     if (U_FAILURE(status)) { errln("Calendar::setTime failed"); return; }
   1169     cal->set(UCAL_SECOND, 0);
   1170     if (U_FAILURE(status)) { errln("Calendar::set failed"); return; }
   1171     UDate d = cal->getTime(status);
   1172     if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
   1173     UnicodeString s;
   1174     dateToString(d, s);
   1175     if (s.indexOf("DATE_FORMAT_FAILURE") >= 0) {
   1176         dataerrln("Got: \"DATE_FORMAT_FAILURE\".");
   1177     } else if (s.indexOf(":00 ") < 0) {
   1178         errln("Expected to see :00 in " + s);
   1179     }
   1180     delete cal;
   1181 }
   1182 
   1183 // -------------------------------------
   1184 
   1185 /**
   1186  * Verify that a specific sequence of adding and setting works as expected;
   1187  * it should not vary depending on when and whether the get method is
   1188  * called.
   1189  */
   1190 void
   1191 CalendarTest::TestAddSetGet0610()
   1192 {
   1193     UnicodeString EXPECTED_0610("1993/0/5", "");
   1194     UErrorCode status = U_ZERO_ERROR;
   1195     {
   1196         Calendar *calendar = new GregorianCalendar(status);
   1197         if (failure(status, "new GregorianCalendar", TRUE)) return;
   1198         calendar->set(1993, UCAL_JANUARY, 4);
   1199         logln("1A) " + value(calendar));
   1200         calendar->add(UCAL_DATE, 1, status);
   1201         if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
   1202         UnicodeString v = value(calendar);
   1203         logln("1B) " + v);
   1204         logln("--) 1993/0/5");
   1205         if (!(v == EXPECTED_0610)) errln("Expected " + EXPECTED_0610 + "; saw " + v);
   1206         delete calendar;
   1207     }
   1208     {
   1209         Calendar *calendar = new GregorianCalendar(1993, UCAL_JANUARY, 4, status);
   1210         if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; }
   1211         logln("2A) " + value(calendar));
   1212         calendar->add(UCAL_DATE, 1, status);
   1213         if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
   1214         UnicodeString v = value(calendar);
   1215         logln("2B) " + v);
   1216         logln("--) 1993/0/5");
   1217         if (!(v == EXPECTED_0610)) errln("Expected " + EXPECTED_0610 + "; saw " + v);
   1218         delete calendar;
   1219     }
   1220     {
   1221         Calendar *calendar = new GregorianCalendar(1993, UCAL_JANUARY, 4, status);
   1222         if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; }
   1223         logln("3A) " + value(calendar));
   1224         calendar->getTime(status);
   1225         if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
   1226         calendar->add(UCAL_DATE, 1, status);
   1227         if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
   1228         UnicodeString v = value(calendar);
   1229         logln("3B) " + v);
   1230         logln("--) 1993/0/5");
   1231         if (!(v == EXPECTED_0610)) errln("Expected " + EXPECTED_0610 + "; saw " + v);
   1232         delete calendar;
   1233     }
   1234 }
   1235 
   1236 // -------------------------------------
   1237 
   1238 UnicodeString
   1239 CalendarTest::value(Calendar* calendar)
   1240 {
   1241     UErrorCode status = U_ZERO_ERROR;
   1242     return UnicodeString("") + (int32_t)calendar->get(UCAL_YEAR, status) +
   1243         "/" + (int32_t)calendar->get(UCAL_MONTH, status) +
   1244         "/" + (int32_t)calendar->get(UCAL_DATE, status) +
   1245         (U_FAILURE(status) ? " FAIL: Calendar::get failed" : "");
   1246 }
   1247 
   1248 
   1249 // -------------------------------------
   1250 
   1251 /**
   1252  * Verify that various fields on a known date are set correctly.
   1253  */
   1254 void
   1255 CalendarTest::TestFields060()
   1256 {
   1257     UErrorCode status = U_ZERO_ERROR;
   1258     int32_t year = 1997;
   1259     int32_t month = UCAL_OCTOBER;
   1260     int32_t dDate = 22;
   1261     GregorianCalendar *calendar = 0;
   1262     calendar = new GregorianCalendar(year, month, dDate, status);
   1263     if (failure(status, "new GregorianCalendar", TRUE)) return;
   1264     for (int32_t i = 0; i < EXPECTED_FIELDS_length;) {
   1265         UCalendarDateFields field = (UCalendarDateFields)EXPECTED_FIELDS[i++];
   1266         int32_t expected = EXPECTED_FIELDS[i++];
   1267         if (calendar->get(field, status) != expected) {
   1268             errln(UnicodeString("Expected field ") + (int32_t)field + " to have value " + (int32_t)expected +
   1269                   "; received " + (int32_t)calendar->get(field, status) + " instead");
   1270             if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
   1271         }
   1272     }
   1273     delete calendar;
   1274 }
   1275 
   1276 int32_t CalendarTest::EXPECTED_FIELDS[] = {
   1277     UCAL_YEAR, 1997,
   1278     UCAL_MONTH, UCAL_OCTOBER,
   1279     UCAL_DATE, 22,
   1280     UCAL_DAY_OF_WEEK, UCAL_WEDNESDAY,
   1281     UCAL_DAY_OF_WEEK_IN_MONTH, 4,
   1282     UCAL_DAY_OF_YEAR, 295
   1283 };
   1284 
   1285 const int32_t CalendarTest::EXPECTED_FIELDS_length = (int32_t)(sizeof(CalendarTest::EXPECTED_FIELDS) /
   1286     sizeof(CalendarTest::EXPECTED_FIELDS[0]));
   1287 
   1288 // -------------------------------------
   1289 
   1290 /**
   1291  * Verify that various fields on a known date are set correctly.  In this
   1292  * case, the start of the epoch (January 1 1970).
   1293  */
   1294 void
   1295 CalendarTest::TestEpochStartFields()
   1296 {
   1297     UErrorCode status = U_ZERO_ERROR;
   1298     TimeZone *z = TimeZone::createDefault();
   1299     Calendar *c = Calendar::createInstance(status);
   1300     if (failure(status, "Calendar::createInstance", TRUE)) return;
   1301     UDate d = - z->getRawOffset();
   1302     GregorianCalendar *gc = new GregorianCalendar(status);
   1303     if (U_FAILURE(status)) { errln("Couldn't create GregorianCalendar"); return; }
   1304     gc->setTimeZone(*z);
   1305     gc->setTime(d, status);
   1306     if (U_FAILURE(status)) { errln("Calendar::setTime failed"); return; }
   1307     UBool idt = gc->inDaylightTime(status);
   1308     if (U_FAILURE(status)) { errln("GregorianCalendar::inDaylightTime failed"); return; }
   1309     if (idt) {
   1310         UnicodeString str;
   1311         logln("Warning: Skipping test because " + dateToString(d, str) + " is in DST.");
   1312     }
   1313     else {
   1314         c->setTime(d, status);
   1315         if (U_FAILURE(status)) { errln("Calendar::setTime failed"); return; }
   1316         for (int32_t i = 0; i < UCAL_ZONE_OFFSET;++i) {
   1317             if (c->get((UCalendarDateFields)i, status) != EPOCH_FIELDS[i])
   1318                 dataerrln(UnicodeString("Expected field ") + i + " to have value " + EPOCH_FIELDS[i] +
   1319                       "; saw " + c->get((UCalendarDateFields)i, status) + " instead");
   1320             if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
   1321         }
   1322         if (c->get(UCAL_ZONE_OFFSET, status) != z->getRawOffset())
   1323         {
   1324             errln(UnicodeString("Expected field ZONE_OFFSET to have value ") + z->getRawOffset() +
   1325                   "; saw " + c->get(UCAL_ZONE_OFFSET, status) + " instead");
   1326             if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
   1327         }
   1328         if (c->get(UCAL_DST_OFFSET, status) != 0)
   1329         {
   1330             errln(UnicodeString("Expected field DST_OFFSET to have value 0") +
   1331                   "; saw " + c->get(UCAL_DST_OFFSET, status) + " instead");
   1332             if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
   1333         }
   1334     }
   1335     delete c;
   1336     delete z;
   1337     delete gc;
   1338 }
   1339 
   1340 int32_t CalendarTest::EPOCH_FIELDS[] = {
   1341     1, 1970, 0, 1, 1, 1, 1, 5, 1, 0, 0, 0, 0, 0, 0, - 28800000, 0
   1342 };
   1343 
   1344 // -------------------------------------
   1345 
   1346 /**
   1347  * Test that the days of the week progress properly when add is called repeatedly
   1348  * for increments of 24 days.
   1349  */
   1350 void
   1351 CalendarTest::TestDOWProgression()
   1352 {
   1353     UErrorCode status = U_ZERO_ERROR;
   1354     Calendar *cal = new GregorianCalendar(1972, UCAL_OCTOBER, 26, status);
   1355     if (failure(status, "new GregorianCalendar", TRUE)) return;
   1356     marchByDelta(cal, 24);
   1357     delete cal;
   1358 }
   1359 
   1360 // -------------------------------------
   1361 
   1362 void
   1363 CalendarTest::TestDOW_LOCALandYEAR_WOY()
   1364 {
   1365     /* Note: I've commented out the loop_addroll tests for YEAR and
   1366      * YEAR_WOY below because these two fields should NOT behave
   1367      * identically when adding.  YEAR should keep the month/dom
   1368      * invariant.  YEAR_WOY should keep the woy/dow invariant.  I've
   1369      * added a new test that checks for this in place of the old call
   1370      * to loop_addroll. - aliu */
   1371     UErrorCode status = U_ZERO_ERROR;
   1372     int32_t times = 20;
   1373     Calendar *cal=Calendar::createInstance(Locale::getGermany(), status);
   1374     if (failure(status, "Calendar::createInstance", TRUE)) return;
   1375     SimpleDateFormat *sdf=new SimpleDateFormat(UnicodeString("YYYY'-W'ww-ee"), Locale::getGermany(), status);
   1376     if (U_FAILURE(status)) { errcheckln(status, "Couldn't create SimpleDateFormat - %s", u_errorName(status)); return; }
   1377 
   1378     // ICU no longer use localized date-time pattern characters by default.
   1379     // So we set pattern chars using 'J' instead of 'Y'.
   1380     DateFormatSymbols *dfs = new DateFormatSymbols(Locale::getGermany(), status);
   1381     dfs->setLocalPatternChars(UnicodeString("GyMdkHmsSEDFwWahKzJeugAZvcLQq"));
   1382     sdf->adoptDateFormatSymbols(dfs);
   1383     sdf->applyLocalizedPattern(UnicodeString("JJJJ'-W'ww-ee"), status);
   1384     if (U_FAILURE(status)) { errln("Couldn't apply localized pattern"); return; }
   1385 
   1386     cal->clear();
   1387     cal->set(1997, UCAL_DECEMBER, 25);
   1388     doYEAR_WOYLoop(cal, sdf, times, status);
   1389     //loop_addroll(cal, /*sdf,*/ times, UCAL_YEAR_WOY, UCAL_YEAR,  status);
   1390     yearAddTest(*cal, status); // aliu
   1391     loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status);
   1392     if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1997"); return; }
   1393 
   1394     cal->clear();
   1395     cal->set(1998, UCAL_DECEMBER, 25);
   1396     doYEAR_WOYLoop(cal, sdf, times, status);
   1397     //loop_addroll(cal, /*sdf,*/ times, UCAL_YEAR_WOY, UCAL_YEAR,  status);
   1398     yearAddTest(*cal, status); // aliu
   1399     loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status);
   1400     if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1998"); return; }
   1401 
   1402     cal->clear();
   1403     cal->set(1582, UCAL_OCTOBER, 1);
   1404     doYEAR_WOYLoop(cal, sdf, times, status);
   1405     //loop_addroll(cal, /*sdf,*/ times, Calendar::YEAR_WOY, Calendar::YEAR,  status);
   1406     yearAddTest(*cal, status); // aliu
   1407     loop_addroll(cal, /*sdf,*/ times, UCAL_DOW_LOCAL, UCAL_DAY_OF_WEEK, status);
   1408     if (U_FAILURE(status)) { errln("Error in parse/calculate test for 1582"); return; }
   1409     delete sdf;
   1410     delete cal;
   1411 
   1412     return;
   1413 }
   1414 
   1415 /**
   1416  * Confirm that adding a YEAR and adding a YEAR_WOY work properly for
   1417  * the given Calendar at its current setting.
   1418  */
   1419 void CalendarTest::yearAddTest(Calendar& cal, UErrorCode& status) {
   1420     /**
   1421      * When adding the YEAR, the month and day should remain constant.
   1422      * When adding the YEAR_WOY, the WOY and DOW should remain constant. - aliu
   1423      * Examples:
   1424      *  Wed Jan 14 1998 / 1998-W03-03 Add(YEAR_WOY, 1) -> Wed Jan 20 1999 / 1999-W03-03
   1425      *                                Add(YEAR, 1)     -> Thu Jan 14 1999 / 1999-W02-04
   1426      *  Thu Jan 14 1999 / 1999-W02-04 Add(YEAR_WOY, 1) -> Thu Jan 13 2000 / 2000-W02-04
   1427      *                                Add(YEAR, 1)     -> Fri Jan 14 2000 / 2000-W02-05
   1428      *  Sun Oct 31 1582 / 1582-W42-07 Add(YEAR_WOY, 1) -> Sun Oct 23 1583 / 1583-W42-07
   1429      *                                Add(YEAR, 1)     -> Mon Oct 31 1583 / 1583-W44-01
   1430      */
   1431     int32_t y   = cal.get(UCAL_YEAR, status);
   1432     int32_t mon = cal.get(UCAL_MONTH, status);
   1433     int32_t day = cal.get(UCAL_DATE, status);
   1434     int32_t ywy = cal.get(UCAL_YEAR_WOY, status);
   1435     int32_t woy = cal.get(UCAL_WEEK_OF_YEAR, status);
   1436     int32_t dow = cal.get(UCAL_DOW_LOCAL, status);
   1437     UDate t = cal.getTime(status);
   1438 
   1439     if(U_FAILURE(status)){
   1440         errln(UnicodeString("Failed to create Calendar for locale. Error: ") + UnicodeString(u_errorName(status)));
   1441         return;
   1442     }
   1443     UnicodeString str, str2;
   1444     SimpleDateFormat fmt(UnicodeString("EEE MMM dd yyyy / YYYY'-W'ww-ee"), status);
   1445     fmt.setCalendar(cal);
   1446 
   1447     fmt.format(t, str.remove());
   1448     str += ".add(YEAR, 1)    =>";
   1449     cal.add(UCAL_YEAR, 1, status);
   1450     int32_t y2   = cal.get(UCAL_YEAR, status);
   1451     int32_t mon2 = cal.get(UCAL_MONTH, status);
   1452     int32_t day2 = cal.get(UCAL_DATE, status);
   1453     fmt.format(cal.getTime(status), str);
   1454     if (y2 != (y+1) || mon2 != mon || day2 != day) {
   1455         str += (UnicodeString)", expected year " +
   1456             (y+1) + ", month " + (mon+1) + ", day " + day;
   1457         errln((UnicodeString)"FAIL: " + str);
   1458         logln( UnicodeString(" -> ") + CalendarTest::calToStr(cal) );
   1459     } else {
   1460         logln(str);
   1461     }
   1462 
   1463     fmt.format(t, str.remove());
   1464     str += ".add(YEAR_WOY, 1)=>";
   1465     cal.setTime(t, status);
   1466     logln( UnicodeString(" <- ") + CalendarTest::calToStr(cal) );
   1467     cal.add(UCAL_YEAR_WOY, 1, status);
   1468     int32_t ywy2 = cal.get(UCAL_YEAR_WOY, status);
   1469     int32_t woy2 = cal.get(UCAL_WEEK_OF_YEAR, status);
   1470     int32_t dow2 = cal.get(UCAL_DOW_LOCAL, status);
   1471     fmt.format(cal.getTime(status), str);
   1472     if (ywy2 != (ywy+1) || woy2 != woy || dow2 != dow) {
   1473         str += (UnicodeString)", expected yearWOY " +
   1474             (ywy+1) + ", woy " + woy + ", dowLocal " + dow;
   1475         errln((UnicodeString)"FAIL: " + str);
   1476         logln( UnicodeString(" -> ") + CalendarTest::calToStr(cal) );
   1477     } else {
   1478         logln(str);
   1479     }
   1480 }
   1481 
   1482 // -------------------------------------
   1483 
   1484 void CalendarTest::loop_addroll(Calendar *cal, /*SimpleDateFormat *sdf,*/ int times, UCalendarDateFields field, UCalendarDateFields field2, UErrorCode& errorCode) {
   1485     Calendar *calclone;
   1486     SimpleDateFormat fmt(UnicodeString("EEE MMM dd yyyy / YYYY'-W'ww-ee"), errorCode);
   1487     fmt.setCalendar(*cal);
   1488     int i;
   1489 
   1490     for(i = 0; i<times; i++) {
   1491         calclone = cal->clone();
   1492         UDate start = cal->getTime(errorCode);
   1493         cal->add(field,1,errorCode);
   1494         if (U_FAILURE(errorCode)) { errln("Error in add"); delete calclone; return; }
   1495         calclone->add(field2,1,errorCode);
   1496         if (U_FAILURE(errorCode)) { errln("Error in add"); delete calclone; return; }
   1497         if(cal->getTime(errorCode) != calclone->getTime(errorCode)) {
   1498             UnicodeString str("FAIL: Results of add differ. "), str2;
   1499             str += fmt.format(start, str2) + " ";
   1500             str += UnicodeString("Add(") + fieldName(field) + ", 1) -> " +
   1501                 fmt.format(cal->getTime(errorCode), str2.remove()) + "; ";
   1502             str += UnicodeString("Add(") + fieldName(field2) + ", 1) -> " +
   1503                 fmt.format(calclone->getTime(errorCode), str2.remove());
   1504             errln(str);
   1505             delete calclone;
   1506             return;
   1507         }
   1508         delete calclone;
   1509     }
   1510 
   1511     for(i = 0; i<times; i++) {
   1512         calclone = cal->clone();
   1513         cal->roll(field,(int32_t)1,errorCode);
   1514         if (U_FAILURE(errorCode)) { errln("Error in roll"); delete calclone; return; }
   1515         calclone->roll(field2,(int32_t)1,errorCode);
   1516         if (U_FAILURE(errorCode)) { errln("Error in roll"); delete calclone; return; }
   1517         if(cal->getTime(errorCode) != calclone->getTime(errorCode)) {
   1518             delete calclone;
   1519             errln("Results of roll differ!");
   1520             return;
   1521         }
   1522         delete calclone;
   1523     }
   1524 }
   1525 
   1526 // -------------------------------------
   1527 
   1528 void
   1529 CalendarTest::doYEAR_WOYLoop(Calendar *cal, SimpleDateFormat *sdf,
   1530                                     int32_t times, UErrorCode& errorCode) {
   1531 
   1532     UnicodeString us;
   1533     UDate tst, original;
   1534     Calendar *tstres = new GregorianCalendar(Locale::getGermany(), errorCode);
   1535     for(int i=0; i<times; ++i) {
   1536         sdf->format(Formattable(cal->getTime(errorCode),Formattable::kIsDate), us, errorCode);
   1537         //logln("expected: "+us);
   1538         if (U_FAILURE(errorCode)) { errln("Format error"); return; }
   1539         tst=sdf->parse(us,errorCode);
   1540         if (U_FAILURE(errorCode)) { errln("Parse error"); return; }
   1541         tstres->clear();
   1542         tstres->setTime(tst, errorCode);
   1543         //logln((UnicodeString)"Parsed week of year is "+tstres->get(UCAL_WEEK_OF_YEAR, errorCode));
   1544         if (U_FAILURE(errorCode)) { errln("Set time error"); return; }
   1545         original = cal->getTime(errorCode);
   1546         us.remove();
   1547         sdf->format(Formattable(tst,Formattable::kIsDate), us, errorCode);
   1548         //logln("got: "+us);
   1549         if (U_FAILURE(errorCode)) { errln("Get time error"); return; }
   1550         if(original!=tst) {
   1551             us.remove();
   1552             sdf->format(Formattable(original, Formattable::kIsDate), us, errorCode);
   1553             errln("FAIL: Parsed time doesn't match with regular");
   1554             logln("expected "+us + " " + calToStr(*cal));
   1555             us.remove();
   1556             sdf->format(Formattable(tst, Formattable::kIsDate), us, errorCode);
   1557             logln("got "+us + " " + calToStr(*tstres));
   1558         }
   1559         tstres->clear();
   1560         tstres->set(UCAL_YEAR_WOY, cal->get(UCAL_YEAR_WOY, errorCode));
   1561         tstres->set(UCAL_WEEK_OF_YEAR, cal->get(UCAL_WEEK_OF_YEAR, errorCode));
   1562         tstres->set(UCAL_DOW_LOCAL, cal->get(UCAL_DOW_LOCAL, errorCode));
   1563         if(cal->get(UCAL_YEAR, errorCode) != tstres->get(UCAL_YEAR, errorCode)) {
   1564             errln("FAIL: Different Year!");
   1565             logln((UnicodeString)"Expected "+cal->get(UCAL_YEAR, errorCode));
   1566             logln((UnicodeString)"Got "+tstres->get(UCAL_YEAR, errorCode));
   1567             return;
   1568         }
   1569         if(cal->get(UCAL_DAY_OF_YEAR, errorCode) != tstres->get(UCAL_DAY_OF_YEAR, errorCode)) {
   1570             errln("FAIL: Different Day Of Year!");
   1571             logln((UnicodeString)"Expected "+cal->get(UCAL_DAY_OF_YEAR, errorCode));
   1572             logln((UnicodeString)"Got "+tstres->get(UCAL_DAY_OF_YEAR, errorCode));
   1573             return;
   1574         }
   1575         //logln(calToStr(*cal));
   1576         cal->add(UCAL_DATE, 1, errorCode);
   1577         if (U_FAILURE(errorCode)) { errln("Add error"); return; }
   1578         us.remove();
   1579     }
   1580     delete (tstres);
   1581 }
   1582 // -------------------------------------
   1583 
   1584 void
   1585 CalendarTest::marchByDelta(Calendar* cal, int32_t delta)
   1586 {
   1587     UErrorCode status = U_ZERO_ERROR;
   1588     Calendar *cur = (Calendar*) cal->clone();
   1589     int32_t initialDOW = cur->get(UCAL_DAY_OF_WEEK, status);
   1590     if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
   1591     int32_t DOW, newDOW = initialDOW;
   1592     do {
   1593         UnicodeString str;
   1594         DOW = newDOW;
   1595         logln(UnicodeString("DOW = ") + DOW + "  " + dateToString(cur->getTime(status), str));
   1596         if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
   1597         cur->add(UCAL_DAY_OF_WEEK, delta, status);
   1598         if (U_FAILURE(status)) { errln("Calendar::add failed"); return; }
   1599         newDOW = cur->get(UCAL_DAY_OF_WEEK, status);
   1600         if (U_FAILURE(status)) { errln("Calendar::get failed"); return; }
   1601         int32_t expectedDOW = 1 + (DOW + delta - 1) % 7;
   1602         if (newDOW != expectedDOW) {
   1603             errln(UnicodeString("Day of week should be ") + expectedDOW + " instead of " + newDOW +
   1604                   " on " + dateToString(cur->getTime(status), str));
   1605             if (U_FAILURE(status)) { errln("Calendar::getTime failed"); return; }
   1606             return;
   1607         }
   1608     }
   1609     while (newDOW != initialDOW);
   1610     delete cur;
   1611 }
   1612 
   1613 #define CHECK(status, msg) \
   1614     if (U_FAILURE(status)) { \
   1615         errcheckln(status, msg); \
   1616         return; \
   1617     }
   1618 
   1619 void CalendarTest::TestWOY(void) {
   1620     /*
   1621       FDW = Mon, MDFW = 4:
   1622          Sun Dec 26 1999, WOY 51
   1623          Mon Dec 27 1999, WOY 52
   1624          Tue Dec 28 1999, WOY 52
   1625          Wed Dec 29 1999, WOY 52
   1626          Thu Dec 30 1999, WOY 52
   1627          Fri Dec 31 1999, WOY 52
   1628          Sat Jan 01 2000, WOY 52 ***
   1629          Sun Jan 02 2000, WOY 52 ***
   1630          Mon Jan 03 2000, WOY 1
   1631          Tue Jan 04 2000, WOY 1
   1632          Wed Jan 05 2000, WOY 1
   1633          Thu Jan 06 2000, WOY 1
   1634          Fri Jan 07 2000, WOY 1
   1635          Sat Jan 08 2000, WOY 1
   1636          Sun Jan 09 2000, WOY 1
   1637          Mon Jan 10 2000, WOY 2
   1638 
   1639       FDW = Mon, MDFW = 2:
   1640          Sun Dec 26 1999, WOY 52
   1641          Mon Dec 27 1999, WOY 1  ***
   1642          Tue Dec 28 1999, WOY 1  ***
   1643          Wed Dec 29 1999, WOY 1  ***
   1644          Thu Dec 30 1999, WOY 1  ***
   1645          Fri Dec 31 1999, WOY 1  ***
   1646          Sat Jan 01 2000, WOY 1
   1647          Sun Jan 02 2000, WOY 1
   1648          Mon Jan 03 2000, WOY 2
   1649          Tue Jan 04 2000, WOY 2
   1650          Wed Jan 05 2000, WOY 2
   1651          Thu Jan 06 2000, WOY 2
   1652          Fri Jan 07 2000, WOY 2
   1653          Sat Jan 08 2000, WOY 2
   1654          Sun Jan 09 2000, WOY 2
   1655          Mon Jan 10 2000, WOY 3
   1656     */
   1657 
   1658     UnicodeString str;
   1659     UErrorCode status = U_ZERO_ERROR;
   1660     int32_t i;
   1661 
   1662     GregorianCalendar cal(status);
   1663     SimpleDateFormat fmt(UnicodeString("EEE MMM dd yyyy', WOY' w"), status);
   1664     if (failure(status, "Cannot construct calendar/format", TRUE)) return;
   1665 
   1666     UCalendarDaysOfWeek fdw = (UCalendarDaysOfWeek) 0;
   1667 
   1668     //for (int8_t pass=2; pass<=2; ++pass) {
   1669     for (int8_t pass=1; pass<=2; ++pass) {
   1670         switch (pass) {
   1671         case 1:
   1672             fdw = UCAL_MONDAY;
   1673             cal.setFirstDayOfWeek(fdw);
   1674             cal.setMinimalDaysInFirstWeek(4);
   1675             fmt.adoptCalendar(cal.clone());
   1676             break;
   1677         case 2:
   1678             fdw = UCAL_MONDAY;
   1679             cal.setFirstDayOfWeek(fdw);
   1680             cal.setMinimalDaysInFirstWeek(2);
   1681             fmt.adoptCalendar(cal.clone());
   1682             break;
   1683         }
   1684 
   1685         //for (i=2; i<=6; ++i) {
   1686         for (i=0; i<16; ++i) {
   1687         UDate t, t2;
   1688         int32_t t_y, t_woy, t_dow;
   1689         cal.clear();
   1690         cal.set(1999, UCAL_DECEMBER, 26 + i);
   1691         fmt.format(t = cal.getTime(status), str.remove());
   1692         CHECK(status, "Fail: getTime failed");
   1693         logln(UnicodeString("* ") + str);
   1694         int32_t dow = cal.get(UCAL_DAY_OF_WEEK, status);
   1695         int32_t woy = cal.get(UCAL_WEEK_OF_YEAR, status);
   1696         int32_t year = cal.get(UCAL_YEAR, status);
   1697         int32_t mon = cal.get(UCAL_MONTH, status);
   1698         logln(calToStr(cal));
   1699         CHECK(status, "Fail: get failed");
   1700         int32_t dowLocal = dow - fdw;
   1701         if (dowLocal < 0) dowLocal += 7;
   1702         dowLocal++;
   1703         int32_t yearWoy = year;
   1704         if (mon == UCAL_JANUARY) {
   1705             if (woy >= 52) --yearWoy;
   1706         } else {
   1707             if (woy == 1) ++yearWoy;
   1708         }
   1709 
   1710         // Basic fields->time check y/woy/dow
   1711         // Since Y/WOY is ambiguous, we do a check of the fields,
   1712         // not of the specific time.
   1713         cal.clear();
   1714         cal.set(UCAL_YEAR, year);
   1715         cal.set(UCAL_WEEK_OF_YEAR, woy);
   1716         cal.set(UCAL_DAY_OF_WEEK, dow);
   1717         t_y = cal.get(UCAL_YEAR, status);
   1718         t_woy = cal.get(UCAL_WEEK_OF_YEAR, status);
   1719         t_dow = cal.get(UCAL_DAY_OF_WEEK, status);
   1720         CHECK(status, "Fail: get failed");
   1721         if (t_y != year || t_woy != woy || t_dow != dow) {
   1722             str = "Fail: y/woy/dow fields->time => ";
   1723             fmt.format(cal.getTime(status), str);
   1724             errln(str);
   1725             logln(calToStr(cal));
   1726             logln("[get!=set] Y%d!=%d || woy%d!=%d || dow%d!=%d\n",
   1727                   t_y, year, t_woy, woy, t_dow, dow);
   1728         } else {
   1729           logln("y/woy/dow fields->time OK");
   1730         }
   1731 
   1732         // Basic fields->time check y/woy/dow_local
   1733         // Since Y/WOY is ambiguous, we do a check of the fields,
   1734         // not of the specific time.
   1735         cal.clear();
   1736         cal.set(UCAL_YEAR, year);
   1737         cal.set(UCAL_WEEK_OF_YEAR, woy);
   1738         cal.set(UCAL_DOW_LOCAL, dowLocal);
   1739         t_y = cal.get(UCAL_YEAR, status);
   1740         t_woy = cal.get(UCAL_WEEK_OF_YEAR, status);
   1741         t_dow = cal.get(UCAL_DOW_LOCAL, status);
   1742         CHECK(status, "Fail: get failed");
   1743         if (t_y != year || t_woy != woy || t_dow != dowLocal) {
   1744             str = "Fail: y/woy/dow_local fields->time => ";
   1745             fmt.format(cal.getTime(status), str);
   1746             errln(str);
   1747         }
   1748 
   1749         // Basic fields->time check y_woy/woy/dow
   1750         cal.clear();
   1751         cal.set(UCAL_YEAR_WOY, yearWoy);
   1752         cal.set(UCAL_WEEK_OF_YEAR, woy);
   1753         cal.set(UCAL_DAY_OF_WEEK, dow);
   1754         t2 = cal.getTime(status);
   1755         CHECK(status, "Fail: getTime failed");
   1756         if (t != t2) {
   1757             str = "Fail: y_woy/woy/dow fields->time => ";
   1758             fmt.format(t2, str);
   1759             errln(str);
   1760             logln(calToStr(cal));
   1761             logln("%.f != %.f\n", t, t2);
   1762         } else {
   1763           logln("y_woy/woy/dow OK");
   1764         }
   1765 
   1766         // Basic fields->time check y_woy/woy/dow_local
   1767         cal.clear();
   1768         cal.set(UCAL_YEAR_WOY, yearWoy);
   1769         cal.set(UCAL_WEEK_OF_YEAR, woy);
   1770         cal.set(UCAL_DOW_LOCAL, dowLocal);
   1771         t2 = cal.getTime(status);
   1772         CHECK(status, "Fail: getTime failed");
   1773         if (t != t2) {
   1774             str = "Fail: y_woy/woy/dow_local fields->time => ";
   1775             fmt.format(t2, str);
   1776             errln(str);
   1777         }
   1778 
   1779         logln("Testing DOW_LOCAL.. dow%d\n", dow);
   1780         // Make sure DOW_LOCAL disambiguates over DOW
   1781         int32_t wrongDow = dow - 3;
   1782         if (wrongDow < 1) wrongDow += 7;
   1783         cal.setTime(t, status);
   1784         cal.set(UCAL_DAY_OF_WEEK, wrongDow);
   1785         cal.set(UCAL_DOW_LOCAL, dowLocal);
   1786         t2 = cal.getTime(status);
   1787         CHECK(status, "Fail: set/getTime failed");
   1788         if (t != t2) {
   1789             str = "Fail: DOW_LOCAL fields->time => ";
   1790             fmt.format(t2, str);
   1791             errln(str);
   1792             logln(calToStr(cal));
   1793             logln("%.f :   DOW%d, DOW_LOCAL%d -> %.f\n",
   1794                   t, wrongDow, dowLocal, t2);
   1795         }
   1796 
   1797         // Make sure DOW disambiguates over DOW_LOCAL
   1798         int32_t wrongDowLocal = dowLocal - 3;
   1799         if (wrongDowLocal < 1) wrongDowLocal += 7;
   1800         cal.setTime(t, status);
   1801         cal.set(UCAL_DOW_LOCAL, wrongDowLocal);
   1802         cal.set(UCAL_DAY_OF_WEEK, dow);
   1803         t2 = cal.getTime(status);
   1804         CHECK(status, "Fail: set/getTime failed");
   1805         if (t != t2) {
   1806             str = "Fail: DOW       fields->time => ";
   1807             fmt.format(t2, str);
   1808             errln(str);
   1809         }
   1810 
   1811         // Make sure YEAR_WOY disambiguates over YEAR
   1812         cal.setTime(t, status);
   1813         cal.set(UCAL_YEAR, year - 2);
   1814         cal.set(UCAL_YEAR_WOY, yearWoy);
   1815         t2 = cal.getTime(status);
   1816         CHECK(status, "Fail: set/getTime failed");
   1817         if (t != t2) {
   1818             str = "Fail: YEAR_WOY  fields->time => ";
   1819             fmt.format(t2, str);
   1820             errln(str);
   1821         }
   1822 
   1823         // Make sure YEAR disambiguates over YEAR_WOY
   1824         cal.setTime(t, status);
   1825         cal.set(UCAL_YEAR_WOY, yearWoy - 2);
   1826         cal.set(UCAL_YEAR, year);
   1827         t2 = cal.getTime(status);
   1828         CHECK(status, "Fail: set/getTime failed");
   1829         if (t != t2) {
   1830             str = "Fail: YEAR      fields->time => ";
   1831             fmt.format(t2, str);
   1832             errln(str);
   1833         }
   1834     }
   1835     }
   1836 
   1837     /*
   1838       FDW = Mon, MDFW = 4:
   1839          Sun Dec 26 1999, WOY 51
   1840          Mon Dec 27 1999, WOY 52
   1841          Tue Dec 28 1999, WOY 52
   1842          Wed Dec 29 1999, WOY 52
   1843          Thu Dec 30 1999, WOY 52
   1844          Fri Dec 31 1999, WOY 52
   1845          Sat Jan 01 2000, WOY 52
   1846          Sun Jan 02 2000, WOY 52
   1847     */
   1848 
   1849     // Roll the DOW_LOCAL within week 52
   1850     for (i=27; i<=33; ++i) {
   1851         int32_t amount;
   1852         for (amount=-7; amount<=7; ++amount) {
   1853             str = "roll(";
   1854             cal.set(1999, UCAL_DECEMBER, i);
   1855             UDate t, t2;
   1856             fmt.format(cal.getTime(status), str);
   1857             CHECK(status, "Fail: getTime failed");
   1858             str += UnicodeString(", ") + amount + ") = ";
   1859 
   1860             cal.roll(UCAL_DOW_LOCAL, amount, status);
   1861             CHECK(status, "Fail: roll failed");
   1862 
   1863             t = cal.getTime(status);
   1864             int32_t newDom = i + amount;
   1865             while (newDom < 27) newDom += 7;
   1866             while (newDom > 33) newDom -= 7;
   1867             cal.set(1999, UCAL_DECEMBER, newDom);
   1868             t2 = cal.getTime(status);
   1869             CHECK(status, "Fail: getTime failed");
   1870             fmt.format(t, str);
   1871 
   1872             if (t != t2) {
   1873                 str.append(", exp ");
   1874                 fmt.format(t2, str);
   1875                 errln(str);
   1876             } else {
   1877                 logln(str);
   1878             }
   1879         }
   1880     }
   1881 }
   1882 
   1883 void CalendarTest::TestYWOY()
   1884 {
   1885    UnicodeString str;
   1886    UErrorCode status = U_ZERO_ERROR;
   1887 
   1888    GregorianCalendar cal(status);
   1889    if (failure(status, "construct GregorianCalendar", TRUE)) return;
   1890 
   1891    cal.setFirstDayOfWeek(UCAL_SUNDAY);
   1892    cal.setMinimalDaysInFirstWeek(1);
   1893 
   1894    logln("Setting:  ywoy=2004, woy=1, dow=MONDAY");
   1895    cal.clear();
   1896    cal.set(UCAL_YEAR_WOY,2004);
   1897    cal.set(UCAL_WEEK_OF_YEAR,1);
   1898    cal.set(UCAL_DAY_OF_WEEK, UCAL_MONDAY);
   1899 
   1900    logln(calToStr(cal));
   1901    if(cal.get(UCAL_YEAR, status) != 2003) {
   1902      errln("year not 2003");
   1903    }
   1904 
   1905    logln("+ setting DOW to THURSDAY");
   1906    cal.clear();
   1907    cal.set(UCAL_YEAR_WOY,2004);
   1908    cal.set(UCAL_WEEK_OF_YEAR,1);
   1909    cal.set(UCAL_DAY_OF_WEEK, UCAL_THURSDAY);
   1910 
   1911    logln(calToStr(cal));
   1912    if(cal.get(UCAL_YEAR, status) != 2004) {
   1913      errln("year not 2004");
   1914    }
   1915 
   1916    logln("+ setting DOW_LOCAL to 1");
   1917    cal.clear();
   1918    cal.set(UCAL_YEAR_WOY,2004);
   1919    cal.set(UCAL_WEEK_OF_YEAR,1);
   1920    cal.set(UCAL_DAY_OF_WEEK, UCAL_THURSDAY);
   1921    cal.set(UCAL_DOW_LOCAL, 1);
   1922 
   1923    logln(calToStr(cal));
   1924    if(cal.get(UCAL_YEAR, status) != 2003) {
   1925      errln("year not 2003");
   1926    }
   1927 
   1928    cal.setFirstDayOfWeek(UCAL_MONDAY);
   1929    cal.setMinimalDaysInFirstWeek(4);
   1930    UDate t = 946713600000.;
   1931    cal.setTime(t, status);
   1932    cal.set(UCAL_DAY_OF_WEEK, 4);
   1933    cal.set(UCAL_DOW_LOCAL, 6);
   1934    if(cal.getTime(status) != t) {
   1935      logln(calToStr(cal));
   1936      errln("FAIL:  DOW_LOCAL did not take precedence");
   1937    }
   1938 
   1939 }
   1940 
   1941 void CalendarTest::TestJD()
   1942 {
   1943   int32_t jd;
   1944   static const int32_t kEpochStartAsJulianDay = 2440588;
   1945   UErrorCode status = U_ZERO_ERROR;
   1946   GregorianCalendar cal(status);
   1947   if (failure(status, "construct GregorianCalendar", TRUE)) return;
   1948   cal.setTimeZone(*TimeZone::getGMT());
   1949   cal.clear();
   1950   jd = cal.get(UCAL_JULIAN_DAY, status);
   1951   if(jd != kEpochStartAsJulianDay) {
   1952     errln("Wanted JD of %d at time=0, [epoch 1970] but got %d\n", kEpochStartAsJulianDay, jd);
   1953   } else {
   1954     logln("Wanted JD of %d at time=0, [epoch 1970], got %d\n", kEpochStartAsJulianDay, jd);
   1955   }
   1956 
   1957   cal.setTime(Calendar::getNow(), status);
   1958   cal.clear();
   1959   cal.set(UCAL_JULIAN_DAY, kEpochStartAsJulianDay);
   1960   UDate epochTime = cal.getTime(status);
   1961   if(epochTime != 0) {
   1962     errln("Wanted time of 0 at jd=%d, got %.1lf\n", kEpochStartAsJulianDay, epochTime);
   1963   } else {
   1964     logln("Wanted time of 0 at jd=%d, got %.1lf\n", kEpochStartAsJulianDay, epochTime);
   1965   }
   1966 
   1967 }
   1968 
   1969 // make sure the ctestfw utilities are in sync with the Calendar
   1970 void CalendarTest::TestDebug()
   1971 {
   1972     for(int32_t  t=0;t<=UDBG_ENUM_COUNT;t++) {
   1973         int32_t count = udbg_enumCount((UDebugEnumType)t);
   1974         if(count == -1) {
   1975             logln("enumCount(%d) returned -1", count);
   1976             continue;
   1977         }
   1978         for(int32_t i=0;i<=count;i++) {
   1979             if(t<=UDBG_HIGHEST_CONTIGUOUS_ENUM && i<count) {
   1980                 if( i!=udbg_enumArrayValue((UDebugEnumType)t, i)) {
   1981                     errln("FAIL: udbg_enumArrayValue(%d,%d) returned %d, expected %d", t, i, udbg_enumArrayValue((UDebugEnumType)t,i), i);
   1982                 }
   1983             } else {
   1984                 logln("Testing count+1:");
   1985             }
   1986                   const char *name = udbg_enumName((UDebugEnumType)t,i);
   1987                   if(name==NULL) {
   1988                           if(i==count || t>UDBG_HIGHEST_CONTIGUOUS_ENUM  ) {
   1989                                 logln(" null name - expected.\n");
   1990                           } else {
   1991                                 errln("FAIL: udbg_enumName(%d,%d) returned NULL", t, i);
   1992                           }
   1993                           name = "(null)";
   1994                   }
   1995           logln("udbg_enumArrayValue(%d,%d) = %s, returned %d", t, i,
   1996                       name, udbg_enumArrayValue((UDebugEnumType)t,i));
   1997             logln("udbg_enumString = " + udbg_enumString((UDebugEnumType)t,i));
   1998         }
   1999         if(udbg_enumExpectedCount((UDebugEnumType)t) != count && t<=UDBG_HIGHEST_CONTIGUOUS_ENUM) {
   2000             errln("FAIL: udbg_enumExpectedCount(%d): %d, != UCAL_FIELD_COUNT=%d ", t, udbg_enumExpectedCount((UDebugEnumType)t), count);
   2001         } else {
   2002             logln("udbg_ucal_fieldCount: %d, UCAL_FIELD_COUNT=udbg_enumCount %d ", udbg_enumExpectedCount((UDebugEnumType)t), count);
   2003         }
   2004     }
   2005 }
   2006 
   2007 
   2008 #undef CHECK
   2009 
   2010 // List of interesting locales
   2011 const char *CalendarTest::testLocaleID(int32_t i)
   2012 {
   2013   switch(i) {
   2014   case 0: return "he_IL@calendar=hebrew";
   2015   case 1: return "en_US@calendar=hebrew";
   2016   case 2: return "fr_FR@calendar=hebrew";
   2017   case 3: return "fi_FI@calendar=hebrew";
   2018   case 4: return "nl_NL@calendar=hebrew";
   2019   case 5: return "hu_HU@calendar=hebrew";
   2020   case 6: return "nl_BE@currency=MTL;calendar=islamic";
   2021   case 7: return "th_TH_TRADITIONAL@calendar=gregorian";
   2022   case 8: return "ar_JO@calendar=islamic-civil";
   2023   case 9: return "fi_FI@calendar=islamic";
   2024   case 10: return "fr_CH@calendar=islamic-civil";
   2025   case 11: return "he_IL@calendar=islamic-civil";
   2026   case 12: return "hu_HU@calendar=buddhist";
   2027   case 13: return "hu_HU@calendar=islamic";
   2028   case 14: return "en_US@calendar=japanese";
   2029   default: return NULL;
   2030   }
   2031 }
   2032 
   2033 int32_t CalendarTest::testLocaleCount()
   2034 {
   2035   static int32_t gLocaleCount = -1;
   2036   if(gLocaleCount < 0) {
   2037     int32_t i;
   2038     for(i=0;testLocaleID(i) != NULL;i++) {
   2039       ;
   2040     }
   2041     gLocaleCount = i;
   2042   }
   2043   return gLocaleCount;
   2044 }
   2045 
   2046 static UDate doMinDateOfCalendar(Calendar* adopt, UBool &isGregorian, UErrorCode& status) {
   2047   if(U_FAILURE(status)) return 0.0;
   2048 
   2049   adopt->clear();
   2050   adopt->set(UCAL_EXTENDED_YEAR, adopt->getActualMinimum(UCAL_EXTENDED_YEAR, status));
   2051   UDate ret = adopt->getTime(status);
   2052   isGregorian = dynamic_cast<GregorianCalendar*>(adopt) != NULL;
   2053   delete adopt;
   2054   return ret;
   2055 }
   2056 
   2057 UDate CalendarTest::minDateOfCalendar(const Locale& locale, UBool &isGregorian, UErrorCode& status) {
   2058   if(U_FAILURE(status)) return 0.0;
   2059   return doMinDateOfCalendar(Calendar::createInstance(locale, status), isGregorian, status);
   2060 }
   2061 
   2062 UDate CalendarTest::minDateOfCalendar(const Calendar& cal, UBool &isGregorian, UErrorCode& status) {
   2063   if(U_FAILURE(status)) return 0.0;
   2064   return doMinDateOfCalendar(cal.clone(), isGregorian, status);
   2065 }
   2066 
   2067 void CalendarTest::Test6703()
   2068 {
   2069     UErrorCode status = U_ZERO_ERROR;
   2070     Calendar *cal;
   2071 
   2072     Locale loc1("en@calendar=fubar");
   2073     cal = Calendar::createInstance(loc1, status);
   2074     if (failure(status, "Calendar::createInstance", TRUE)) return;
   2075     delete cal;
   2076 
   2077     status = U_ZERO_ERROR;
   2078     Locale loc2("en");
   2079     cal = Calendar::createInstance(loc2, status);
   2080     if (failure(status, "Calendar::createInstance")) return;
   2081     delete cal;
   2082 
   2083     status = U_ZERO_ERROR;
   2084     Locale loc3("en@calendar=roc");
   2085     cal = Calendar::createInstance(loc3, status);
   2086     if (failure(status, "Calendar::createInstance")) return;
   2087     delete cal;
   2088 
   2089     return;
   2090 }
   2091 
   2092 void CalendarTest::Test3785()
   2093 {
   2094     UErrorCode status = U_ZERO_ERROR;
   2095     UnicodeString uzone = UNICODE_STRING_SIMPLE("Europe/Paris");
   2096     UnicodeString exp1 = UNICODE_STRING_SIMPLE("Mon 30 Jumada II 1433 AH, 01:47:03");
   2097     UnicodeString exp2 = UNICODE_STRING_SIMPLE("Mon 1 Rajab 1433 AH, 01:47:04");
   2098 
   2099     LocalUDateFormatPointer df(udat_open(UDAT_NONE, UDAT_NONE, "en@calendar=islamic", uzone.getTerminatedBuffer(),
   2100                                          uzone.length(), NULL, 0, &status));
   2101     if (df.isNull() || U_FAILURE(status)) return;
   2102 
   2103     UChar upattern[64];
   2104     u_uastrcpy(upattern, "EEE d MMMM y G, HH:mm:ss");
   2105     udat_applyPattern(df.getAlias(), FALSE, upattern, u_strlen(upattern));
   2106 
   2107     UChar ubuffer[1024];
   2108     UDate ud0 = 1337557623000.0;
   2109 
   2110     status = U_ZERO_ERROR;
   2111     udat_format(df.getAlias(), ud0, ubuffer, 1024, NULL, &status);
   2112     if (U_FAILURE(status)) {
   2113         errln("Error formatting date 1\n");
   2114         return;
   2115     }
   2116     //printf("formatted: '%s'\n", mkcstr(ubuffer));
   2117 
   2118     UnicodeString act1(ubuffer);
   2119     if ( act1 != exp1 ) {
   2120         errln("Unexpected result from date 1 format\n");
   2121     }
   2122     ud0 += 1000.0; // add one second
   2123 
   2124     status = U_ZERO_ERROR;
   2125     udat_format(df.getAlias(), ud0, ubuffer, 1024, NULL, &status);
   2126     if (U_FAILURE(status)) {
   2127         errln("Error formatting date 2\n");
   2128         return;
   2129     }
   2130     //printf("formatted: '%s'\n", mkcstr(ubuffer));
   2131     UnicodeString act2(ubuffer);
   2132     if ( act2 != exp2 ) {
   2133         errln("Unexpected result from date 2 format\n");
   2134     }
   2135 
   2136     return;
   2137 }
   2138 
   2139 void CalendarTest::Test1624() {
   2140     UErrorCode status = U_ZERO_ERROR;
   2141     Locale loc("he_IL@calendar=hebrew");
   2142     HebrewCalendar hc(loc,status);
   2143 
   2144     for (int32_t year = 5600; year < 5800; year++ ) {
   2145 
   2146         for (int32_t month = HebrewCalendar::TISHRI; month <= HebrewCalendar::ELUL; month++) {
   2147             // skip the adar 1 month if year is not a leap year
   2148             if (HebrewCalendar::isLeapYear(year) == FALSE && month == HebrewCalendar::ADAR_1) {
   2149                 continue;
   2150             }
   2151             int32_t day = 15;
   2152             hc.set(year,month,day);
   2153             int32_t dayHC = hc.get(UCAL_DATE,status);
   2154             int32_t monthHC = hc.get(UCAL_MONTH,status);
   2155             int32_t yearHC = hc.get(UCAL_YEAR,status);
   2156 
   2157             if (failure(status, "HebrewCalendar.get()", TRUE)) continue;
   2158 
   2159             if (dayHC != day) {
   2160                 errln(" ==> day %d incorrect, should be: %d\n",dayHC,day);
   2161                 break;
   2162             }
   2163             if (monthHC != month) {
   2164                 errln(" ==> month %d incorrect, should be: %d\n",monthHC,month);
   2165                 break;
   2166             }
   2167             if (yearHC != year) {
   2168                 errln(" ==> day %d incorrect, should be: %d\n",yearHC,year);
   2169                 break;
   2170             }
   2171         }
   2172     }
   2173     return;
   2174 }
   2175 
   2176 void CalendarTest::TestTimeStamp() {
   2177     UErrorCode status = U_ZERO_ERROR;
   2178     UDate start = 0.0, time;
   2179     Calendar *cal;
   2180 
   2181     // Create a new Gregorian Calendar.
   2182     cal = Calendar::createInstance("en_US@calender=gregorian", status);
   2183     if (U_FAILURE(status)) {
   2184         dataerrln("Error creating Gregorian calendar.");
   2185         return;
   2186     }
   2187 
   2188     for (int i = 0; i < 20000; i++) {
   2189         // Set the Gregorian Calendar to a specific date for testing.
   2190         cal->set(2009, UCAL_JULY, 3, 0, 49, 46);
   2191 
   2192         time = cal->getTime(status);
   2193         if (U_FAILURE(status)) {
   2194             errln("Error calling getTime()");
   2195             break;
   2196         }
   2197 
   2198         if (i == 0) {
   2199             start = time;
   2200         } else {
   2201             if (start != time) {
   2202                 errln("start and time not equal.");
   2203                 break;
   2204             }
   2205         }
   2206     }
   2207 
   2208     delete cal;
   2209 }
   2210 
   2211 void CalendarTest::TestISO8601() {
   2212     const char* TEST_LOCALES[] = {
   2213         "en_US@calendar=iso8601",
   2214         "en_US@calendar=Iso8601",
   2215         "th_TH@calendar=iso8601",
   2216         "ar_EG@calendar=iso8601",
   2217         NULL
   2218     };
   2219 
   2220     int32_t TEST_DATA[][3] = {
   2221         {2008, 1, 2008},
   2222         {2009, 1, 2009},
   2223         {2010, 53, 2009},
   2224         {2011, 52, 2010},
   2225         {2012, 52, 2011},
   2226         {2013, 1, 2013},
   2227         {2014, 1, 2014},
   2228         {0, 0, 0},
   2229     };
   2230 
   2231     for (int i = 0; TEST_LOCALES[i] != NULL; i++) {
   2232         UErrorCode status = U_ZERO_ERROR;
   2233         Calendar *cal = Calendar::createInstance(TEST_LOCALES[i], status);
   2234         if (U_FAILURE(status)) {
   2235             errln("Error: Failed to create a calendar for locale: %s", TEST_LOCALES[i]);
   2236             continue;
   2237         }
   2238         if (uprv_strcmp(cal->getType(), "gregorian") != 0) {
   2239             errln("Error: Gregorian calendar is not used for locale: %s", TEST_LOCALES[i]);
   2240             continue;
   2241         }
   2242         for (int j = 0; TEST_DATA[j][0] != 0; j++) {
   2243             cal->set(TEST_DATA[j][0], UCAL_JANUARY, 1);
   2244             int32_t weekNum = cal->get(UCAL_WEEK_OF_YEAR, status);
   2245             int32_t weekYear = cal->get(UCAL_YEAR_WOY, status);
   2246             if (U_FAILURE(status)) {
   2247                 errln("Error: Failed to get week of year");
   2248                 break;
   2249             }
   2250             if (weekNum != TEST_DATA[j][1] || weekYear != TEST_DATA[j][2]) {
   2251                 errln("Error: Incorrect week of year on January 1st, %d for locale %s: Returned [weekNum=%d, weekYear=%d], Expected [weekNum=%d, weekYear=%d]",
   2252                     TEST_DATA[j][0], TEST_LOCALES[i], weekNum, weekYear, TEST_DATA[j][1], TEST_DATA[j][2]);
   2253             }
   2254         }
   2255         delete cal;
   2256     }
   2257 
   2258 }
   2259 
   2260 #endif /* #if !UCONFIG_NO_FORMATTING */
   2261 
   2262 //eof
   2263