16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * COPYRIGHT:
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************/
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "calregts.h"
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/gregocal.h"
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/simpletz.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/smpdtfmt.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/strenum.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "caltest.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/localpointer.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <float.h>
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// *****************************************************************************
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// class CalendarRegressionTest
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// *****************************************************************************
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// these numbers correspond to using LONG_MIN and LONG_MAX in Java
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// this is 2^52 - 1, the largest allowable mantissa with a 0 exponent in a 64-bit double
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UDate CalendarRegressionTest::EARLIEST_SUPPORTED_MILLIS = - 4503599627370495.0;
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst UDate CalendarRegressionTest::LATEST_SUPPORTED_MILLIS    =   4503599627370495.0;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CASE(id,test) case id: name = #test; if (exec) { logln(#test "---"); logln((UnicodeString)""); test(); } break
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // if (exec) logln((UnicodeString)"TestSuite NumberFormatRegressionTest");
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    switch (index) {
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(0,test4100311);
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(1,test4074758);
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(2,test4028518);
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(3,test4031502);
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(4,test4035301);
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(5,test4040996);
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(6,test4051765);
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(7,test4061476);
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(8,test4070502);
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(9,test4071197);
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(10,test4071385);
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(11,test4073929);
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(12,test4083167);
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(13,test4086724);
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(14,test4095407);
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(15,test4096231);
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(16,test4096539);
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(17,test41003112);
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(18,test4103271);
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(19,test4106136);
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(20,test4108764);
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(21,test4114578);
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(22,test4118384);
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(23,test4125881);
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(24,test4125892);
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(25,test4141665);
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(26,test4142933);
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(27,test4145158);
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(28,test4145983);
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(29,test4147269);
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(30,Test4149677);
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(31,Test4162587);
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(32,Test4165343);
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(33,Test4166109);
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(34,Test4167060);
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(35,Test4197699);
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(36,TestJ81);
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(37,TestJ438);
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(38,TestLeapFieldDifference);
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(39,TestMalaysianInstance);
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(40,test4059654);
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(41,test4092362);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(42,TestWeekShift);
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(43,TestTimeZoneTransitionAdd);
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(44,TestDeprecates);
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(45,TestT5555);
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(46,TestT6745);
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(47,TestT8057);
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(48,TestT8596);
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(49,Test9019);
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        CASE(50,TestT9452);
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    default: name = ""; break;
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char* CalendarRegressionTest::FIELD_NAME [] = {
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "ERA",
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "YEAR",
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "MONTH",
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "WEEK_OF_YEAR",
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "WEEK_OF_MONTH",
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "DAY_OF_MONTH",
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "DAY_OF_YEAR",
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "DAY_OF_WEEK",
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "DAY_OF_WEEK_IN_MONTH",
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "AM_PM",
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "HOUR",
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "HOUR_OF_DAY",
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "MINUTE",
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "SECOND",
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "MILLISECOND",
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "ZONE_OFFSET",
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "DST_OFFSET",
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "YEAR_WOY",
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    "DOW_LOCAL"
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::failure(UErrorCode status, const char* msg)
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errcheckln(status, UnicodeString("FAIL: ") + msg + " failed, error " + u_errorName(status));
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return TRUE;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * bug 4100311
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::test4100311()
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = (GregorianCalendar*)Calendar::createInstance(status);
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "Calendar::createInstance(status)");
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_YEAR, 1997);
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_DAY_OF_YEAR, 1);
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d = cal->getTime(status);             // Should be Jan 1
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "cal->getTime");
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("") + d);
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4074758
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::test4074758()
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{       //Set system time to between 12-1 (am or pm) and then run
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = new GregorianCalendar(status);
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "new GregorianCalendar");
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t h=0; h<25; ++h) {
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(97, UCAL_JANUARY, 1, h, 34);
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //System.out.print(d);
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("HOUR=") + cal->get(UCAL_HOUR, status)); //prints 0
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failure(status, "cal->get");
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("HOUR_OF_DAY=") + cal->get(UCAL_HOUR_OF_DAY, status));
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failure(status, "cal->get");
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::test4028518()
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal1 = new GregorianCalendar(status) ;
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal1;
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "new GregorianCalendar");
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal2 = (GregorianCalendar*) cal1->clone() ;
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printdate(cal1, "cal1: ") ;
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printdate(cal2, "cal2 - cloned(): ") ;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1->add(UCAL_DATE, 1, status) ;
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "cal1->add");
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printdate(cal1, "cal1 after adding 1 day:") ;
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printdate(cal2, "cal2 should be unmodified:") ;
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal1;
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal2;
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::Test9019()
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LocalPointer<GregorianCalendar> cal1(new GregorianCalendar(status));
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    LocalPointer<GregorianCalendar> cal2(new GregorianCalendar(status));
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1->set(UCAL_HOUR, 1);
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2->set(UCAL_HOUR,2);
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1->clear();
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2->clear();
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "new GregorianCalendar");
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1->set(2011,UCAL_MAY,06);
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2->set(2012,UCAL_JANUARY,06);
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printdate(cal1.getAlias(), "cal1: ") ;
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1->setLenient(FALSE);
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1->add(UCAL_MONTH,8,status);
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "->add(UCAL_MONTH,8)");
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printdate(cal1.getAlias(), "cal1 (lenient) after adding 8 months:") ;
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    printdate(cal2.getAlias(), "cal2 (expected date):") ;
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!cal1->equals(*cal2,status)) {
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      errln("Error: cal1 != cal2.\n");
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "equals");
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::printdate(GregorianCalendar *cal, const char *string)
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString(string, ""));
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log(UnicodeString("") + cal->get(UCAL_MONTH, status)) ;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "cal->get");
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t date = cal->get(UCAL_DATE, status) + 1 ;
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "cal->get");
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log(UnicodeString("/") + date) ;
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("/") + cal->get(UCAL_YEAR, status)) ;
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "cal->get");
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4031502
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::test4031502()
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // This bug actually occurs on Windows NT as well, and doesn't
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // require the host zone to be set; it can be set in Java.
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringEnumeration* ids = TimeZone::createEnumeration();
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ids == NULL) {
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Unable to create TimeZone Enumeration.");
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool bad = FALSE;
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone* tz =TimeZone::createTimeZone("Asia/Riyadh87");
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "new TimeZone");
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cl = new GregorianCalendar(tz, status);
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Fail new GregorianCalendar: %s", u_errorName(status));
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete tz;
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cl->clear();
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cl->set(1900, 15, 5, 5, 8, 13);
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cl->get(UCAL_HOUR, status);
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "cl->get(UCAL_HOUR, status)");
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cl;
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i=0; i<ids->count(status); ++i) {
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TimeZone *zone = TimeZone::createTimeZone(*ids->snext(status));
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        GregorianCalendar *cal = new GregorianCalendar(zone, status);
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failure(status, "new GregorianCalendar");
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->clear();
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(1900, 15, 5, 5, 8, 13);
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (cal->get(UCAL_HOUR, status) != 5 || U_FAILURE(status)) {
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UnicodeString temp;
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(zone->getID(temp) + " " +
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               //zone.useDaylightTime() + " " +
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               cal->get(UCAL_DST_OFFSET,status) / (60*60*1000) + " " +
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               zone->getRawOffset() / (60*60*1000) +
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               ": HOUR = " + cal->get(UCAL_HOUR,status));
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            bad = TRUE;
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (bad)
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("TimeZone problems with GC");
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // delete [] ids;  // TODO: bad APIs
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete ids;
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4035301
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4035301()
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *c = new GregorianCalendar(98, 8, 7,status);
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *d = new GregorianCalendar(98, 8, 7,status);
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (c->after(*d,status) ||
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c->after(*c,status) ||
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c->before(*d,status) ||
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        c->before(*c,status) ||
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *c != *c ||
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        *c != *d)
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Fail");
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c;
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete d;
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4040996
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4040996()
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count = 0;
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringEnumeration* ids = TimeZone::createEnumeration(-8 * 60 * 60 * 1000);
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ids == NULL) {
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Unable to create TimeZone enumeration.");
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count = ids->count(status);
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    (void)count;    // Suppress set but not used warning.
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleTimeZone *pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, *ids->snext(status));
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pdt->setStartRule(UCAL_APRIL, 1, UCAL_SUNDAY, 2 * 60 * 60 * 1000, status);
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pdt->setEndRule(UCAL_OCTOBER, -1, UCAL_SUNDAY, 2 * 60 * 60 * 1000, status);
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *calendar = new GregorianCalendar(pdt, status);
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Fail new GregorianCalendar: %s", u_errorName(status));
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->set(UCAL_MONTH,3);
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->set(UCAL_DATE,18);
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->set(UCAL_SECOND, 30);
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("MONTH: ") + calendar->get(UCAL_MONTH, status));
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("DAY_OF_MONTH: ") +
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       calendar->get(UCAL_DATE, status));
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("MINUTE: ") + calendar->get(UCAL_MINUTE, status));
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("SECOND: ") + calendar->get(UCAL_SECOND, status));
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->add(UCAL_SECOND,6, status);
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //This will print out todays date for MONTH and DAY_OF_MONTH
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //instead of the date it was set to.
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //This happens when adding MILLISECOND or MINUTE also
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("MONTH: ") + calendar->get(UCAL_MONTH, status));
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("DAY_OF_MONTH: ") +
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       calendar->get(UCAL_DATE, status));
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("MINUTE: ") + calendar->get(UCAL_MINUTE, status));
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("SECOND: ") + calendar->get(UCAL_SECOND, status));
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (calendar->get(UCAL_MONTH, status) != 3 ||
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->get(UCAL_DATE, status) != 18 ||
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->get(UCAL_SECOND, status) != 36)
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("Fail: Calendar::add misbehaves"));
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendar;
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete ids;
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // delete ids;   // TODO:  BAD API
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4051765
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4051765()
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = Calendar::createInstance(status);
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setLenient(FALSE);
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_DAY_OF_WEEK, 0);
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //try {
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getTime(status);
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if( ! U_FAILURE(status))
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Fail: DAY_OF_WEEK 0 should be disallowed");
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*}
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    catch (IllegalArgumentException e) {
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }*/
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* User error - no bug here
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4059524() {
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Create calendar for April 10, 1997
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar calendar  = new GregorianCalendar(status);
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // print out a bunch of interesting things
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("ERA: " + Calendar::get(Calendar::ERA));
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("YEAR: " + Calendar::get(Calendar::YEAR));
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("MONTH: " + Calendar::get(Calendar::MONTH));
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("WEEK_OF_YEAR: " +
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       Calendar::get(Calendar::WEEK_OF_YEAR));
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("WEEK_OF_MONTH: " +
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       Calendar::get(Calendar::WEEK_OF_MONTH));
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DATE: " + Calendar::get(Calendar::DATE));
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DAY_OF_MONTH: " +
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       Calendar::get(Calendar::DAY_OF_MONTH));
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DAY_OF_YEAR: " + Calendar::get(Calendar::DAY_OF_YEAR));
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DAY_OF_WEEK: " + Calendar::get(Calendar::DAY_OF_WEEK));
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DAY_OF_WEEK_IN_MONTH: " +
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       Calendar::get(Calendar::DAY_OF_WEEK_IN_MONTH));
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("AM_PM: " + Calendar::get(Calendar::AM_PM));
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("HOUR: " + Calendar::get(Calendar::HOUR));
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("HOUR_OF_DAY: " + Calendar::get(Calendar::HOUR_OF_DAY));
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("MINUTE: " + Calendar::get(Calendar::MINUTE));
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("SECOND: " + Calendar::get(Calendar::SECOND));
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("MILLISECOND: " + Calendar::get(Calendar::MILLISECOND));
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("ZONE_OFFSET: "
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       + (Calendar::get(Calendar::ZONE_OFFSET)/(60*60*1000)));
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DST_OFFSET: "
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       + (Calendar::get(Calendar::DST_OFFSET)/(60*60*1000)));
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar  = new GregorianCalendar(1997,3,10);
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar::getTime();
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("April 10, 1997");
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("ERA: " + Calendar::get(Calendar::ERA));
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("YEAR: " + Calendar::get(Calendar::YEAR));
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("MONTH: " + Calendar::get(Calendar::MONTH));
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("WEEK_OF_YEAR: " +
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       Calendar::get(Calendar::WEEK_OF_YEAR));
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("WEEK_OF_MONTH: " +
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       Calendar::get(Calendar::WEEK_OF_MONTH));
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DATE: " + Calendar::get(Calendar::DATE));
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DAY_OF_MONTH: " +
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       Calendar::get(Calendar::DAY_OF_MONTH));
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DAY_OF_YEAR: " + Calendar::get(Calendar::DAY_OF_YEAR));
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DAY_OF_WEEK: " + Calendar::get(Calendar::DAY_OF_WEEK));
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DAY_OF_WEEK_IN_MONTH: " + Calendar::get(Calendar::DAY_OF_WEEK_IN_MONTH));
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("AM_PM: " + Calendar::get(Calendar::AM_PM));
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("HOUR: " + Calendar::get(Calendar::HOUR));
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("HOUR_OF_DAY: " + Calendar::get(Calendar::HOUR_OF_DAY));
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("MINUTE: " + Calendar::get(Calendar::MINUTE));
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("SECOND: " + Calendar::get(Calendar::SECOND));
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("MILLISECOND: " + Calendar::get(Calendar::MILLISECOND));
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("ZONE_OFFSET: "
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       + (Calendar::get(Calendar::ZONE_OFFSET)/(60*60*1000))); // in hours
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("DST_OFFSET: "
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       + (Calendar::get(Calendar::DST_OFFSET)/(60*60*1000))); // in hours
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4059654
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4059654() {
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *gc = new GregorianCalendar(status);
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete gc;
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->set(1997, 3, 1, 15, 16, 17); // April 1, 1997
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->set(UCAL_HOUR, 0);
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->set(UCAL_AM_PM, UCAL_AM);
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->set(UCAL_MINUTE, 0);
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->set(UCAL_SECOND, 0);
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->set(UCAL_MILLISECOND, 0);
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate cd = gc->getTime(status);
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *exp = new GregorianCalendar(1997, 3, 1, 0, 0, 0, status);
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cd != exp->getTime(status))
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("Fail: Calendar::set broken. Got ") + cd + " Want " + exp->getTime(status));
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete gc;
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete exp;
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4061476
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4061476()
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString("ddMMMyy"), Locale::getUK(),status);
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = Calendar::createInstance(TimeZone::createTimeZone("GMT"),
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    Locale::getUK(),status);
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete fmt;
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fmt->adoptCalendar(cal);
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // try {
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate date = fmt->parse("29MAY97", status);
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            failure(status, "fmt->parse");
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal->setTime(date, status);
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            failure(status, "cal->setTime");
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     //   }
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //catch (Exception e) {;}
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_HOUR_OF_DAY, 13);
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("Hour: ")+cal->get(UCAL_HOUR_OF_DAY, status));
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->add(UCAL_HOUR_OF_DAY, 6,status);
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("Hour: ")+cal->get(UCAL_HOUR_OF_DAY, status));
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->get(UCAL_HOUR_OF_DAY, status) != 19)
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("Fail: Want 19 Got ") + cal->get(UCAL_HOUR_OF_DAY, status));
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fmt;
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4070502
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4070502()
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = new GregorianCalendar(status);
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_USING_FALLBACK_WARNING || U_FAILURE(status)) {
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d = getAssociatedDate(makeDate(1998,0,30), status);
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setTime(d,status);
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->get(UCAL_DAY_OF_WEEK,status) == UCAL_SATURDAY ||
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->get(UCAL_DAY_OF_WEEK,status) == UCAL_SUNDAY)
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("Fail: Want weekday Got ") + d);
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Get the associated date starting from a specified date
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * NOTE: the unnecessary "getTime()'s" below are a work-around for a
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * bug in jdk 1.1.3 (and probably earlier versions also)
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param date The date to start from
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUDate
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::getAssociatedDate(UDate d, UErrorCode& status)
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = new GregorianCalendar(status);
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setTime(d,status);
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //cal.add(field, amount); //<-- PROBLEM SEEN WITH field = DATE,MONTH
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // cal.getTime();  // <--- REMOVE THIS TO SEE BUG
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (;;) {
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t wd = cal->get(UCAL_DAY_OF_WEEK, status);
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (wd == UCAL_SATURDAY || wd == UCAL_SUNDAY) {
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal->add(UCAL_DATE, 1, status);
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // cal.getTime();
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate dd = cal->getTime(status);
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return dd;
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4071197
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4071197()
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dowTest(FALSE);
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dowTest(TRUE);
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::dowTest(UBool lenient)
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = new GregorianCalendar(status);
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(1997, UCAL_AUGUST, 12); // Wednesday
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // cal.getTime(); // Force update
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setLenient(lenient);
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(1996, UCAL_DECEMBER, 1); // Set the date to be December 1, 1996
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t dow = cal->get(UCAL_DAY_OF_WEEK, status);
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t min = cal->getMinimum(UCAL_DAY_OF_WEEK);
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t max = cal->getMaximum(UCAL_DAY_OF_WEEK);
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //logln(cal.getTime().toString());
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (min != UCAL_SUNDAY || max != UCAL_SATURDAY)
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: Min/max bad");
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dow < min || dow > max)
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: Day of week %d out of range [%d,%d]\n", dow, min, max);
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dow != UCAL_SUNDAY)
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("FAIL: Day of week should be SUNDAY Got ") + dow);
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      errln("Error checking Calendar: %s", u_errorName(status));
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(cal->getActualMinimum(UCAL_DAY_OF_WEEK, status) != min) {
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: actual minimum differs from minimum");
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(cal->getActualMinimum(Calendar::DAY_OF_WEEK, status) != min) {
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: actual minimum (Calendar::DAY_OF_WEEK, status) differs from minimum");
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(cal->getActualMinimum(Calendar::DAY_OF_WEEK) != min) {
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: actual minimum (Calendar::DAY_OF_WEEK) differs from minimum");
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(((Calendar*)cal)->getActualMinimum(UCAL_DAY_OF_WEEK, status) != min) {
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: actual minimum (UCAL_DAY_OF_WEEK, status) differs from minimum");
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// NOTE: This function does not exist!  jitterbug #3016
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    if(((Calendar*)cal)->getActualMinimum(Calendar::DAY_OF_WEEK, status) != min) {
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//        errln("FAIL: actual minimum (Calendar::DAY_OF_WEEK, status) differs from minimum");
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    }
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      errln("Error getting actual minimum: %s", u_errorName(status));
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4071385
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4071385()
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = Calendar::createInstance(status);
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setTime(makeDate(1998, UCAL_JUNE, 24),status);
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_MONTH, UCAL_NOVEMBER); // change a field
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //logln(cal.getTime().toString());
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getTime(status) != makeDate(1998, UCAL_NOVEMBER, 24))
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail");
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4073929
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4073929()
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *foo1 = new GregorianCalendar(1997, 8, 27,status);
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating Calendar: %s", u_errorName(status));
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete foo1;
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("foo1@%.0f - %d-%d-%d %d:%d:%d.%ds\n", foo1->getTime(status),
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_YEAR, status),
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MONTH, status),
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_DATE, status),
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_HOUR, status),
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MINUTE, status),
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_SECOND, status),
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MILLISECOND,status));
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    foo1->add(UCAL_DATE, + 1, status);
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("foo1@%.0f - %d-%d-%d %d:%d:%d.%ds after +\n", foo1->getTime(status),
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_YEAR, status),
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MONTH, status),
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_DATE, status),
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_HOUR, status),
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MINUTE, status),
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_SECOND, status),
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MILLISECOND ,status));
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    foo1->add(UCAL_DATE, - 1, status);
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("foo1@%.0f - %d-%d-%d %d:%d:%d.%ds after -\n", foo1->getTime(status),
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_YEAR, status),
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MONTH, status),
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_DATE, status),
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_HOUR, status),
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MINUTE, status),
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_SECOND, status),
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          foo1->get(UCAL_MILLISECOND, status));
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    foo1->add(UCAL_DATE, + 1, status);
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t testyear = foo1->get(UCAL_YEAR, status);
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t testmonth = foo1->get(UCAL_MONTH, status);
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t testday = foo1->get(UCAL_DATE, status);
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (testyear != 1997 ||
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testmonth != 8 ||
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testday != 28)
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Calendar not initialized");
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete foo1;
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4083167
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4083167()
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *saveZone = TimeZone::createDefault();
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //try {
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *newZone = TimeZone::createTimeZone("UTC");
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone::setDefault(*newZone);
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate firstDate = Calendar::getNow();
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Calendar *cal = new GregorianCalendar(status);
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status)) {
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          dataerrln("Error creating Calendar: %s", u_errorName(status));
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          delete cal;
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          return;
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->setTime(firstDate,status);
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t hr        = cal->get(UCAL_HOUR_OF_DAY, status);
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t min        = cal->get(UCAL_MINUTE, status);
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t sec        = cal->get(UCAL_SECOND, status);
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t msec    = cal->get(UCAL_MILLISECOND, status);
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        double firstMillisInDay = hr * 3600000 + min * 60000 + sec * 1000 + msec;
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //logln("Current time: " + firstDate.toString());
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (int32_t validity=0; validity<30; validity++) {
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate lastDate = firstDate + validity*1000*24*60*60.0;
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal->setTime(lastDate, status);
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            hr        = cal->get(UCAL_HOUR_OF_DAY, status);
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            min        = cal->get(UCAL_MINUTE, status);
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            sec        = cal->get(UCAL_SECOND, status);
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            msec    = cal->get(UCAL_MILLISECOND, status);
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            double millisInDay = hr * 3600000.0 + min * 60000.0 + sec * 1000.0 + msec;
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (firstMillisInDay != millisInDay)
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln(UnicodeString("Day has shifted ") + lastDate);
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //finally {
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TimeZone::setDefault(*saveZone);
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete saveZone;
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete newZone;
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4086724
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4086724()
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat *date;
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *saveZone = TimeZone::createDefault();
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Locale saveLocale = Locale::getDefault();
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //try {
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Locale::setDefault(Locale::getUK(),status);
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *newZone = TimeZone::createTimeZone("GMT");
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone::setDefault(*newZone);
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        date = new SimpleDateFormat(UnicodeString("dd MMM yyy (zzzz) 'is in week' ww"),status);
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Calendar *cal = Calendar::createInstance(status);
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status)) {
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          dataerrln("Error creating Calendar: %s", u_errorName(status));
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          delete cal;
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          delete newZone;
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          delete date;
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          return;
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(1997,UCAL_SEPTEMBER,30);
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate now = cal->getTime(status);
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString temp;
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        FieldPosition pos(FieldPosition::DONT_CARE);
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(date->format(now, temp, pos));
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(1997,UCAL_JANUARY,1);
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        now=cal->getTime(status);
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(date->format(now,temp, pos));
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(1997,UCAL_JANUARY,8);
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        now=cal->getTime(status);
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(date->format(now,temp, pos));
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(1996,UCAL_DECEMBER,31);
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        now=cal->getTime(status);
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(date->format(now,temp, pos));
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //finally {
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Locale::setDefault(saveLocale,status);
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TimeZone::setDefault(*saveZone);
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln("*** THE RESULTS OF THIS TEST MUST BE VERIFIED MANUALLY ***");
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdelete newZone;
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdelete cal;
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdelete date;
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgdelete saveZone;
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4092362
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4092362() {
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal1 = new GregorianCalendar(1997, 10, 11, 10, 20, 40,status);
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Fail new GregorianCalendar: %s", u_errorName(status));
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal1;
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*cal1.set( Calendar::YEAR, 1997 );
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1.set( Calendar::MONTH, 10 );
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1.set( Calendar::DATE, 11 );
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1.set( Calendar::HOUR, 10 );
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1.set( Calendar::MINUTE, 20 );
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1.set( Calendar::SECOND, 40 ); */
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln( UnicodeString(" Cal1 = ") + cal1->getTime(status) );
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln( UnicodeString(" Cal1 time in ms = ") + cal1->get(UCAL_MILLISECOND,status) );
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t k = 0; k < 100 ; k++)
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ;
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal2 = new GregorianCalendar(1997, 10, 11, 10, 20, 40,status);
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*cal2.set( Calendar::YEAR, 1997 );
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2.set( Calendar::MONTH, 10 );
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2.set( Calendar::DATE, 11 );
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2.set( Calendar::HOUR, 10 );
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2.set( Calendar::MINUTE, 20 );
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2.set( Calendar::SECOND, 40 ); */
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln( UnicodeString(" Cal2 = ") + cal2->getTime(status) );
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln( UnicodeString(" Cal2 time in ms = ") + cal2->get(UCAL_MILLISECOND,status) );
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( *cal1 != *cal2 )
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Milliseconds randomized");
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal1;
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal2;
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4095407
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4095407()
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *a = new GregorianCalendar(1997,UCAL_NOVEMBER, 13,status);
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Fail new GregorianCalendar: %s", u_errorName(status));
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete a;
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t dow = a->get(UCAL_DAY_OF_WEEK, status);
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (dow != UCAL_THURSDAY)
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("Fail: Want THURSDAY Got ") + dow);
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete a;
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4096231
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4096231()
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *GMT = TimeZone::createTimeZone("GMT");
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *PST = TimeZone::createTimeZone("PST");
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t sec = 0, min = 0, hr = 0, day = 1, month = 10, year = 1997;
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal1 = new GregorianCalendar(*PST,status);
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Failure new GregorianCalendar: %s", u_errorName(status));
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete GMT;
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete PST;
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal1;
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1->setTime(880698639000.0,status);
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Issue 1: Changing the timezone doesn't change the
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //          represented time.  The old API, pre 1.2.2a requires
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // setTime to be called in order to update the time fields after the time
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // zone has been set.
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t h1,h2;
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("PST 1 is: ") + (h1=cal1->get(UCAL_HOUR_OF_DAY, status)));
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal1->setTimeZone(*GMT);
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("GMT 2 is: ") + (h2=cal1->get(UCAL_HOUR_OF_DAY, status)));
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ((*GMT != *PST) && (h1 == h2))
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Hour same in different zones");
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal2 = new GregorianCalendar(*GMT,status);
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal3 = new GregorianCalendar(*PST,status);
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2->set(UCAL_MILLISECOND, 0);
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal3->set(UCAL_MILLISECOND, 0);
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2->set(cal1->get(UCAL_YEAR,status),
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_MONTH,status),
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_DATE,status),
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_HOUR_OF_DAY,status),
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_MINUTE,status),
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_SECOND,status));
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double t1,t2,t3,t4;
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("RGMT 1 is: ") + (t1=cal2->getTime(status)));
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal3->set(year, month, day, hr, min, sec);
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("RPST 1 is: ") + (t2=cal3->getTime(status)));
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal3->setTimeZone(*GMT);
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("RGMT 2 is: ") + (t3=cal3->getTime(status)));
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal3->set(cal1->get(UCAL_YEAR,status),
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_MONTH,status),
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_DATE,status),
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_HOUR_OF_DAY,status),
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_MINUTE,status),
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             cal1->get(UCAL_SECOND,status));
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Issue 2: Calendar continues to use the timezone in its
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //          constructor for set() conversions, regardless
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //          of calls to setTimeZone()
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("RGMT 3 is: ") + (t4=cal3->getTime(status)));
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (t1 == t2 ||
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        t1 != t4 ||
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        t2 != t3)
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Calendar zone behavior faulty");
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal1;
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal2;
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal3;
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete GMT;
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete PST;
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4096539
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4096539()
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t y [] = {31,28,31,30,31,30,31,31,30,31,30,31};
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t x=0;x<12;x++) {
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        GregorianCalendar *gc = new
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            GregorianCalendar(1997,x,y[x], status);
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataerrln("Fail new GregorianCalendar: %s", u_errorName(status));
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete gc;
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t m1,m2;
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log(UnicodeString("") + (m1=gc->get(UCAL_MONTH,status)+1)+UnicodeString("/")+
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         gc->get(UCAL_DATE,status)+"/"+gc->get(UCAL_YEAR,status)+
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         " + 1mo = ");
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        gc->add(UCAL_MONTH, 1,status);
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("") + (m2=gc->get(UCAL_MONTH,status)+1)+UnicodeString("/")+
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           gc->get(UCAL_DATE,status)+"/"+gc->get(UCAL_YEAR,status)
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           );
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t m = (m1 % 12) + 1;
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (m2 != m)
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString("Fail: Want ") + m + " Got " + m2);
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete gc;
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4100311
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test41003112()
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = (GregorianCalendar*)Calendar::createInstance(status);
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar: %s", u_errorName(status));
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_YEAR, 1997);
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_DAY_OF_YEAR, 1);
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //UDate d = cal->getTime(status);             // Should be Jan 1
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //logln(d.toString());
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->get(UCAL_DAY_OF_YEAR, status) != 1)
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: DAY_OF_YEAR not set");
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4103271
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4103271()
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat sdf(status);
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t numYears=40, startYear=1997, numDays=15;
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString output, testDesc, str, str2;
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *testCal = (GregorianCalendar*)Calendar::createInstance(status);
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar: %s", u_errorName(status));
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete testCal;
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testCal->clear();
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sdf.adoptCalendar(testCal);
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sdf.applyPattern("EEE dd MMM yyyy 'WOY'ww'-'YYYY 'DOY'DDD");
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool fail = FALSE;
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t firstDay=1; firstDay<=2; firstDay++) {
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (int32_t minDays=1; minDays<=7; minDays++) {
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->setMinimalDaysInFirstWeek((uint8_t)minDays);
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->setFirstDayOfWeek((UCalendarDaysOfWeek)firstDay);
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testDesc = (UnicodeString("Test") + firstDay + minDays);
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(testDesc + " => 1st day of week=" +
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               firstDay +
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               ", minimum days in first week=" +
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               minDays);
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (int32_t j=startYear; j<=startYear+numYears; j++) {
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                testCal->set(j,11,25);
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for(int32_t i=0; i<numDays; i++) {
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    testCal->add(UCAL_DATE,1,status);
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UnicodeString calWOY;
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    int32_t actWOY = testCal->get(UCAL_WEEK_OF_YEAR,status);
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (actWOY < 1 || actWOY > 53) {
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        UDate d = testCal->getTime(status);
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        //calWOY = String.valueOf(actWOY);
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        UnicodeString temp;
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        FieldPosition pos(FieldPosition::DONT_CARE);
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        output = testDesc + " - " + sdf.format(d,temp,pos) + "\t";
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        output = output + "\t" + actWOY;
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        logln(output);
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fail = TRUE;
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DATA [] = {
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        3, 52, 52, 52, 52, 52, 52, 52,
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1,  1,  1,  1,  1,  1,  1,
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            2,  2,  2,  2,  2,  2,  2,
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        4, 52, 52, 52, 52, 52, 52, 52,
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           53, 53, 53, 53, 53, 53, 53,
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            1,  1,  1,  1,  1,  1,  1,
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testCal->setFirstDayOfWeek(UCAL_SUNDAY);
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t j=0; j<44; j+=22) {
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("Minimal days in first week = ") + DATA[j] +
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           "  Week starts on Sunday");
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->setMinimalDaysInFirstWeek((uint8_t)DATA[j]);
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(1997, UCAL_DECEMBER, 21);
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (int32_t i=0; i<21; ++i) {
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t woy = testCal->get(UCAL_WEEK_OF_YEAR,status);
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str.remove();
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log(UnicodeString("") + sdf.format(testCal->getTime(status), str) +
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UnicodeString(" ") + woy);
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (woy != DATA[j + 1 + i]) {
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log(" ERROR");
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fail = TRUE;
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln("");
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // Now compute the time from the fields, and make sure we
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // get the same answer back.  This is a round-trip test.
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate save = testCal->getTime(status);
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->clear();
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->set(UCAL_YEAR_WOY, DATA[j+1+i] < 25 ? 1998 : 1997);
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->set(UCAL_WEEK_OF_YEAR, DATA[j+1+i]);
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->set(UCAL_DAY_OF_WEEK, (i%7) + UCAL_SUNDAY);
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (testCal->getTime(status) != save) {
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                str.remove();
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                logln(UnicodeString("  Parse failed: ") +
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      sdf.format(testCal->getTime(status), str));
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fail= TRUE;
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->setTime(save,status);
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->add(UCAL_DATE, 1,status);
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Test field disambiguation with a few special hard-coded cases.
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // This shouldn't fail if the above cases aren't failing.
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DISAM_int [] = {
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // y y_woy woy dow
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1997, 1998, 1, UCAL_SUNDAY,
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (1998), (1998), (2), (UCAL_SATURDAY),
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (1998), (1998), (53), (UCAL_THURSDAY),
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (1999), (1998), (53), (UCAL_FRIDAY)
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate DISAM_date [] = {
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            makeDate(1997, UCAL_DECEMBER, 28),
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            makeDate(1998, UCAL_JANUARY, 10),
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            makeDate(1998, UCAL_DECEMBER, 31),
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            makeDate(1999, UCAL_JANUARY, 1)
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testCal->setMinimalDaysInFirstWeek(3);
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testCal->setFirstDayOfWeek(UCAL_SUNDAY);
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i = 0;
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Enable this code to display various WOY values
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testCal->clear();
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=25; i<38; ++i) {
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(1996, Calendar::DECEMBER, i);
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate got = testCal->getTime(status);
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str.remove();
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("") + sdf.format(got, str));
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=25; i<38; ++i) {
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(1997, Calendar::DECEMBER, i);
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate got = testCal->getTime(status);
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str.remove();
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("") + sdf.format(got, str));
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=25; i<38; ++i) {
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(1998, UCAL_DECEMBER, i);
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate got = testCal->getTime(status);
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str.remove();
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("") + sdf.format(got, str));
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    */
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i < 16; i += 4) {
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t y = DISAM_int[i];
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t ywoy = DISAM_int[i+1];
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t woy = DISAM_int[i+2];
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t dow = DISAM_int[i+3];
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate exp = DISAM_date[i/4];
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->clear();
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(UCAL_YEAR, y);
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(UCAL_WEEK_OF_YEAR, woy);
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(UCAL_DAY_OF_WEEK, dow);
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate got = testCal->getTime(status);
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str.remove();
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str2.remove();
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log(UnicodeString("Y") + y + "-W" + woy +
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         "-DOW" + dow + " expect:" + sdf.format(exp, str) +
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         " got:" + sdf.format(got, str2));
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (got != exp) {
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log("  FAIL (%s:%d, i=%d)", __FILE__, __LINE__, i);
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(CalendarTest::calToStr(*testCal));
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->setTime(exp, status);
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(CalendarTest::calToStr(*testCal) + UnicodeString( " <<< expected "));
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fail = TRUE;
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("");
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->clear();
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(UCAL_YEAR_WOY, ywoy);
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(UCAL_WEEK_OF_YEAR, woy);
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->set(UCAL_DAY_OF_WEEK, dow);
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        got = testCal->getTime(status);
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str.remove();
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str2.remove();
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log(UnicodeString("YWOY") + ywoy + "-W" + woy +
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         "-DOW" + dow + " expect:" + sdf.format(exp, str) +
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         " got:" + sdf.format(got, str2));
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (got != exp) {
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log("  FAIL");
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fail = TRUE;
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("");
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Now try adding and rolling
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate ADDROLL_date [] = {
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        makeDate(1998, UCAL_DECEMBER, 25), makeDate(1999, UCAL_JANUARY, 1),
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        makeDate(1997, UCAL_DECEMBER, 28), makeDate(1998, UCAL_JANUARY, 4),
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        makeDate(1998, UCAL_DECEMBER, 27), makeDate(1997, UCAL_DECEMBER, 28),
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        makeDate(1999, UCAL_JANUARY, 2), makeDate(1998, UCAL_JANUARY, 3),
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t ADDROLL_int []= {
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (1),
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (1),
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (1),
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (1)
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool ADDROLL_bool [] = {
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TRUE,//ADD,
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TRUE,
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        FALSE,
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        FALSE
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testCal->setMinimalDaysInFirstWeek(3);
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testCal->setFirstDayOfWeek(UCAL_SUNDAY);
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<8; i += 2) {
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t amount = ADDROLL_int[i/2];
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate before = ADDROLL_date[i];
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate after = ADDROLL_date[i+1];
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->setTime(before,status);
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ADDROLL_bool[i/2])
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->add(UCAL_WEEK_OF_YEAR, amount,status);
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->roll(UCAL_WEEK_OF_YEAR, amount,status);
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate got = testCal->getTime(status);
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str.remove();
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str2.remove();
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString opTypeStr;
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ADDROLL_bool[i/2]) {
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            opTypeStr = UnicodeString("add(WOY,", "");
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            opTypeStr = UnicodeString("roll(WOY,", "");
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log(opTypeStr + amount + ") " + sdf.format(before, str) + " => " +
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    sdf.format(got, str2));
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (after != got) {
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str.remove();
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(UnicodeString("  exp:") + sdf.format(after, str) + "  FAIL");
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fail = TRUE;
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else logln(" ok");
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        testCal->setTime(after,status);
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ADDROLL_bool[i/2])
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->add(UCAL_WEEK_OF_YEAR, -amount,status);
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            testCal->roll(UCAL_WEEK_OF_YEAR, -amount,status);
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        got = testCal->getTime(status);
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str.remove();
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        str2.remove();
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log(opTypeStr + (-amount) + ") " + sdf.format(after, str) + " => " +
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sdf.format(got, str2));
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (before != got) {
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            str.remove();
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(UnicodeString("  exp:") + sdf.format(before, str) + "  FAIL");
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fail = TRUE;
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else logln(" ok");
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fail)
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Week of year misbehaving");
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4106136
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4106136()
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Locale saveLocale = Locale::getDefault();
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //try {
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Locale locales [] = { Locale::getChinese(), Locale::getChina() };
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (int32_t i=0; i<2; ++i) {
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            Locale::setDefault(locales[i], status);
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            failure(status, "Locale::setDefault");
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t count1, count2, count3;
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            Calendar::getAvailableLocales(count1);
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            DateFormat::getAvailableLocales(count2);
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            NumberFormat::getAvailableLocales(count3);
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t n [] = {
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                count1, count2, count3
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            };
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (int32_t j=0; j<3; ++j) {
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UnicodeString temp;
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (n[j] == 0)
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    dataerrln(UnicodeString("Fail: No locales for ") + locales[i].getName());
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //finally {
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Locale::setDefault(saveLocale,status);
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4108764
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4108764()
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = Calendar::createInstance(status);
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d00 = makeDate(1997, UCAL_MARCH, 15, 12, 00, 00);
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d01 = makeDate(1997, UCAL_MARCH, 15, 12, 00, 56);
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d10 = makeDate(1997, UCAL_MARCH, 15, 12, 34, 00);
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d11 = makeDate(1997, UCAL_MARCH, 15, 12, 34, 56);
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate epoch = makeDate(1970, UCAL_JANUARY, 1);
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setTime(d11,status);
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->clear( UCAL_MINUTE );
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("") + cal->getTime(status));
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getTime(status)  != d01)
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: clear(MINUTE) broken");
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set( UCAL_SECOND, 0 );
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("") + cal->getTime(status));
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getTime(status)  != d00)
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: set(SECOND, 0) broken");
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setTime(d11,status);
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set( UCAL_SECOND, 0 );
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("") + cal->getTime(status));
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getTime(status)  != d10)
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: set(SECOND, 0) broken #2");
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->clear( UCAL_MINUTE );
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("") + cal->getTime(status));
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getTime(status)  != d00)
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: clear(MINUTE) broken #2");
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->clear();
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("") + cal->getTime(status));
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getTime(status)  != epoch)
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln(UnicodeString("Fail: clear() broken Want ") + epoch);
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4114578
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4114578()
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double ONE_HOUR = 60*60*1000;
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = Calendar::createInstance(status);
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->adoptTimeZone(TimeZone::createTimeZone("PST"));
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate onset = makeDate(1998, UCAL_APRIL, 5, 1, 0) + ONE_HOUR;
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate cease = makeDate(1998, UCAL_OCTOBER, 25, 0, 0) + 2*ONE_HOUR;
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool fail = FALSE;
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t ADD = 1;
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t ROLL = 2;
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double DATA []= {
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Start            Action   Amt    Expected_change
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        onset - ONE_HOUR,   ADD,      1,     ONE_HOUR,
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        onset,              ADD,     -1,    -ONE_HOUR,
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        onset - ONE_HOUR,   ROLL,     1,     ONE_HOUR,
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        onset,              ROLL,    -1,    -ONE_HOUR,
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cease - ONE_HOUR,   ADD,      1,     ONE_HOUR,
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cease,              ADD,     -1,    -ONE_HOUR,
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cease - ONE_HOUR,   ROLL,     1,     ONE_HOUR,
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cease,              ROLL,    -1,    -ONE_HOUR,
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i=0; i<32; i+=4) {
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate date = DATA[i];
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t amt = (int32_t) DATA[i+2];
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        double expectedChange = DATA[i+3];
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log(UnicodeString("") + date);
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->setTime(date,status);
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        switch ((int32_t) DATA[i+1]) {
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case ADD:
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log(UnicodeString(" add (HOUR,") + (amt<0?"":"+")+amt + ")= ");
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal->add(UCAL_HOUR, amt,status);
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case ROLL:
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log(UnicodeString(" roll(HOUR,") + (amt<0?"":"+")+amt + ")= ");
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal->roll(UCAL_HOUR, amt,status);
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log(UnicodeString("") + cal->getTime(status));
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        double change = cal->getTime(status) - date;
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (change != expectedChange) {
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            fail = TRUE;
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(" FAIL");
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        else logln(" OK");
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fail) errln("Fail: roll/add misbehaves around DST onset/cease");
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4118384
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Make sure maximum for HOUR field is 11, not 12.
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4118384()
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = Calendar::createInstance(status);
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getMaximum(UCAL_HOUR) != 11 ||
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getLeastMaximum(UCAL_HOUR) != 11 ||
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getActualMaximum(UCAL_HOUR,status) != 11)
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: maximum of HOUR field should be 11");
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test deprecated functions
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getLeastMaximum(Calendar::HOUR) != 11 ||
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getMaximum(Calendar::HOUR) != 11) {
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: [deprecated functions] maximum of HOUR field should be 11\n");
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getGreatestMinimum(Calendar::HOUR) != 0 ||
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getMinimum(Calendar::HOUR) != 0) {
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: [deprecated functions] minimum of HOUR field should be 1\n");
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal = Calendar::createInstance(Locale("th_TH@calendar=buddhist"),status);
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test deprecated functions
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getLeastMaximum(Calendar::HOUR) != 11 ||
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getMaximum(Calendar::HOUR) != 11) {
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Buddhist:[deprecated functions] maximum of HOUR field should be 11\n");
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getGreatestMinimum(Calendar::HOUR) != 0 ||
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getMinimum(Calendar::HOUR) != 0) {
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Buddhist:[deprecated functions] minimum of HOUR field should be 1\n");
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // test deprecated functions
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal = Calendar::createInstance(Locale("ja_JP@calendar=japanese"),status);
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getLeastMaximum(Calendar::HOUR) != 11 ||
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getMaximum(Calendar::HOUR) != 11) {
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Japanese:[deprecated functions] maximum of HOUR field should be 11\n");
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->getGreatestMinimum(Calendar::HOUR) != 0 ||
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->getMinimum(Calendar::HOUR) != 0) {
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Japanese:[deprecated functions] minimum of HOUR field should be 1\n");
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4125881
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Check isLeapYear for BC years.
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4125881()
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = (GregorianCalendar*) Calendar::createInstance(status);
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"),status);
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating SimpleDateFormat - %s", u_errorName(status));
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->clear();
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t y=-20; y<=10; ++y) {
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(UCAL_ERA, y < 1 ? GregorianCalendar::BC : GregorianCalendar::AD);
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(UCAL_YEAR, y < 1 ? 1 - y : y);
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString temp;
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("") + y + UnicodeString(" = ") + fmt->format(cal->getTime(status), temp) + " " +
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           cal->isLeapYear(y));
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (cal->isLeapYear(y) != ((y+40)%4 == 0))
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Leap years broken");
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fmt;
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4125892
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Prove that GregorianCalendar is proleptic (it used to cut off
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * at 45 BC, and not have leap years before then).
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4125892() {
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = (GregorianCalendar*) Calendar::createInstance(status);
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *fmt = new SimpleDateFormat(UnicodeString("MMMM d, yyyy G"),status);
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating SimpleDateFormat - %s", u_errorName(status));
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->clear();
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_ERA, GregorianCalendar::BC);
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_YEAR, 81); // 81 BC is a leap year (proleptically)
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_MONTH, UCAL_FEBRUARY);
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_DATE, 28);
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->add(UCAL_DATE, 1,status);
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("add(DATE,1) failed");
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal->get(UCAL_DATE,status) != 29 ||
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        !cal->isLeapYear(-80)) // -80 == 81 BC
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Calendar not proleptic");
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete fmt;
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4141665
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * GregorianCalendar::equals() ignores cutover date
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4141665()
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = new GregorianCalendar(status);
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete cal;
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal2 = (GregorianCalendar*)cal->clone();
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate cut = cal->getGregorianChange();
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate cut2 = cut + 100*24*60*60*1000.0; // 100 days later
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (*cal != *cal2) {
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Cloned GregorianCalendars not equal");
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal2->setGregorianChange(cut2,status);
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( *cal == *cal2) {
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("GregorianCalendar::equals() ignores cutover");
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal2;
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4142933
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Bug states that ArrayIndexOutOfBoundsException is thrown by GregorianCalendar::roll()
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * when IllegalArgumentException should be.
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4142933()
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *calendar = new GregorianCalendar(status);
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete calendar;
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //try {
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->roll((UCalendarDateFields)-1, TRUE, status);
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_SUCCESS(status))
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Test failed, no exception thrown");
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //catch (IllegalArgumentException e) {
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // OK: Do nothing
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // logln("Test passed");
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //catch (Exception e) {
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //errln("Test failed. Unexpected exception is thrown: " + e);
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //e.printStackTrace();
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //}
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendar;
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4145158
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * GregorianCalendar handling of Dates Long.MIN_VALUE and Long.MAX_VALUE is
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * confusing; unless the time zone has a raw offset of zero, one or the
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * other of these will wrap.  We've modified the test given in the bug
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * report to therefore only check the behavior of a calendar with a zero raw
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * offset zone.
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4145158()
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *calendar = new GregorianCalendar(status);
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_USING_FALLBACK_WARNING || U_FAILURE(status)) {
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete calendar;
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->adoptTimeZone(TimeZone::createTimeZone("GMT"));
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->setTime(makeDate(INT32_MIN),status);
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t year1 = calendar->get(UCAL_YEAR,status);
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t era1 = calendar->get(UCAL_ERA,status);
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->setTime(makeDate(INT32_MAX),status);
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t year2 = calendar->get(UCAL_YEAR,status);
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t era2 = calendar->get(UCAL_ERA,status);
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (year1 == year2 && era1 == era2) {
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Fail: Long.MIN_VALUE or Long.MAX_VALUE wrapping around");
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendar;
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4145983
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Maximum value for YEAR field wrong.
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// {sfb} this is not directly applicable in C++, since all
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// possible doubles are not representable by our Calendar.
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// In Java, all longs are representable.
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// We can determine limits programmatically
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Using DBL_MAX is a bit of a hack, since for large doubles
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Calendar gets squirrely and doesn't behave in any sort
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// of linear fashion (ie years jump around, up/down, etc) for a
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// small change in millis.
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4145983()
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *calendar = new GregorianCalendar(status);
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete calendar;
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->adoptTimeZone(TimeZone::createTimeZone("GMT"));
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate DATES [] = { LATEST_SUPPORTED_MILLIS, EARLIEST_SUPPORTED_MILLIS };
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i=0; i<2; ++i) {
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->setTime(DATES[i], status);
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t year = calendar->get(UCAL_YEAR,status);
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t maxYear = calendar->getMaximum(UCAL_YEAR);
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (year > maxYear) {
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString("Failed for ")+DATES[i]+" ms: year=" +
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  year + ", maxYear=" + maxYear);
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendar;
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4147269
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is a bug in the validation code of GregorianCalendar::  As reported,
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the bug seems worse than it really is, due to a bug in the way the bug
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * report test was written.  In reality the bug is restricted to the DAY_OF_YEAR
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * field. - liu 6/29/98
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::test4147269()
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *calendar = new GregorianCalendar(status);
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status == U_USING_FALLBACK_WARNING || U_FAILURE(status)) {
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(status));
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete calendar;
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->setLenient(FALSE);
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date = makeDate(1996, UCAL_JANUARY, 3); // Arbitrary date
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t field = 0; field < UCAL_FIELD_COUNT; field++) {
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->setTime(date,status);
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Note: In the bug report, getActualMaximum() was called instead
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // of getMaximum() -- this was an error.  The validation code doesn't
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // use getActualMaximum(), since that's too costly.
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t max = calendar->getMaximum((UCalendarDateFields)field);
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t value = max+1;
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->set((UCalendarDateFields)field, value);
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //try {
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            calendar->getTime(status); // Force time computation
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // We expect an exception to be thrown. If we fall through
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // to the next line, then we have a bug.
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_SUCCESS(status))
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString("Test failed with field ") + FIELD_NAME[field] +
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  ", date before: " + date +
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  ", date after: " + calendar->getTime(status) +
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  ", value: " + value + " (max = " + max +")");
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //} catch (IllegalArgumentException e) {}
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendar;
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4149677
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Reported bug is that a GregorianCalendar with a cutover of Date(Long.MAX_VALUE)
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * doesn't behave as a pure Julian calendar.
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * CANNOT REPRODUCE THIS BUG
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::Test4149677()
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *zones [] = {
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TimeZone::createTimeZone("GMT"),
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TimeZone::createTimeZone("PST"),
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TimeZone::createTimeZone("EAT")
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't create zones");
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // could leak memory
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i=0; i < 3; ++i) {
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        GregorianCalendar *calendar = new GregorianCalendar(zones[i], status);
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status)) {
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataerrln("Couldnt' create calendar.: %s", u_errorName(status));
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Make sure extreme values don't wrap around
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->setTime(EARLIEST_SUPPORTED_MILLIS, status);
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status))
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("setTime failed");
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (calendar->get(UCAL_ERA, status) != GregorianCalendar::BC || U_FAILURE(status)) {
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Fail: Date(EARLIEST_SUPPORTED_MILLIS) has an AD year");
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->setTime(LATEST_SUPPORTED_MILLIS, status);
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status))
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("setTime failed");
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (calendar->get(UCAL_ERA, status) != GregorianCalendar::AD || U_FAILURE(status)) {
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Fail: Date(LATEST_SUPPORTED_MILLIS) has a BC year");
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->setGregorianChange(LATEST_SUPPORTED_MILLIS, status);
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status))
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("setGregorianChange failed");
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // to obtain a pure Julian calendar
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UBool is100Leap = calendar->isLeapYear(100);
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!is100Leap) {
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UnicodeString temp;
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("test failed with zone " + zones[i]->getID(temp));
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(" cutover date is Date(Long.MAX_VALUE)");
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString(" isLeapYear(100) returns: ") + is100Leap);
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete calendar;
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // no need for cleanup- zones were adopted
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4162587
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Calendar and Date HOUR broken.  If HOUR is out-of-range, Calendar
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and Date classes will misbehave.
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::Test4162587()
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *savedef = TimeZone::createDefault();
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone *tz = TimeZone::createTimeZone("PST");
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //TimeZone::adoptDefault(tz);
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone::setDefault(*tz);
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = new GregorianCalendar(tz, status);
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Couldn't create calendar.: %s", u_errorName(status));
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d0, dPlus, dMinus;
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(int32_t i=0; i<5; ++i) {
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (i>0) logln("---");
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->clear();
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(1998, UCAL_APRIL, 5, i, 0);
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        d0 = cal->getTime(status);
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status))
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Coudln't get time (1)");
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //String s0 = d.toString();
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("0 ") + i + ": " + d0/*s0*/);
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->clear();
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(1998, UCAL_APRIL, 4, i+24, 0);
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dPlus = cal->getTime(status);
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status))
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Coudln't get time (2)");
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //String sPlus = d.toString();
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("+ ") + i + ": " + dPlus/*sPlus*/);
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->clear();
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(1998, UCAL_APRIL, 6, i-24, 0);
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dMinus = cal->getTime(status);
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status))
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Coudln't get time (3)");
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        //String sMinus = d.toString();
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("- ") + i + ": " + dMinus/*sMinus*/);
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (d0 != dPlus || d0 != dMinus) {
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Fail: All three lines must match");
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    TimeZone::setDefault(*savedef);
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //delete tz;
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete savedef;
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4165343
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Adding 12 months behaves differently from adding 1 year
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::Test4165343()
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *calendar = new GregorianCalendar(1996, UCAL_FEBRUARY, 29, status);
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Couldn't create calendar.: %s", u_errorName(status));
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate start = calendar->getTime(status);
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't getTime (1)");
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("init date: ") + start);
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->add(UCAL_MONTH, 12, status);
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't add(MONTH, 12)");
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1 = calendar->getTime(status);
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't getTime (2)");
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("after adding 12 months: ") + date1);
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->setTime(start, status);
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't setTime");
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->add(UCAL_YEAR, 1, status);
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't add(YEAR, 1)");
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date2 = calendar->getTime(status);
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't getTime (3)");
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("after adding one year : ") + date2);
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (date1 == date2) {
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("Test passed");
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Test failed");
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendar;
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4166109
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * GregorianCalendar.getActualMaximum() does not account for first day of week.
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::Test4166109()
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test month:
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *      March 1998
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Su Mo Tu We Th Fr Sa
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  1  2  3  4  5  6  7
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  8  9 10 11 12 13 14
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 15 16 17 18 19 20 21
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 22 23 24 25 26 27 28
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 29 30 31
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool passed = TRUE;
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendarDateFields field = UCAL_WEEK_OF_MONTH;
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *calendar = new GregorianCalendar(Locale::getUS(), status);
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Couldn't create calendar.: %s", u_errorName(status));
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->set(1998, UCAL_MARCH, 1);
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calendar->setMinimalDaysInFirstWeek(1);
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("Date:  ") + calendar->getTime(status)); // 888817448000
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t firstInMonth = calendar->get(UCAL_DATE, status);
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("get(D_O_M) failed");
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(int32_t firstInWeek = UCAL_SUNDAY; firstInWeek <= UCAL_SATURDAY; firstInWeek++) {
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        calendar->setFirstDayOfWeek((UCalendarDaysOfWeek)firstInWeek);
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t returned = calendar->getActualMaximum(field, status);
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t expected = (31 + ((firstInMonth - firstInWeek + 7)% 7) + 6) / 7;
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("First day of week = ") + firstInWeek +
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "  getActualMaximum(WEEK_OF_MONTH, status) = " + returned +
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              "  expected = " + expected +
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              ((returned == expected) ? "  ok" : "  FAIL"));
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (returned != expected) {
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            passed = FALSE;
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!passed) {
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Test failed");
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendar;
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @bug 4167060
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Calendar.getActualMaximum(YEAR) works wrong.
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::Test4167060()
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendarDateFields field = UCAL_YEAR;
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat *format = new SimpleDateFormat(UnicodeString("EEE MMM dd HH:mm:ss zzz yyyy G"),
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Locale::getUS(), status);
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Couldn't create SimpleDateFormat - %s", u_errorName(status));
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *calendars [] = {
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        new GregorianCalendar(100, UCAL_NOVEMBER, 1, status),
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        new GregorianCalendar(-99 /*100BC*/, UCAL_JANUARY, 1, status),
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        new GregorianCalendar(1996, UCAL_FEBRUARY, 29, status),
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't create GregorianCalendars");
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // could leak
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString id [] = { "Hybrid", "Gregorian", "Julian" };
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t k=0; k<3; ++k) {
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln("--- " + id[k] + " ---");
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (int32_t j=0; j < 3; ++j) {
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            GregorianCalendar *calendar = calendars[j];
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (k == 1) {
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                calendar->setGregorianChange(EARLIEST_SUPPORTED_MILLIS, status);
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            else if (k == 2) {
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                calendar->setGregorianChange(LATEST_SUPPORTED_MILLIS, status);
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(status))
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("setGregorianChange() failed");
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            format->adoptCalendar((Calendar*)calendar->clone());
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate dateBefore = calendar->getTime(status);
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(status))
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln("getTime() failed");
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t maxYear = calendar->getActualMaximum(field, status);
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UnicodeString temp;
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(UnicodeString("maxYear: ") + maxYear + " for " + format->format(calendar->getTime(status), temp));
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            temp.remove();
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln("date before: " + format->format(dateBefore, temp));
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t years[] = {2000, maxYear-1, maxYear, maxYear+1};
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (int32_t i = 0; i < 4; i++) {
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBool valid = years[i] <= maxYear;
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                calendar->set(field, years[i]);
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UDate dateAfter = calendar->getTime(status);
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(U_FAILURE(status))
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln("getTime() failed");
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t newYear = calendar->get(field, status);
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(U_FAILURE(status))
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln(UnicodeString("get(") + (int32_t)field + ") failed");
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                calendar->setTime(dateBefore, status); // restore calendar for next use
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if(U_FAILURE(status))
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln("setTime() failed");
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                temp.remove();
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                logln(UnicodeString(" Year ") + years[i] + (valid? " ok " : " bad") +
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      " => " + format->format(dateAfter, temp));
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (valid && newYear != years[i]) {
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln(UnicodeString("  FAIL: ") + newYear + " should be valid; date, month and time shouldn't change");
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                // {sfb} this next line is a hack, but it should work since if a
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                // double has an exponent, adding 1 should not yield the same double
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                else if (!valid && /*newYear == years[i]*/ dateAfter + 1.0 == dateAfter)  {
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln(UnicodeString("  FAIL: ") + newYear + " should be invalid");
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete format;
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendars[0];
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendars[1];
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete calendars[2];
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Week of year is wrong at the start and end of the year.
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::Test4197699() {
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar cal(status);
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal.setFirstDayOfWeek(UCAL_MONDAY);
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal.setMinimalDaysInFirstWeek(4);
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat fmt("E dd MMM yyyy  'DOY='D 'WOY='w",
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         Locale::getUS(), status);
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fmt.setCalendar(cal);
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Couldn't initialize test - %s", u_errorName(status));
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DATA[] = {
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2000,  UCAL_JANUARY,   1,   52,
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2001,  UCAL_DECEMBER,  31,  1,
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0]));
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString str;
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DateFormat& dfmt = *(DateFormat*)&fmt;
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t i=0; i<DATA_length; ) {
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.clear();
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.set(DATA[i], DATA[i+1], DATA[i+2]);
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        i += 3;
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t expWOY = DATA[i++];
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t actWOY = cal.get(UCAL_WEEK_OF_YEAR, status);
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (expWOY == actWOY) {
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(UnicodeString("Ok: ") + dfmt.format(cal.getTime(status), str.remove()));
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln(UnicodeString("FAIL: ") + dfmt.format(cal.getTime(status), str.remove())
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  + ", expected WOY=" + expWOY);
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.add(UCAL_DATE, -8, status);
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (int j=0; j<14; ++j) {
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                cal.add(UCAL_DATE, 1, status);
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                logln(dfmt.format(cal.getTime(status), str.remove()));
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("FAIL: Unexpected error from Calendar");
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum Action { ADD=1, ROLL=2 };
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum Sign { PLUS=1, MINUS=2 };
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define     ONE_HOUR (60*60*1000)
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ONE_DAY (24*ONE_HOUR)
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    typedef struct {
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCalendarDateFields field;
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int8_t actionMask; // ADD or ROLL or both
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int8_t signMask; // PLUS or MINUS or both
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t amount;
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t before; // ms before cutover
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t after;  // ms after cutover
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } J81_DATA;
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Rolling and adding across the Gregorian cutover should work as expected.
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Jitterbug 81.
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestJ81() {
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString temp, temp2, temp3;
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar cal(TimeZone::createTimeZone("GMT"), Locale::getUS(), status);
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat fmt("HH:mm 'w'w 'd'D E d MMM yyyy", Locale::getUS(), status);
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Error: Cannot create calendar or format - %s", u_errorName(status));
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fmt.setCalendar(cal);
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Get the Gregorian cutover
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate cutover = cal.getGregorianChange();
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate days = ONE_DAY;
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    days = cutover/days;
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    logln(UnicodeString("Cutover: {") +
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          fmt.format(cutover, temp) + "}(epoch days-" + (int)days + ", jd" + (2440588 + days) +")");
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Check woy and doy handling.  Reference data:
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* w40 d274 Mon 1 Oct 1582
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w40 d275 Tue 2 Oct 1582
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w40 d276 Wed 3 Oct 1582
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w40 d277 Thu 4 Oct 1582
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w40 d278 Fri 15 Oct 1582
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w40 d279 Sat 16 Oct 1582
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w41 d280 Sun 17 Oct 1582
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w41 d281 Mon 18 Oct 1582
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w41 d282 Tue 19 Oct 1582
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w41 d283 Wed 20 Oct 1582
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w41 d284 Thu 21 Oct 1582
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w41 d285 Fri 22 Oct 1582
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w41 d286 Sat 23 Oct 1582
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w42 d287 Sun 24 Oct 1582
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w42 d288 Mon 25 Oct 1582
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w42 d289 Tue 26 Oct 1582
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w42 d290 Wed 27 Oct 1582
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w42 d291 Thu 28 Oct 1582
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w42 d292 Fri 29 Oct 1582
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w42 d293 Sat 30 Oct 1582
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w43 d294 Sun 31 Oct 1582
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       w43 d295 Mon 1 Nov 1582 */
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DOY_DATA[] = {
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // dom, woy, doy
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1, 40, 274, UCAL_MONDAY,
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        4, 40, 277, UCAL_THURSDAY,
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        15, 40, 278, UCAL_FRIDAY,
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        17, 41, 280, UCAL_SUNDAY,
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        24, 42, 287, UCAL_SUNDAY,
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        25, 42, 288, UCAL_MONDAY,
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        26, 42, 289, UCAL_TUESDAY,
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        27, 42, 290, UCAL_WEDNESDAY,
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        28, 42, 291, UCAL_THURSDAY,
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        29, 42, 292, UCAL_FRIDAY,
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        30, 42, 293, UCAL_SATURDAY,
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        31, 43, 294, UCAL_SUNDAY
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DOY_DATA_length = (int32_t)(sizeof(DOY_DATA) / sizeof(DOY_DATA[0]));
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<DOY_DATA_length; i+=4) {
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Test time->fields
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.set(1582, UCAL_OCTOBER, DOY_DATA[i]);
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t woy = cal.get(UCAL_WEEK_OF_YEAR, status);
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t doy = cal.get(UCAL_DAY_OF_YEAR, status);
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t dow = cal.get(UCAL_DAY_OF_WEEK, status);
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Error: get() failed");
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (woy != DOY_DATA[i+1] || doy != DOY_DATA[i+2] || dow != DOY_DATA[i+3]) {
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln((UnicodeString)"Fail: expect woy=" + DOY_DATA[i+1] +
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  ", doy=" + DOY_DATA[i+2] + ", dow=" + DOY_DATA[i+3] + " on " +
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  fmt.format(cal.getTime(status), temp.remove()) +
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  " set(1582,OCTOBER, " + DOY_DATA[i] + ")");
21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(CalendarTest::calToStr(cal));
21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }  else {
21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          logln((UnicodeString)"PASS: expect woy=" + DOY_DATA[i+1] +
21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ", doy=" + DOY_DATA[i+2] + ", dow=" + DOY_DATA[i+3] + " on " +
21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                fmt.format(cal.getTime(status), temp.remove()));
21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          logln(CalendarTest::calToStr(cal));
21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          status = U_ZERO_ERROR;
21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Test fields->time for WOY
21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.clear();
21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.set(UCAL_YEAR, 1582);
21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.set(UCAL_WEEK_OF_YEAR, DOY_DATA[i+1]);
21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.set(UCAL_DAY_OF_WEEK, DOY_DATA[i+3]);
21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t dom = cal.get(UCAL_DATE, status);
21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Error: get() failed");
21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (dom != DOY_DATA[i]) {
21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln((UnicodeString)"Fail: set woy=" + DOY_DATA[i+1] +
21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  " dow=" + DOY_DATA[i+3] + " => " +
21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  fmt.format(cal.getTime(status), temp.remove()) +
21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  ", expected 1582 Oct " + DOY_DATA[i]);
21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(CalendarTest::calToStr(cal));
21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Test fields->time for DOY
21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.clear();
21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.set(UCAL_YEAR, 1582);
21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.set(UCAL_DAY_OF_YEAR, DOY_DATA[i+2]);
21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dom = cal.get(UCAL_DATE, status);
21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("Error: get() failed");
21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (dom != DOY_DATA[i]) {
21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln((UnicodeString)"Fail: set doy=" + DOY_DATA[i+2] +
21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  " => " +
21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  fmt.format(cal.getTime(status), temp.remove()) +
21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  ", expected 1582 Oct " + DOY_DATA[i]);
21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ADD_ROLL  ADD|ROLL
21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define PLUS_MINUS PLUS|MINUS
21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Test cases
21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    J81_DATA DATA[] = {
21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_WEEK_OF_YEAR, ADD_ROLL, PLUS_MINUS, 1, -ONE_DAY, +6*ONE_DAY },
21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_WEEK_OF_YEAR, ADD_ROLL, PLUS_MINUS, 1, -ONE_DAY, +6*ONE_DAY },
21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_WEEK_OF_MONTH, ADD|ROLL, PLUS|MINUS, 1, -ONE_DAY, +6*ONE_DAY },
21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_DATE, ADD|ROLL, PLUS|MINUS, 2, -ONE_DAY, +1*ONE_DAY },
21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_DATE, ROLL, PLUS, -6, -ONE_DAY, +14*ONE_DAY },
21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_DATE, ROLL, PLUS, -7, 0, +14*ONE_DAY },
21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_DATE, ROLL, PLUS, -7, +ONE_DAY, +15*ONE_DAY },
21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_DATE, ROLL, PLUS, +18, -ONE_DAY, -4*ONE_DAY },
21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_DAY_OF_YEAR, ADD|ROLL, PLUS|MINUS, 2, -ONE_DAY, +1*ONE_DAY },
21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_DAY_OF_WEEK, ADD|ROLL, PLUS|MINUS, 2, -ONE_DAY, +1*ONE_DAY },
21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_DAY_OF_WEEK_IN_MONTH, ADD|ROLL, PLUS|MINUS, 1, -ONE_DAY, +6*ONE_DAY },
21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_AM_PM, ADD, PLUS|MINUS, 4, -12*ONE_HOUR, +36*ONE_HOUR },
21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_HOUR, ADD, PLUS|MINUS, 48, -12*ONE_HOUR, +36*ONE_HOUR },
21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_HOUR_OF_DAY, ADD, PLUS|MINUS, 48, -12*ONE_HOUR, +36*ONE_HOUR },
21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_MINUTE, ADD, PLUS|MINUS, 48*60, -12*ONE_HOUR, +36*ONE_HOUR },
21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_SECOND, ADD, PLUS|MINUS, 48*60*60, -12*ONE_HOUR, +36*ONE_HOUR },
21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        { UCAL_MILLISECOND, ADD, PLUS|MINUS, 48*ONE_HOUR, -12*ONE_HOUR, +36*ONE_HOUR },
21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // NOTE: These are not supported yet.  See jitterbug 180.
21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Uncomment these lines when add/roll supported on these fields.
21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // { Calendar::YEAR_WOY, ADD|ROLL, 1, -ONE_DAY, +6*ONE_DAY },
21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // { Calendar::DOW_LOCAL, ADD|ROLL, 2, -ONE_DAY, +1*ONE_DAY }
21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DATA_length = (int32_t)(sizeof(DATA) / sizeof(DATA[0]));
21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Now run the tests
21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=0; i<DATA_length; ++i) {
21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (Action action=ADD; action<=ROLL; action=(Action)(action+1)) {
21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!(DATA[i].actionMask & action)) {
21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                continue;
22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (Sign sign=PLUS; sign<=MINUS; sign=(Sign)(sign+1)) {
22026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (!(DATA[i].signMask & sign)) {
22036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    continue;
22046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
22056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_ZERO_ERROR;
22066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t amount = DATA[i].amount * (sign==MINUS?-1:1);
22076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UDate date = cutover +
22086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (sign==PLUS ? DATA[i].before : DATA[i].after);
22096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UDate expected = cutover +
22106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (sign==PLUS ? DATA[i].after : DATA[i].before);
22116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                cal.setTime(date, status);
22126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
22136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln((UnicodeString)"FAIL: setTime returned error code " + u_errorName(status));
22146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    continue;
22156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
22166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (action == ADD) {
22176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    cal.add(DATA[i].field, amount, status);
22186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
22196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    cal.roll(DATA[i].field, amount, status);
22206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
22216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
22226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln((UnicodeString)"FAIL: " +
22236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          (action==ADD?"add ":"roll ") + FIELD_NAME[DATA[i].field] +
22246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          " returned error code " + u_errorName(status));
22256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    continue;
22266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
22276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UDate result = cal.getTime(status);
22286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
22296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln((UnicodeString)"FAIL: getTime returned error code " + u_errorName(status));
22306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    continue;
22316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
22326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (result == expected) {
22336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    logln((UnicodeString)"Ok: {" +
22346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          fmt.format(date, temp.remove()) +
22356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          "}(" + date/ONE_DAY +
22366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          (action==ADD?") add ":") roll ") +
22376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          amount + " " + FIELD_NAME[DATA[i].field] + " -> {" +
22386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          fmt.format(result, temp2.remove()) +
22396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          "}(" + result/ONE_DAY + ")");
22406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
22416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln((UnicodeString)"FAIL: {" +
22426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          fmt.format(date, temp.remove()) +
22436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          "}(" + date/ONE_DAY +
22446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          (action==ADD?") add ":") roll ") +
22456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          amount + " " + FIELD_NAME[DATA[i].field] + " -> {" +
22466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          fmt.format(result, temp2.remove()) +
22476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          "}(" + result/ONE_DAY + "), expect {" +
22486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          fmt.format(expected, temp3.remove()) +
22496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          "}(" + expected/ONE_DAY + ")");
22506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
22516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
22526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
22536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
22576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test fieldDifference().
22586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
22596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestJ438(void) {
22606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
22616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DATA[] = {
22626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2000, UCAL_JANUARY, 20,   2010, UCAL_JUNE, 15,
22636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        2010, UCAL_JUNE, 15,      2000, UCAL_JANUARY, 20,
22646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1964, UCAL_SEPTEMBER, 7,  1999, UCAL_JUNE, 4,
22656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        1999, UCAL_JUNE, 4,       1964, UCAL_SEPTEMBER, 7,
22666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
22676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t DATA_length = (int32_t)(sizeof(DATA)/sizeof(DATA[0]));
22686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar* pcal = Calendar::createInstance(Locale::getUS(), ec);
22696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(ec)) {
22706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      dataerrln("Error creating calendar %s", u_errorName(ec));
22716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      delete pcal;
22726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
22736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar& cal = *pcal;
22756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i;
22766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat fmt(UnicodeString("MMM dd yyyy",""), ec);
22776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fmt.setCalendar(cal);
22786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString s, t, u;
22796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(ec)) {
22806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i=0; i<DATA_length; i+=6) {
22816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t y1 = DATA[i];
22826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t m1 = DATA[i+1];
22836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t d1 = DATA[i+2];
22846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t y2 = DATA[i+3];
22856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t m2 = DATA[i+4];
22866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t d2 = DATA[i+5];
22876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.clear();
22896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.set(y1, m1, d1);
22906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate date1 = cal.getTime(ec);
22916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (failure(ec, "getTime"))
22926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
22936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.set(y2, m2, d2);
22946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate date2 = cal.getTime(ec);
22956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (failure(ec, "getTime"))
22966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
22976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.setTime(date1, ec);
22996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (failure(ec, "setTime"))
23006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
23016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t dy = cal.fieldDifference(date2, UCAL_YEAR, ec);
23026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t dm = cal.fieldDifference(date2, UCAL_MONTH, ec);
23036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t dd = cal.fieldDifference(date2, UCAL_DATE, ec);
23046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (failure(ec, "fieldDifference"))
23056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
23066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
23086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                Calendar *cal2 = cal.clone();
23096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UErrorCode ec2 = U_ZERO_ERROR;
23106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                cal2->setTime(date1, ec2);
23126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t dy2 = cal2->fieldDifference(date2, Calendar::YEAR, ec2);
23146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t dm2 = cal2->fieldDifference(date2, Calendar::MONTH, ec2);
23156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t dd2 = cal2->fieldDifference(date2, Calendar::DATE, ec2);
23166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (failure(ec2, "fieldDifference(date, Calendar::DATE, ec)"))
23176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    break;
23186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if( (dd2 != dd) ||
23196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (dm2 != dm) ||
23206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (dy2 != dy)){
23216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    errln("fieldDifference(UCAL_...) and fieldDifference(Calendar::...) give different results!\n");
23226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
23236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                delete cal2;
23246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
23256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln(UnicodeString("") +
23286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  fmt.format(date2, s.remove()) + " - " +
23296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  fmt.format(date1, t.remove()) + " = " +
23306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  dy + "y " + dm + "m " + dd + "d");
23316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.setTime(date1, ec);
23336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (failure(ec, "setTime"))
23346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
23356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.add(UCAL_YEAR, dy, ec);
23366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.add(UCAL_MONTH, dm, ec);
23376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.add(UCAL_DATE, dd, ec);
23386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (failure(ec, "add"))
23396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
23406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate date22 = cal.getTime(ec);
23416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (failure(ec, "getTime"))
23426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
23436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (date2 != date22) {
23446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln(UnicodeString("FAIL: ") +
23456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      fmt.format(date1, s.remove()) + " + " +
23466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      dy + "y " + dm + "m " + dd + "d = " +
23476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      fmt.format(date22, t.remove()) + ", exp " +
23486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      fmt.format(date2, u.remove()));
23496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
23506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                logln(UnicodeString("Ok: ") +
23516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      fmt.format(date1, s.remove()) + " + " +
23526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      dy + "y " + dm + "m " + dd + "d = " +
23536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      fmt.format(date22, t.remove()));
23546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
23556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
23576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Error creating SimpleDateFormat - %s", u_errorName(ec));
23586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete pcal;
23606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
23616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestT5555()
23636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
23646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
23656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = Calendar::createInstance(ec);
23666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal == NULL || U_FAILURE(ec)) {
23686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("FAIL: Calendar::createInstance(): %s", u_errorName(ec));
23696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
23706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
23716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Set to Wednesday, February 21, 2007
23746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(2007, UCAL_FEBRUARY, 21);
23756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Advance three years
23776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->add(UCAL_MONTH, 36, ec);
23786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Set to last Wednesday of the month
23806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_DAY_OF_WEEK_IN_MONTH, -1);
23816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->getTime(ec);
23836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t yy, mm, dd, ee;
23856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    yy = cal->get(UCAL_YEAR, ec);
23876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    mm = cal->get(UCAL_MONTH, ec);
23886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    dd = cal->get(UCAL_DATE, ec);
23896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ee = cal->get(UCAL_DAY_OF_WEEK, ec);
23906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Should be set to Wednesday, February 24, 2010
23926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec) || yy != 2010 || mm != UCAL_FEBRUARY || dd != 24 || ee != UCAL_WEDNESDAY) {
23936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: got date %4d/%02d/%02d, expected 210/02/24: ", yy, mm + 1, dd);
23946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
23966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
23976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
23996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t             startYear;
24006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t             startMonth; // 0-based
24016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t             startDay;   // 1-based
24026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendarDateFields fieldToChange;
24036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t             fieldDelta;
24046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t             endYear;
24056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t             endMonth;   // 0-based
24066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t             endDay;     // 1-based
24076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} CoptEthCalTestItem;
24086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// year 1724 in coptic calendar =
24106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// year 2000 in ethiopic calendar (276 more than coptic) =
24116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// year 7500 in ethiopic-amete-alem calendar (5776 more than coptic)
24126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// (2007-2008 in gregorian calendar depending on month)
24136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const CoptEthCalTestItem coptEthCalTestItems[] = {
24146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1724, 12, 1, UCAL_MONTH, +1, 1725,  0, 1 },
24156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1724, 12, 1, UCAL_MONTH, +9, 1725,  8, 1 },
24166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1723, 12, 2, UCAL_MONTH, +1, 1724,  0, 2 }, // 1723 is a leap year
24176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1723, 12, 2, UCAL_MONTH, +9, 1724,  8, 2 },
24186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1725,  0, 1, UCAL_MONTH, -1, 1724, 12, 1 },
24196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1725,  0, 1, UCAL_MONTH, -6, 1724,  7, 1 },
24206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1724, 12, 1, UCAL_DATE,  +8, 1725,  0, 4 },
24216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1723, 12, 1, UCAL_DATE,  +8, 1724,  0, 3 }, // 1723 is a leap year
24226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 1724,  0, 1, UCAL_DATE,  -1, 1723, 12, 6 }, // 1723 is a leap year
24236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 0, 0, 0, (UCalendarDateFields)0, 0, 0, 0, 0 } // terminator
24246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
24256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
24276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char * locale;
24286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t      yearOffset;
24296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} CoptEthCalLocale;
24306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const CoptEthCalLocale copEthCalLocales[] = {
24326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=coptic",   0    },
24336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=ethiopic", 276  },
24346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL,                   0    } // terminator
24356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
24366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestT6745()
24386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
24396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const CoptEthCalLocale * testLocalePtr;
24406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for ( testLocalePtr = copEthCalLocales; testLocalePtr->locale != NULL; ++testLocalePtr) {
24416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode status = U_ZERO_ERROR;
24426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Calendar *cal = Calendar::createInstance(Locale(testLocalePtr->locale), status);
24436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ( U_FAILURE(status) ) {
24446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataerrln((UnicodeString)"FAIL: Calendar::createInstance, locale " + testLocalePtr->locale + ", status " + u_errorName(status));
24456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
24466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
24476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const CoptEthCalTestItem * testItemPtr;
24486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (testItemPtr = coptEthCalTestItems; testItemPtr->fieldDelta != 0; ++testItemPtr) {
24496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
24506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal->set( testItemPtr->startYear + testLocalePtr->yearOffset, testItemPtr->startMonth, testItemPtr->startDay, 9, 0 );
24516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal->add( testItemPtr->fieldToChange, testItemPtr->fieldDelta, status );
24526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_FAILURE(status) ) {
24536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln((UnicodeString)"FAIL: Calendar::add, locale " + testLocalePtr->locale + ", field/delta " +
24546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        testItemPtr->fieldToChange + "/" + testItemPtr->fieldDelta + ", status " + u_errorName(status));
24556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                continue;
24566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
24576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t endYear = testItemPtr->endYear + testLocalePtr->yearOffset;
24586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t year  = cal->get(UCAL_YEAR, status);
24596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t month = cal->get(UCAL_MONTH, status);
24606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t day   = cal->get(UCAL_DATE, status);
24616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_FAILURE(status) || year != endYear || month != testItemPtr->endMonth || day != testItemPtr->endDay ) {
24626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln((UnicodeString)"ERROR: Calendar::add, locale " + testLocalePtr->locale + ", field/delta " +
24636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        testItemPtr->fieldToChange + "/" + testItemPtr->fieldDelta + ", status " + u_errorName(status) +
24646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ", expected " + endYear + "/" + testItemPtr->endMonth + "/" + testItemPtr->endDay +
24656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ", got " + year + "/" + month + "/" + day );
24666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
24676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
24686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
24696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
24716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
24736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test behavior of fieldDifference around leap years.  Also test a large
24746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * field difference to check binary search.
24756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
24766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestLeapFieldDifference() {
24776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
24786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar* cal = Calendar::createInstance(ec);
24796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (cal == NULL || U_FAILURE(ec)) {
24806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("FAIL: Calendar::createInstance(): %s", u_errorName(ec));
24816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
24826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
24836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(2004, UCAL_FEBRUARY, 29);
24856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date2004 = cal->getTime(ec);
24866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(2000, UCAL_FEBRUARY, 29);
24876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date2000 = cal->getTime(ec);
24886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
24896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: getTime()");
24906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
24916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
24926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t y = cal->fieldDifference(date2004, UCAL_YEAR, ec);
24946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t d = cal->fieldDifference(date2004, UCAL_DAY_OF_YEAR, ec);
24956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
24966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: fieldDifference()");
24976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
24986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
24996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (d == 0) {
25016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln((UnicodeString)"Ok: 2004/Feb/29 - 2000/Feb/29 = " + y + " years, " + d + " days");
25026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
25036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"FAIL: 2004/Feb/29 - 2000/Feb/29 = " + y + " years, " + d + " days");
25046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setTime(date2004, ec);
25066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    y = cal->fieldDifference(date2000, UCAL_YEAR, ec);
25076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d = cal->fieldDifference(date2000, UCAL_DAY_OF_YEAR, ec);
25086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
25096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: setTime() / fieldDifference()");
25106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
25116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
25126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (d == 0) {
25146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln((UnicodeString)"Ok: 2000/Feb/29 - 2004/Feb/29 = " + y + " years, " + d + " days");
25156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
25166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"FAIL: 2000/Feb/29 - 2004/Feb/29 = " + y + " years, " + d + " days");
25176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Test large difference
25196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(2001, UCAL_APRIL, 5); // 2452005
25206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate ayl = cal->getTime(ec);
25216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(1964, UCAL_SEPTEMBER, 7); // 2438646
25226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate asl = cal->getTime(ec);
25236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
25246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: getTime()");
25256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
25266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
25276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d = cal->fieldDifference(ayl, UCAL_DATE, ec);
25296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setTime(ayl, ec);
25306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t d2 = cal->fieldDifference(asl, UCAL_DATE, ec);
25316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
25326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: setTime() / fieldDifference()");
25336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
25346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
25356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (d == -d2 && d == 13359) {
25376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln((UnicodeString)"Ok: large field difference symmetrical " + d);
25386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
25396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln((UnicodeString)"FAIL: large field difference incorrect " + d + ", " + d2 +
25406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              ", expect +/- 13359");
25416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
25436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
25446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
25466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test ms_MY "Malay (Malaysia)" locale.  Bug 1543.
25476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
25486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestMalaysianInstance() {
25496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Locale loc("ms", "MY");  // Malay (Malaysia)
25506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
25516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar* cal = Calendar::createInstance(loc, ec);
25526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
25536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("FAIL: Can't construct calendar for ms_MY: %s", u_errorName(ec));
25546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
25566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
25576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
25596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * setFirstDayOfWeek and setMinimalDaysInFirstWeek may change the
25606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * field <=> time mapping, since they affect the interpretation of
25616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the WEEK_OF_MONTH or WEEK_OF_YEAR fields.
25626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
25636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestWeekShift() {
25646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
25656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar cal(TimeZone::createTimeZone("America/Los_Angeles"),
25666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          Locale("en", "US"), ec);
25676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
25686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Fail GregorianCalendar: %s", u_errorName(ec));
25696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
25706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
25716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal.setTime(UDate(997257600000.0), ec); // Wed Aug 08 01:00:00 PDT 2001
25726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // In pass one, change the first day of week so that the weeks
25736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // shift in August 2001.  In pass two, change the minimal days
25746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // in the first week so that the weeks shift in August 2001.
25756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //     August 2001
25766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Su Mo Tu We Th Fr Sa
25776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //           1  2  3  4
25786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //  5  6  7  8  9 10 11
25796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // 12 13 14 15 16 17 18
25806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // 19 20 21 22 23 24 25
25816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // 26 27 28 29 30 31
25826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int32_t pass=0; pass<2; ++pass) {
25836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (pass==0) {
25846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.setFirstDayOfWeek(UCAL_WEDNESDAY);
25856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.setMinimalDaysInFirstWeek(4);
25866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
25876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.setFirstDayOfWeek(UCAL_SUNDAY);
25886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.setMinimalDaysInFirstWeek(4);
25896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
25906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.add(UCAL_DATE, 1, ec); // Force recalc
25916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.add(UCAL_DATE, -1, ec);
25926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate time1 = cal.getTime(ec); // Get time -- should not change
25946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Now change a week parameter and then force a recalc.
25966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // The bug is that the recalc should not be necessary --
25976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // calendar should do so automatically.
25986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (pass==0) {
25996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.setFirstDayOfWeek(UCAL_THURSDAY);
26006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
26016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal.setMinimalDaysInFirstWeek(5);
26026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t woy1 = cal.get(UCAL_WEEK_OF_YEAR, ec);
26056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t wom1 = cal.get(UCAL_WEEK_OF_MONTH, ec);
26066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.add(UCAL_DATE, 1, ec); // Force recalc
26086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.add(UCAL_DATE, -1, ec);
26096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t woy2 = cal.get(UCAL_WEEK_OF_YEAR, ec);
26116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t wom2 = cal.get(UCAL_WEEK_OF_MONTH, ec);
26126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate time2 = cal.getTime(ec);
26146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(ec)) {
26166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("FAIL: internal test error");
26176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
26186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (time1 != time2) {
26216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("FAIL: shifting week should not alter time");
26226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
26236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            // logln(time1);
26246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (woy1 == woy2 && wom1 == wom2) {
26266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            logln((UnicodeString)"Ok: WEEK_OF_YEAR: " + woy1 +
26276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  ", WEEK_OF_MONTH: " + wom1);
26286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
26296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln((UnicodeString)"FAIL: WEEK_OF_YEAR: " + woy1 + " => " + woy2 +
26306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  ", WEEK_OF_MONTH: " + wom1 + " => " + wom2 +
26316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  " after week shift");
26326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
26356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
26376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Make sure that when adding a day, we actually wind up in a
26386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * different day.  The DST adjustments we use to keep the hour
26396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * constant across DST changes can backfire and change the day.
26406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
26416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestTimeZoneTransitionAdd() {
26426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode ec = U_ZERO_ERROR;
26436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Locale locale(Locale::getUS()); // could also be CHINA
26446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat dateFormat("MM/dd/yyyy HH:mm z", locale, ec);
26456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringEnumeration *tz = TimeZone::createEnumeration();
26476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (tz == NULL) {
26486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("FAIL: TimeZone::createEnumeration");
26496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
26506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString buf1, buf2;
26536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar* id;
26556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while ((id = tz->unext(NULL, ec)) != NULL && U_SUCCESS(ec)) {
26566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(ec)) {
26576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("FAIL: StringEnumeration::unext");
26586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
26596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        TimeZone *t = TimeZone::createTimeZone(id);
26626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (t == NULL) {
26636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("FAIL: TimeZone::createTimeZone");
26646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
26656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dateFormat.setTimeZone(*t);
26676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        Calendar *cal = Calendar::createInstance(t, locale, ec);
26696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (cal == NULL || U_FAILURE(ec)) {
26706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            errln("FAIL: Calendar::createTimeZone");
26716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            delete cal;
26726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
26736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->clear();
26766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Scan the year 2003, overlapping the edges of the year
26776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(UCAL_YEAR, 2002);
26786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(UCAL_MONTH, UCAL_DECEMBER);
26796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal->set(UCAL_DATE, 25);
26806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (int32_t i=0; i<365+10 && U_SUCCESS(ec); ++i) {
26826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate yesterday = cal->getTime(ec);
26836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t yesterday_day = cal->get(UCAL_DATE, ec);
26846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            cal->add(UCAL_DATE, 1, ec);
26856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (yesterday_day == cal->get(UCAL_DATE, ec)) {
26866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                errln(UnicodeString(id) + " " +
26876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      dateFormat.format(yesterday, buf1) + " +1d= " +
26886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      dateFormat.format(cal->getTime(ec), buf2));
26896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                buf1.truncate(0);
26906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                buf2.truncate(0);
26916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
26926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
26936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
26946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(ec)) {
26976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("FAIL: %s", u_errorName(ec));
26986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
26996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete tz;
27016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
27026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUDate
27046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCalendarRegressionTest::makeDate(int32_t y, int32_t m, int32_t d,
27056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    int32_t hr, int32_t min, int32_t sec)
27066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
27076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate result;
27086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
27106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *cal = Calendar::createInstance(status);
27116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->clear();
27126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(UCAL_YEAR, y);
27146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(m != 0)        cal->set(UCAL_MONTH, m);
27166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(d != 0)        cal->set(UCAL_DATE, d);
27176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(hr != 0)        cal->set(UCAL_HOUR, hr);
27186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(min != 0)    cal->set(UCAL_MINUTE, min);
27196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(sec != 0)    cal->set(UCAL_SECOND, sec);
27206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    result = cal->getTime(status);
27226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
27246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
27266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
27276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestDeprecates(void)
27296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
27306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
27316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *c1 = Calendar::createInstance("ja_JP@calendar=japanese",status);
27326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Calendar *c2 = Calendar::createInstance("ja_JP_TRADITIONAL",status);
27336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!c1 || !c2 || U_FAILURE(status)) {
27356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Couldn't create calendars for roll of HOUR: %s", u_errorName(status));
27366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
27376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2->set(UCAL_HOUR,2);
27406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1->setTime(c2->getTime(status),status);
27416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // *c1 = *c2;
27426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1->roll(Calendar::HOUR,(int32_t)3,status);
27446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2->roll(UCAL_HOUR,(int32_t)3,status);
27456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
27476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Error code when trying to roll");
27486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(*c1 != *c2) {
27496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("roll(EDateField, int32_t) had different effect than roll(UCalendarField, int32_t)");
27506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1->setTime(c2->getTime(status),status);
27536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1->roll(Calendar::HOUR,(UBool)FALSE,status);
27546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2->roll(UCAL_HOUR,(UBool)FALSE,status);
27556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
27576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Error code when trying to roll(UBool)");
27586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(*c1 != *c2) {
27596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("roll(EDateField, UBool) had different effect than roll(UCalendarField, UBool)");
27606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c1;
27636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c2;
27646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
27666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1 = Calendar::createInstance("th_TH_TRADITIONAL",status);
27686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2 = Calendar::createInstance("th_TH@calendar=buddhist",status);
27696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!c1 || !c2 || U_FAILURE(status)) {
27716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't create calendars for add of HOUR");
27726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
27736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2->set(UCAL_HOUR,2);
27766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1->setTime(c2->getTime(status),status);
27776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //*c1 = *c2;
27786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1->add(Calendar::HOUR,(int32_t)1,status);
27806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
27826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Error code when trying to add Calendar::HOUR - %s", u_errorName(status));
27836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2->add(UCAL_HOUR,(int32_t)1,status);
27866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
27886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Error code when trying to add - UCAL_HOUR %s", u_errorName(status));
27896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(*c1 != *c2) {
27906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("add(EDateField) had different effect than add(UCalendarField)");
27916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
27926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c1;
27946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c2;
27956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
27976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1 = Calendar::createInstance("es_ES",status);
27996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2 = Calendar::createInstance("es_ES",status);
28006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!c1 || !c2 || U_FAILURE(status)) {
28026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Couldn't create calendars for add of YEAR");
28036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
28046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2->set(UCAL_YEAR,1900);
28076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1->setTime(c2->getTime(status),status);
28086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //*c1 = *c2;
28096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c1->add(Calendar::YEAR,(int32_t)9,status);
28116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    c2->add(UCAL_YEAR,(int32_t)9,status);
28126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
28146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Error code when trying to add YEARs");
28156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(*c1 != *c2) {
28166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("add(EDateField YEAR) had different effect than add(UCalendarField YEAR)");
28176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c1;
28206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete c2;
28216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
28236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestT8057(void) {
28256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Set the calendar to the last day in a leap year
28266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
28276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *cal = (GregorianCalendar*)Calendar::createInstance(status);
28286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
28296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Error creating Calendar: %s", u_errorName(status));
28306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
28316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
28326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->setLenient(FALSE);
28346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->clear();
28356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->set(2008, UCAL_DECEMBER, 31);
28366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Force calculating then fields once.
28386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate t = cal->getTime(status);
28396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)) {
28406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Error while calculating the date");
28416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete cal;
28426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
28436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate expected = 1262246400000.0; // 2009-12-31 00:00 PST
28466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal->add(UCAL_YEAR, 1, status);
28486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t = cal->getTime(status);
28496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
28506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (t != expected) {
28516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            dataerrln((UnicodeString)"FAIL: wrong date after add: expected=" + expected + " returned=" + t);
28526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
28536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
28546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("FAIL: error while adding one year");
28556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete cal;
28586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
28596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Test case for ticket#8596.
28616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Setting an year followed by getActualMaximum(Calendar.WEEK_OF_YEAR)
28626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// may result wrong maximum week.
28636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestT8596(void) {
28646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
28656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar *gc = new GregorianCalendar(*TimeZone::getGMT(), status);
28666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
28686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dataerrln("Error creating Calendar: %s", u_errorName(status));
28696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete gc;
28706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
28716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->setFirstDayOfWeek(UCAL_MONDAY);
28746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->setMinimalDaysInFirstWeek(4);
28756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Force the calender to resolve the fields once.
28776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // The maximum week number in 2011 is 52.
28786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->set(UCAL_YEAR, 2011);
28796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->get(UCAL_YEAR, status);
28806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Set a date in year 2009, but not calling get to resolve
28826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // the calendar's internal field yet.
28836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gc->set(2009, UCAL_JULY, 1);
28846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Then call getActuamMaximum for week of year.
28866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // #8596 was caused by conflict between year set
28876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // above and internal work calendar field resolution.
28886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t maxWeeks = gc->getActualMaximum(UCAL_WEEK_OF_YEAR, status);
28896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
28916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln("Error calendar calculation: %s", u_errorName(status));
28926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        delete gc;
28936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
28946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (maxWeeks != 53) {
28976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        errln((UnicodeString)"FAIL: Max week in 2009 in ISO calendar is 53, but got " + maxWeeks);
28986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
28996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    delete gc;
29016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
29026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Test case for ticket 9452
29046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Calendar addition fall onto the missing date - 2011-12-30 in Samoa
29056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid CalendarRegressionTest::TestT9452(void) {
29066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
29076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    GregorianCalendar cal(TimeZone::createTimeZone("Pacific/Apia"), status);
29086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "initializing GregorianCalendar");
29096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    SimpleDateFormat sdf(UnicodeString("y-MM-dd'T'HH:mm:ssZZZZZ"), status);
29116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    failure(status, "initializing SimpleDateFormat");
29126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    sdf.setCalendar(cal);
29136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString dstr;
29156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Set date to 2011-12-29 00:00
29176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal.clear();
29186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal.set(2011, UCAL_DECEMBER, 29, 0, 0, 0);
29196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d = cal.getTime(status);
29216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (!failure(status, "getTime for initial date")) {
29226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sdf.format(d, dstr);
29236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("Initial date: ") + dstr);
29246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Add 1 day
29266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.add(UCAL_DATE, 1, status);
29276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failure(status, "add 1 day");
29286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        d = cal.getTime(status);
29296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failure(status, "getTime after +1 day");
29306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dstr.remove();
29316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sdf.format(d, dstr);
29326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("+1 day: ") + dstr);
29336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        assertEquals("Add 1 day", UnicodeString("2011-12-31T00:00:00+14:00"), dstr);
29346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // Subtract 1 day
29366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal.add(UCAL_DATE, -1, status);
29376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failure(status, "subtract 1 day");
29386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        d = cal.getTime(status);
29396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        failure(status, "getTime after -1 day");
29406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dstr.remove();
29416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        sdf.format(d, dstr);
29426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        logln(UnicodeString("-1 day: ") + dstr);
29436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        assertEquals("Subtract 1 day", UnicodeString("2011-12-29T00:00:00-10:00"), dstr);
29446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
29456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
29466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
2948