16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/********************************************************************
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Corporation and others. All Rights Reserved.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * File CCALTST.C
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Modification History:
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *        Name                     Description
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     Madhu Katragadda               Creation
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* C API AND FUNCTIONALITY TEST FOR CALENDAR (ucol.h)*/
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h>
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <string.h>
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uloc.h"
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucal.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/udat.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ustring.h"
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ccaltst.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cformtst.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ulist.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestGregorianChange(void);
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestFieldDifference(void);
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestAddRollEra0AndEraBounds(void);
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestGetTZTransition(void);
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestGetWindowsTimeZoneID(void);
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestGetTimeZoneIDByWindowsID(void);
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addCalTest(TestNode** root);
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addCalTest(TestNode** root)
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestCalendar, "tsformat/ccaltst/TestCalendar");
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetSetDateAPI, "tsformat/ccaltst/TestGetSetDateAPI");
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestFieldGetSet, "tsformat/ccaltst/TestFieldGetSet");
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestAddRollExtensive, "tsformat/ccaltst/TestAddRollExtensive");
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetLimits, "tsformat/ccaltst/TestGetLimits");
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestDOWProgression, "tsformat/ccaltst/TestDOWProgression");
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGMTvsLocal, "tsformat/ccaltst/TestGMTvsLocal");
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGregorianChange, "tsformat/ccaltst/TestGregorianChange");
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetKeywordValuesForLocale, "tsformat/ccaltst/TestGetKeywordValuesForLocale");
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestWeekend, "tsformat/ccaltst/TestWeekend");
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestFieldDifference, "tsformat/ccaltst/TestFieldDifference");
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestAmbiguousWallTime, "tsformat/ccaltst/TestAmbiguousWallTime");
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestAddRollEra0AndEraBounds, "tsformat/ccaltst/TestAddRollEra0AndEraBounds");
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetTZTransition, "tsformat/ccaltst/TestGetTZTransition");
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetWindowsTimeZoneID, "tsformat/ccaltst/TestGetWindowsTimeZoneID");
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    addTest(root, &TestGetTimeZoneIDByWindowsID, "tsformat/ccaltst/TestGetTimeZoneIDByWindowsID");
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* "GMT" */
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar fgGMTID [] = { 0x0047, 0x004d, 0x0054, 0x0000 };
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* "PST" */
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar PST[] = {0x50, 0x53, 0x54, 0x00}; /* "PST" */
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar EUROPE_PARIS[] = {0x45, 0x75, 0x72, 0x6F, 0x70, 0x65, 0x2F, 0x50, 0x61, 0x72, 0x69, 0x73, 0x00}; /* "Europe/Paris" */
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar AMERICA_LOS_ANGELES[] = {0x41, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x61, 0x2F,
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    0x4C, 0x6F, 0x73, 0x5F, 0x41, 0x6E, 0x67, 0x65, 0x6C, 0x65, 0x73, 0x00}; /* America/Los_Angeles */
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *    locale;
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendarType   calType;
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *    expectedResult;
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UCalGetTypeTest;
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UCalGetTypeTest ucalGetTypeTests[] = {
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en_US",                   UCAL_GREGORIAN, "gregorian" },
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "ja_JP@calendar=japanese", UCAL_DEFAULT,   "japanese"  },
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "th_TH",                   UCAL_GREGORIAN, "gregorian" },
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "th_TH",                   UCAL_DEFAULT,   "buddhist"  },
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "th-TH-u-ca-gregory",      UCAL_DEFAULT,   "gregorian" },
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "ja_JP@calendar=japanese", UCAL_GREGORIAN, "gregorian" },
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "",                        UCAL_GREGORIAN, "gregorian" },
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL,                      UCAL_GREGORIAN, "gregorian" },
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL, 0, NULL } /* terminator */
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestCalendar()
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar *caldef = 0, *caldef2 = 0, *calfr = 0, *calit = 0, *calfrclone = 0;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UEnumeration* uenum = NULL;
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count, count2, i,j;
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[4];
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *tzdname = 0;
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate now;
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDateFormat *datdef = 0;
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *result = 0;
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t resultlength, resultlengthneeded;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char tempMsgBuf[256];
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar zone1[32], zone2[32];
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *tzver = 0;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar canonicalID[64];
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isSystemID = FALSE;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UCalGetTypeTest * ucalGetTypeTestPtr;
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef U_USE_UCAL_OBSOLETE_2_8
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing countAvailableTimeZones*/
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t offset=0;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting ucal_countAvailableTZIDs\n");
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=ucal_countAvailableTZIDs(offset);
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("The number of timezone id's present with offset 0 are %d:\n", count);
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(count < 5) /* Don't hard code an exact == test here! */
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: error in the ucal_countAvailableTZIDs - got %d expected at least 5 total\n", count);
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing getAvailableTZIDs*/
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting ucal_getAvailableTZIDs");
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<count;i++){
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_getAvailableTZIDs(offset, i, &status);
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status)){
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: ucal_getAvailableTZIDs returned %s\n", u_errorName(status));
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%s\n", u_austrcpy(tempMsgBuf, ucal_getAvailableTZIDs(offset, i, &status)));
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*get Illegal TZID where index >= count*/
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_getAvailableTZIDs(offset, i, &status);
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status != U_INDEX_OUTOFBOUNDS_ERROR){
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL:for TZID index >= count Expected INDEX_OUTOFBOUNDS_ERROR Got %s\n", u_errorName(status));
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Test ucal_openTimeZones, ucal_openCountryTimeZones and ucal_openTimeZoneIDEnumeration */
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (j=0; j<6; ++j) {
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *api = "?";
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const int32_t offsetMinus5 = -5*60*60*1000;
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        switch (j) {
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 0:
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            api = "ucal_openTimeZones()";
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum = ucal_openTimeZones(&status);
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 1:
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            api = "ucal_openCountryTimeZones(US)";
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum = ucal_openCountryTimeZones("US", &status);
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 2:
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            api = "ucal_openTimeZoneIDEnumerarion(UCAL_ZONE_TYPE_CANONICAL, NULL, NULL)";
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_CANONICAL, NULL, NULL, &status);
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 3:
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            api = "ucal_openTimeZoneIDEnumerarion(UCAL_ZONE_TYPE_CANONICAL_LOCATION, CA, NULL)";
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_CANONICAL_LOCATION, "CA", NULL, &status);
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 4:
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            api = "ucal_openTimeZoneIDEnumerarion(UCAL_ZONE_TYPE_ANY, NULL, -5 hour)";
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, NULL, &offsetMinus5, &status);
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        case 5:
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            api = "ucal_openTimeZoneIDEnumerarion(UCAL_ZONE_TYPE_ANY, US, -5 hour)";
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum = ucal_openTimeZoneIDEnumeration(UCAL_ZONE_TYPE_ANY, "US", &offsetMinus5, &status);
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            break;
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err_status(status, "FAIL: %s failed with %s\n", api,
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(status));
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char* id;
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t len;
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            count = uenum_count(uenum, &status);
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("%s returned %d timezone id's:\n", api, count);
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (count < 5) { /* Don't hard code an exact == test here! */
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_data_err("FAIL: in %s, got %d, expected at least 5 -> %s (Are you missing data?)\n", api, count, u_errorName(status));
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum_reset(uenum, &status);
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status)){
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: uenum_reset for %s returned %s\n",
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        api, u_errorName(status));
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (i=0; i<count; i++) {
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                id = uenum_next(uenum, &len, &status);
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)){
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: uenum_next for %s returned %s\n",
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            api, u_errorName(status));
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_verbose("%s\n", id);
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            /* Next one should be NULL */
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            id = uenum_next(uenum, &len, &status);
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (id != NULL) {
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: uenum_next for %s returned %s, expected NULL\n",
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        api, id);
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uenum_close(uenum);
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Test ucal_getDSTSavings*/
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i = ucal_getDSTSavings(fgGMTID, &status);
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: ucal_getDSTSavings(GMT) => %s\n",
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(status));
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (i != 0) {
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: ucal_getDSTSavings(GMT) => %d, expect 0 (Are you missing data?)\n", i);
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i = ucal_getDSTSavings(PST, &status);
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: ucal_getDSTSavings(PST) => %s\n",
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(status));
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (i != 1*60*60*1000) {
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: ucal_getDSTSavings(PST) => %d, expect %d\n", i, 1*60*60*1000);
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Test ucal_set/getDefaultTimeZone*/
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    i = ucal_getDefaultTimeZone(zone1, sizeof(zone1)/sizeof(zone1[0]), &status);
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: ucal_getDefaultTimeZone() => %s\n",
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(status));
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_setDefaultTimeZone(EUROPE_PARIS, &status);
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: ucal_setDefaultTimeZone(Europe/Paris) => %s\n",
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    u_errorName(status));
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            i = ucal_getDefaultTimeZone(zone2, sizeof(zone2)/sizeof(zone2[0]), &status);
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status)) {
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: ucal_getDefaultTimeZone() => %s\n",
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        u_errorName(status));
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (u_strcmp(zone2, EUROPE_PARIS) != 0) {
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_data_err("FAIL: ucal_getDefaultTimeZone() did not return Europe/Paris (Are you missing data?)\n");
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_setDefaultTimeZone(zone1, &status);
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Test ucal_getTZDataVersion*/
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    tzver = ucal_getTZDataVersion(&status);
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "FAIL: ucal_getTZDataVersion() => %s\n", u_errorName(status));
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (uprv_strlen(tzver) != 5 /*4 digits + 1 letter*/) {
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Bad version string was returned by ucal_getTZDataVersion\n");
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: ucal_getTZDataVersion returned %s\n", tzver);
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing ucal_getCanonicalTimeZoneID*/
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    resultlength = ucal_getCanonicalTimeZoneID(PST, -1,
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        canonicalID, sizeof(canonicalID)/sizeof(UChar), &isSystemID, &status);
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: error in ucal_getCanonicalTimeZoneID : %s\n", u_errorName(status));
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (u_strcmp(AMERICA_LOS_ANGELES, canonicalID) != 0) {
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: ucal_getCanonicalTimeZoneID(%s) returned %s : expected - %s (Are you missing data?)\n",
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                PST, canonicalID, AMERICA_LOS_ANGELES);
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (!isSystemID) {
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: ucal_getCanonicalTimeZoneID(%s) set %d to isSystemID (Are you missing data?)\n",
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                PST, isSystemID);
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing the  ucal_open() function*/
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the ucal_open()\n");
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzID, "PST");
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    caldef=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: error in ucal_open caldef : %s\n - (Are you missing data?)", u_errorName(status));
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    caldef2=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: error in ucal_open caldef : %s - (Are you missing data?)\n", u_errorName(status));
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strcpy(tzID, fgGMTID);
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calfr=ucal_open(tzID, u_strlen(tzID), "fr_FR", UCAL_TRADITIONAL, &status);
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: error in ucal_open calfr : %s - (Are you missing data?)\n", u_errorName(status));
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calit=ucal_open(tzID, u_strlen(tzID), "it_IT", UCAL_TRADITIONAL, &status);
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))    {
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: error in ucal_open calit : %s - (Are you missing data?)\n", u_errorName(status));
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing the  clone() function*/
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    calfrclone = ucal_clone(calfr, &status);
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: error in ucal_clone calfr : %s - (Are you missing data?)\n", u_errorName(status));
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing udat_getAvailable() and udat_countAvailable()*/
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting getAvailableLocales and countAvailable()\n");
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=ucal_countAvailable();
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* use something sensible w/o hardcoding the count */
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(count > 0) {
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: ucal_countAvailable() works fine\n");
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("The no: of locales for which calendars are avilable are %d\n", count);
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: Error in countAvailable()\n");
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(i=0;i<count;i++) {
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       log_verbose("%s\n", ucal_getAvailable(i));
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing the equality between calendar's*/
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting ucal_equivalentTo()\n");
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(caldef && caldef2 && calfr && calit) {
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(ucal_equivalentTo(caldef, caldef2) == FALSE || ucal_equivalentTo(caldef, calfr)== TRUE ||
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_equivalentTo(caldef, calit)== TRUE || ucal_equivalentTo(calfr, calfrclone) == FALSE) {
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_data_err("FAIL: Error. equivalentTo test failed (Are you missing data?)\n");
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      } else {
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          log_verbose("PASS: equivalentTo test passed\n");
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing the current time and date using ucal_getnow()*/
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the ucal_getNow function to check if it is fetching tbe current time\n");
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    now=ucal_getNow();
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* open the date format and format the date to check the output */
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    datdef=udat_open(UDAT_FULL,UDAT_FULL ,NULL, NULL, 0,NULL,0,&status);
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: error in creating the dateformat : %s (Are you missing data?)\n", u_errorName(status));
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("PASS: The current date and time fetched is %s\n", u_austrcpy(tempMsgBuf, myDateFormat(datdef, now)) );
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing the TimeZoneDisplayName */
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the fetching of time zone display name\n");
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*for the US locale */
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    resultlength=0;
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    resultlengthneeded=ucal_getTimeZoneDisplayName(caldef, UCAL_DST, "en_US", NULL, resultlength, &status);
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status==U_BUFFER_OVERFLOW_ERROR)
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status=U_ZERO_ERROR;
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        resultlength=resultlengthneeded+1;
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        result=(UChar*)malloc(sizeof(UChar) * resultlength);
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_getTimeZoneDisplayName(caldef, UCAL_DST, "en_US", result, resultlength, &status);
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))    {
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error in getting the timezone display name : %s\n", u_errorName(status));
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: getting the time zone display name successful : %s, %d needed \n",
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            u_errorName(status), resultlengthneeded);
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define expectPDT "Pacific Daylight Time"
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    tzdname=(UChar*)malloc(sizeof(UChar) * (sizeof(expectPDT)+1));
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzdname, expectPDT);
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_strcmp(tzdname, result)==0){
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: got the correct time zone display name %s\n", u_austrcpy(tempMsgBuf, result) );
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: got the wrong time zone(DST) display name %s, wanted %s\n", austrdup(result) , expectPDT);
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_getTimeZoneDisplayName(caldef, UCAL_SHORT_DST, "en_US", result, resultlength, &status);
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzdname, "PDT");
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_strcmp(tzdname, result) != 0){
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: got the wrong time zone(SHORT_DST) display name %s, wanted %s\n", austrdup(result), austrdup(tzdname));
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_getTimeZoneDisplayName(caldef, UCAL_STANDARD, "en_US", result, resultlength, &status);
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzdname, "Pacific Standard Time");
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_strcmp(tzdname, result) != 0){
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: got the wrong time zone(STANDARD) display name %s, wanted %s\n", austrdup(result), austrdup(tzdname));
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_getTimeZoneDisplayName(caldef, UCAL_SHORT_STANDARD, "en_US", result, resultlength, &status);
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzdname, "PST");
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_strcmp(tzdname, result) != 0){
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: got the wrong time zone(SHORT_STANDARD) display name %s, wanted %s\n", austrdup(result), austrdup(tzdname));
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing the setAttributes and getAttributes of a UCalendar*/
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the getAttributes and set Attributes\n");
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=ucal_getAttribute(calit, UCAL_LENIENT);
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count2=ucal_getAttribute(calfr, UCAL_LENIENT);
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(calit, UCAL_LENIENT, 0);
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(caldef, UCAL_LENIENT, count2);
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( ucal_getAttribute(calit, UCAL_LENIENT) !=0 ||
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_getAttribute(calfr, UCAL_LENIENT)!=ucal_getAttribute(caldef, UCAL_LENIENT) )
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: there is an error in getAttributes or setAttributes\n");
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: attribute set and got successfully\n");
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /*set it back to orginal value */
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Setting it back to normal\n");
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(calit, UCAL_LENIENT, count);
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ucal_getAttribute(calit, UCAL_LENIENT)!=count)
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error in setting the attribute back to normal\n");
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*setting the first day of the week to other values  */
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=ucal_getAttribute(calit, UCAL_FIRST_DAY_OF_WEEK);
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=1; i<=7; ++i) {
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_setAttribute(calit, UCAL_FIRST_DAY_OF_WEEK,i);
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ucal_getAttribute(calit, UCAL_FIRST_DAY_OF_WEEK) != i)
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: set/getFirstDayOfWeek failed\n");
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*get bogus Attribute*/
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=ucal_getAttribute(calit, (UCalendarAttribute)99); /* BOGUS_ATTRIBUTE */
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(count != -1){
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: get/bogus attribute should return -1\n");
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*set it back to normal */
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(calit, UCAL_FIRST_DAY_OF_WEEK,count);
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*setting minimal days of the week to other values */
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    count=ucal_getAttribute(calit, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK);
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (i=1; i<=7; ++i) {
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_setAttribute(calit, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK,i);
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (ucal_getAttribute(calit, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK) != i)
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: set/getMinimalDaysInFirstWeek failed\n");
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*set it back to normal */
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(calit, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK,count);
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing if the UCalendar's timezone is currently in day light saving's time*/
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting if the UCalendar is currently in daylight saving's time\n");
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(caldef, 1999, UCAL_MARCH, 3, 10, 45, 20, &status);
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_inDaylightTime(caldef, &status );
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))    {
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in ucal_inDaylightTime: %s\n", u_errorName(status));
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!ucal_inDaylightTime(caldef, &status))
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: It is not in daylight saving's time\n");
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: It is not in daylight saving's time\n");
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*closing the UCalendar*/
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(caldef);
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(caldef2);
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(calfr);
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(calit);
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(calfrclone);
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing ucal_getType, and ucal_open with UCAL_GREGORIAN*/
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (ucalGetTypeTestPtr = ucalGetTypeTests; ucalGetTypeTestPtr->expectedResult != NULL; ++ucalGetTypeTestPtr) {
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char * localeToDisplay = (ucalGetTypeTestPtr->locale != NULL)? ucalGetTypeTestPtr->locale: "<NULL>";
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        caldef = ucal_open(NULL, 0, ucalGetTypeTestPtr->locale, ucalGetTypeTestPtr->calType, &status);
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ( U_SUCCESS(status) ) {
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const char * calType = ucal_getType(caldef, &status);
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_SUCCESS(status) && calType != NULL ) {
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if ( uprv_strcmp( calType, ucalGetTypeTestPtr->expectedResult ) != 0 ) {
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: ucal_open %s type %d does not return %s calendar\n", localeToDisplay,
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                ucalGetTypeTestPtr->calType, ucalGetTypeTestPtr->expectedResult);
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: ucal_open %s type %d, then ucal_getType fails\n", localeToDisplay, ucalGetTypeTestPtr->calType);
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_close(caldef);
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: ucal_open %s type %d fails\n", localeToDisplay, ucalGetTypeTestPtr->calType);
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*closing the UDateFormat used */
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    udat_close(datdef);
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    free(result);
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    free(tzdname);
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*------------------------------------------------------*/
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Testing the getMillis, setMillis, setDate and setDateTime functions extensively*/
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetSetDateAPI()
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar *caldef = 0, *caldef2 = 0, *caldef3 = 0;
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[4];
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d1;
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t hour;
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t zoneOffset;
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDateFormat *datdef = 0;
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status=U_ZERO_ERROR;
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d2= 837039928046.0;
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar temp[30];
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	double testMillis;
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	int32_t dateBit;
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar id[4];
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t idLen;
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nOpening the calendars()\n");
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strcpy(tzID, fgGMTID);
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*open the calendars used */
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    caldef=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    caldef2=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    caldef3=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*open the dateformat */
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* this is supposed to open default date format, but later on it treats it like it is "en_US"
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       - very bad if you try to run the tests on machine where default locale is NOT "en_US" */
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*datdef=udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,NULL,fgGMTID,-1, &status);*/
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    datdef=udat_open(UDAT_DEFAULT,UDAT_DEFAULT ,"en_US",fgGMTID,-1,NULL,0, &status);
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error in creating the dateformat : %s (Are you missing data?)\n", u_errorName(status));
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing getMillis and setMillis */
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the date and time fetched in millis for a calendar using getMillis\n");
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d1=ucal_getMillis(caldef, &status);
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getMillis : %s\n", u_errorName(status));
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing setMillis */
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the set date and time function using setMillis\n");
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setMillis(caldef, d2, &status);
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in setMillis : %s\n", u_errorName(status));
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing if the calendar date is set properly or not  */
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d1=ucal_getMillis(caldef, &status);
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_strcmp(myDateFormat(datdef, d1), myDateFormat(datdef, d2))!=0)
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error in setMillis or getMillis\n");
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*-------------------*/
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing large negative millis*/
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	/*test a previously failed millis and beyond the lower bounds - ICU trac #9403 */
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	// -184303902611600000.0         - just beyond lower bounds (#9403 sets U_ILLEGAL_ARGUMENT_ERROR in strict mode)
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	// -46447814188001000.0	         - fixed by #9403
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting very large valid millis & invalid setMillis values (in both strict & lienent modes) detected\n");
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	testMillis = -46447814188001000.0;	// point where floorDivide in handleComputeFields failed as per #9403
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	log_verbose("using value[%lf]\n", testMillis);
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(caldef3, UCAL_LENIENT, 0);
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setMillis(caldef3, testMillis, &status);
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   	if(U_FAILURE(status)){
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   		log_err("Fail: setMillis incorrectly detected invalid value : for millis : %e : returned  : %s\n", testMillis, u_errorName(status));
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org		status = U_ZERO_ERROR;
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	}
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting invalid setMillis values detected\n");
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	testMillis = -184303902611600000.0;
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	log_verbose("using value[%lf]\n", testMillis);
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(caldef3, UCAL_LENIENT, 1);
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   	ucal_setMillis(caldef3, testMillis, &status);
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   	if(U_FAILURE(status)){
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   		log_err("Fail: setMillis incorrectly detected invalid value : for millis : %e : returned  : %s\n", testMillis, u_errorName(status));
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org		status = U_ZERO_ERROR;
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   	} else {
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        dateBit = ucal_get(caldef2, UCAL_MILLISECOND, &status);
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(testMillis == dateBit)
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        {
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org		    log_err("Fail: error in setMillis, allowed invalid value %e : returns millisecond : %d", testMillis, dateBit);
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_verbose("Pass: setMillis correctly pinned min, returned : %d", dateBit);
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	}
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting invalid setMillis values detected\n");
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	testMillis = -184303902611600000.0;
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	log_verbose("using value[%lf]\n", testMillis);
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(caldef3, UCAL_LENIENT, 0);
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   	ucal_setMillis(caldef3, testMillis, &status);
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   	if(U_FAILURE(status)){
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   		log_verbose("Pass: Illegal argument error as expected : for millis : %e : returned  : %s\n", testMillis, u_errorName(status));
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org		status = U_ZERO_ERROR;
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   	} else {
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org		dateBit = ucal_get(caldef3, UCAL_DAY_OF_MONTH, &status);
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org		log_err("Fail: error in setMillis, allowed invalid value %e : returns DayOfMonth : %d", testMillis, dateBit);
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	}
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org	/*-------------------*/
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ctest_setTimeZone(NULL, &status);
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing ucal_setTimeZone() and ucal_getTimeZoneID function*/
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting if the function ucal_setTimeZone() and ucal_getTimeZoneID work fine\n");
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    idLen = ucal_getTimeZoneID(caldef2, id, sizeof(id)/sizeof(id[0]), &status);
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    (void)idLen;    /* Suppress set but not used warning. */
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getTimeZoneID : %s\n", u_errorName(status));
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (u_strcmp(id, fgGMTID) != 0) {
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: getTimeZoneID returns a wrong ID: actual=%d, expected=%s\n", austrdup(id), austrdup(fgGMTID));
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: getTimeZoneID works fine\n");
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setMillis(caldef2, d2, &status);
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getMillis : %s\n", u_errorName(status));
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    hour=ucal_get(caldef2, UCAL_HOUR_OF_DAY, &status);
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzID, "PST");
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setTimeZone(caldef2,tzID, 3, &status);
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in setting the time zone using ucal_setTimeZone(): %s\n", u_errorName(status));
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("ucal_setTimeZone worked fine\n");
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    idLen = ucal_getTimeZoneID(caldef2, id, sizeof(id)/sizeof(id[0]), &status);
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getTimeZoneID : %s\n", u_errorName(status));
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (u_strcmp(id, tzID) != 0) {
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: getTimeZoneID returns a wrong ID: actual=%d, expected=%s\n", austrdup(id), austrdup(tzID));
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: getTimeZoneID works fine\n");
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(hour == ucal_get(caldef2, UCAL_HOUR_OF_DAY, &status))
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error setting the time zone doesn't change the represented time\n");
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if((hour-8 + 1) != ucal_get(caldef2, UCAL_HOUR_OF_DAY, &status)) /*because it is not in daylight savings time */
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error setTimeZone doesn't change the represented time correctly with 8 hour offset\n");
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: setTimeZone works fine\n");
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing setTimeZone roundtrip */
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting setTimeZone() roundtrip\n");
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strcpy(tzID, fgGMTID);
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setTimeZone(caldef2, tzID, 3, &status);
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in setting the time zone using ucal_setTimeZone(): %s\n", u_errorName(status));
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(d2==ucal_getMillis(caldef2, &status))
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: setTimeZone roundtrip test passed\n");
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: setTimeZone roundtrip test failed\n");
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    zoneOffset = ucal_get(caldef2, UCAL_ZONE_OFFSET, &status);
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getting the time zone using ucal_get() after using ucal_setTimeZone(): %s\n", u_errorName(status));
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if (zoneOffset != 0) {
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getting the time zone using ucal_get() after using ucal_setTimeZone() offset=%d\n", zoneOffset);
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setTimeZone(caldef2, NULL, -1, &status);
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in setting the time zone using ucal_setTimeZone(): %s\n", u_errorName(status));
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ucal_getMillis(caldef2, &status))
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: setTimeZone roundtrip test passed\n");
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: setTimeZone roundtrip test failed\n");
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    zoneOffset = ucal_get(caldef2, UCAL_ZONE_OFFSET, &status);
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getting the time zone using ucal_get() after using ucal_setTimeZone(): %s\n", u_errorName(status));
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if (zoneOffset != -28800000) {
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getting the time zone using ucal_get() after using ucal_setTimeZone() offset=%d\n", zoneOffset);
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ctest_resetTimeZone();
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*----------------------------*     */
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing  if setDate works fine  */
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the ucal_setDate() function \n");
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(temp, "Dec 17, 1971, 11:05:28 PM");
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(caldef,1971, UCAL_DECEMBER, 17, &status);
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error in setting the calendar date : %s\n", u_errorName(status));
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*checking if the calendar date is set properly or not  */
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d1=ucal_getMillis(caldef, &status);
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_strcmp(myDateFormat(datdef, d1), temp)==0)
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS:setDate works fine\n");
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL:Error in setDate()\n");
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Testing setDate Extensively with various input values */
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting ucal_setDate() extensively\n");
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(caldef, 1999, UCAL_JANUARY, 10, &status);
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1999  10th day of January  is :", caldef, datdef, 1999, UCAL_JANUARY, 10);
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(caldef, 1999, UCAL_DECEMBER, 3, &status);
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1999 3rd day of December  is :", caldef, datdef, 1999, UCAL_DECEMBER, 3);
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(caldef, 2000, UCAL_MAY, 3, &status);
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("2000 3rd day of May is :", caldef, datdef, 2000, UCAL_MAY, 3);
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(caldef, 1999, UCAL_AUGUST, 32, &status);
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1999 32th day of August is :", caldef, datdef, 1999, UCAL_SEPTEMBER, 1);
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(caldef, 1999, UCAL_MARCH, 0, &status);
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1999 0th day of March is :", caldef, datdef, 1999, UCAL_FEBRUARY, 28);
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(caldef, 0, UCAL_MARCH, 12, &status);
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*--------------------*/
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing if setDateTime works fine */
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the ucal_setDateTime() function \n");
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(temp, "May 3, 1972, 4:30:42 PM");
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(caldef,1972, UCAL_MAY, 3, 16, 30, 42, &status);
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error in setting the calendar date : %s\n", u_errorName(status));
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*checking  if the calendar date is set properly or not  */
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d1=ucal_getMillis(caldef, &status);
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(u_strcmp(myDateFormat(datdef, d1), temp)==0)
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: setDateTime works fine\n");
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Error in setDateTime\n");
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing setDateTime extensively with various input values*/
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting ucal_setDateTime() function extensively\n");
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(caldef, 1999, UCAL_OCTOBER, 10, 6, 45, 30, &status);
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify2("1999  10th day of October  at 6:45:30 is :", caldef, datdef, 1999, UCAL_OCTOBER, 10, 6, 45, 30, 0 );
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(caldef, 1999, UCAL_MARCH, 3, 15, 10, 55, &status);
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify2("1999 3rd day of March   at 15:10:55 is :", caldef, datdef, 1999, UCAL_MARCH, 3, 3, 10, 55, 1);
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(caldef, 1999, UCAL_MAY, 3, 25, 30, 45, &status);
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify2("1999 3rd day of May at 25:30:45 is :", caldef, datdef, 1999, UCAL_MAY, 4, 1, 30, 45, 0);
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(caldef, 1999, UCAL_AUGUST, 32, 22, 65, 40, &status);
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify2("1999 32th day of August at 22:65:40 is :", caldef, datdef, 1999, UCAL_SEPTEMBER, 1, 11, 5, 40,1);
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(caldef, 1999, UCAL_MARCH, 12, 0, 0, 0,&status);
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify2("1999 12th day of March at 0:0:0 is :", caldef, datdef, 1999, UCAL_MARCH, 12, 0, 0, 0, 0);
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(caldef, 1999, UCAL_MARCH, 12, -10, -10,0, &status);
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify2("1999 12th day of March is at -10:-10:0 :", caldef, datdef, 1999, UCAL_MARCH, 11, 1, 50, 0, 1);
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*close caldef and datdef*/
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(caldef);
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(caldef2);
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(caldef3);
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    udat_close(datdef);
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*----------------------------------------------------------- */
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Confirm the functioning of the calendar field related functions.
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestFieldGetSet()
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar *cal = 0;
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[4];
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDateFormat *datdef = 0;
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d1 = 0;
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status=U_ZERO_ERROR;
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    (void)d1;   /* Suppress set but not used warning. */
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nFetching pointer to UCalendar using the ucal_open()\n");
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strcpy(tzID, fgGMTID);
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*open the calendar used */
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucal_open failed: %s - (Are you missing data?)\n", u_errorName(status));
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    datdef=udat_open(UDAT_SHORT,UDAT_SHORT ,NULL,fgGMTID,-1,NULL, 0, &status);
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status))
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error in creating the dateformat : %s (Are you missing data?)\n", u_errorName(status));
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing ucal_get()*/
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the ucal_get() function of Calendar\n");
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(cal, 1999, UCAL_MARCH, 12, 5, 25, 30, &status);
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error in the setDateTime() : %s (Are you missing data?)\n", u_errorName(status));
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ucal_get(cal, UCAL_YEAR, &status)!=1999 || ucal_get(cal, UCAL_MONTH, &status)!=2 ||
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(cal, UCAL_DATE, &status)!=12 || ucal_get(cal, UCAL_HOUR, &status)!=5)
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error in ucal_get() -> %s (Are you missing data?)\n", u_errorName(status));
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else if(ucal_get(cal, UCAL_DAY_OF_WEEK_IN_MONTH, &status)!=2 || ucal_get(cal, UCAL_DAY_OF_WEEK, &status)!=6
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        || ucal_get(cal, UCAL_WEEK_OF_MONTH, &status)!=2 || ucal_get(cal, UCAL_WEEK_OF_YEAR, &status)!= 11)
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: error in ucal_get()\n");
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: ucal_get() works fine\n");
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*Testing the ucal_set() , ucal_clear() functions of calendar*/
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the set, and clear  field functions of calendar\n");
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(cal, UCAL_LENIENT, 0);
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1997);
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, UCAL_JUNE);
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DATE, 3);
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1997 third day of June = ", cal, datdef, 1997, UCAL_JUNE, 3);
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1997);
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, UCAL_JUNE);
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK_IN_MONTH, 1);
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1997 first Tuesday in June = ", cal, datdef, 1997, UCAL_JUNE, 3);
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1997);
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, UCAL_JUNE);
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK_IN_MONTH, - 1);
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1997 last Tuesday in June = ", cal, datdef,1997,   UCAL_JUNE, 24);
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*give undesirable input    */
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1997);
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, UCAL_JUNE);
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK_IN_MONTH, 0);
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d1 = ucal_getMillis(cal, &status);
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (status != U_ILLEGAL_ARGUMENT_ERROR) {
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: U_ILLEGAL_ARGUMENT_ERROR was not returned for : 1997 zero-th Tuesday in June\n");
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: U_ILLEGAL_ARGUMENT_ERROR as expected\n");
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1997);
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, UCAL_JUNE);
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_WEEK_OF_MONTH, 1);
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1997 Tuesday in week 1 of June = ", cal,datdef, 1997, UCAL_JUNE, 3);
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1997);
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, UCAL_JUNE);
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_WEEK_OF_MONTH, 5);
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1997 Tuesday in week 5 of June = ", cal,datdef, 1997, UCAL_JULY, 1);
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1997);
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, UCAL_JUNE);
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_WEEK_OF_MONTH, 0);
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(cal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK,1);
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d1 = ucal_getMillis(cal,&status);
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (status != U_ILLEGAL_ARGUMENT_ERROR){
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: U_ILLEGAL_ARGUMENT_ERROR was not returned for : 1997 Tuesday zero-th week in June\n");
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: U_ILLEGAL_ARGUMENT_ERROR as expected\n");
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status = U_ZERO_ERROR;
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR_WOY, 1997);
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_WEEK_OF_YEAR, 1);
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1997 Tuesday in week 1 of year = ", cal, datdef,1996, UCAL_DECEMBER, 31);
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1997);
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_WEEK, UCAL_TUESDAY);
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_WEEK_OF_YEAR, 10);
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1997 Tuesday in week 10 of year = ", cal,datdef, 1997, UCAL_MARCH, 4);
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, 1999);
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DAY_OF_YEAR, 1);
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1999 1st day of the year =", cal, datdef, 1999, UCAL_JANUARY, 1);
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, -3);
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d1 = ucal_getMillis(cal,&status);
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (status != U_ILLEGAL_ARGUMENT_ERROR){
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: U_ILLEGAL_ARGUMENT_ERROR was not returned for : 1999 -3th month\n");
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: U_ILLEGAL_ARGUMENT_ERROR as expected\n");
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(cal, UCAL_LENIENT, 1);
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, -3);
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    verify1("1999 -3th month should be", cal, datdef, 1998, UCAL_OCTOBER, 1);
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*testing isSet and clearField()*/
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!ucal_isSet(cal, UCAL_WEEK_OF_YEAR))
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: error in isSet\n");
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: isSet working fine\n");
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clearField(cal, UCAL_WEEK_OF_YEAR);
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(ucal_isSet(cal, UCAL_WEEK_OF_YEAR))
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: there is an error in clearField or isSet\n");
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS :clearField working fine\n");
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*-------------------------------*/
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(cal);
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    udat_close(datdef);
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char * zone;
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t      year;
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t      month;
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t      day;
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t      hour;
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TransitionItem;
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TransitionItem transitionItems[] = {
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "America/Caracas", 2007, UCAL_DECEMBER,  8, 10 }, /* day before change in UCAL_ZONE_OFFSET */
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "US/Pacific",      2011,    UCAL_MARCH, 12, 10 }, /* day before change in UCAL_DST_OFFSET */
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL,                 0,             0,  0,  0 }
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Execute adding and rolling in Calendar extensively,
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAddRollExtensive()
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TransitionItem * itemPtr;
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar *cal = 0;
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i,limit;
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[32];
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendarDateFields e;
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t y,m,d,hr,min,sec,ms;
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t maxlimit = 40;
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    y = 1997; m = UCAL_FEBRUARY; d = 1; hr = 1; min = 1; sec = 0; ms = 0;
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("Testing add and roll extensively\n");
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzID, "PST");
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*open the calendar used */
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);;
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucal_open() failed : %s - (Are you missing data?)\n", u_errorName(status));
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, y);
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, m);
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DATE, d);
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(cal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK,1);
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Confirm that adding to various fields works.*/
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting to confirm that adding to various fields works with ucal_add()\n");
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_add(cal,UCAL_YEAR, 1, &status);
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_add failed: %s\n", u_errorName(status)); return; }
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    y++;
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_add(cal,UCAL_MONTH, 12, &status);
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_add failed: %s\n", u_errorName(status) ); return; }
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    y+=1;
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_add(cal,UCAL_DATE, 1, &status);
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_add failed: %s\n", u_errorName(status) ); return; }
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d++;
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_add(cal,UCAL_DATE, 2, &status);
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_add failed: %s\n", u_errorName(status) ); return; }
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d += 2;
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_add(cal,UCAL_DATE, 28, &status);
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_add failed: %s\n", u_errorName(status) ); return; }
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++m;
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_add(cal, (UCalendarDateFields)-1, 10, &status);
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status==U_ILLEGAL_ARGUMENT_ERROR)
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Pass: Illegal argument error as expected\n");
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Fail: No, illegal argument error as expected. Got....: %s\n", u_errorName(status));
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*confirm that applying roll to various fields works fine*/
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting to confirm that ucal_roll() works\n");
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_roll(cal, UCAL_DATE, -1, &status);
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_roll failed: %s\n", u_errorName(status) ); return; }
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d -=1;
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_roll(cal, UCAL_MONTH, -2, &status);
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_roll failed: %s\n", u_errorName(status) ); return; }
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    m -=2;
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_roll(cal, UCAL_DATE, 1, &status);
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_roll failed: %s\n", u_errorName(status) ); return; }
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d +=1;
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_roll(cal, UCAL_MONTH, -12, &status);
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_roll failed: %s\n", u_errorName(status) ); return; }
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_roll(cal, UCAL_YEAR, -1, &status);
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_roll failed: %s\n", u_errorName(status) ); return; }
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    y -=1;
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_roll(cal, UCAL_DATE, 29, &status);
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_err("ucal_roll failed: %s\n", u_errorName(status) ); return; }
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    d = 2;
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, y, m, d);
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_roll(cal, (UCalendarDateFields)-1, 10, &status);
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(status==U_ILLEGAL_ARGUMENT_ERROR)
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Pass: illegal arguement error as expected\n");
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else{
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Fail: no illegal argument error got..: %s\n", u_errorName(status));
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(cal);
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(cal, 1999, UCAL_FEBRUARY, 28, 10, 30, 45,  &status);
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("error is setting the datetime: %s\n", u_errorName(status));
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_add(cal, UCAL_MONTH, 1, &status);
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDate(cal, 1999, UCAL_MARCH, 28);
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_add(cal, UCAL_MILLISECOND, 1000, &status);
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    checkDateTime(cal, 1999, UCAL_MARCH, 28, 10, 30, 46, 0, UCAL_MILLISECOND);
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(cal);
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*--------------- */
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Testing add and roll extensively */
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the ucal_add() and ucal_roll() functions extensively\n");
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    y = 1997; m = UCAL_FEBRUARY; d = 1; hr = 1; min = 1; sec = 0; ms = 0;
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_open failed: %s\n", u_errorName(status));
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_YEAR, y);
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MONTH, m);
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_DATE, d);
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_HOUR, hr);
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MINUTE, min);
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_SECOND,sec);
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(cal, UCAL_MILLISECOND, ms);
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(cal, UCAL_MINIMAL_DAYS_IN_FIRST_WEEK,1);
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting UCalendar add...\n");
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(e = UCAL_YEAR;e < UCAL_FIELD_COUNT; e=(UCalendarDateFields)((int32_t)e + 1)) {
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        limit = maxlimit;
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < limit; i++) {
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_add(cal, e, 1, &status);
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status)) { limit = i; status = U_ZERO_ERROR; }
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < limit; i++) {
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_add(cal, e, -1, &status);
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status)) {
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ucal_add -1 failed: %s\n", u_errorName(status));
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        checkDateTime(cal, y, m, d, hr, min, sec, ms, e);
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting calendar ucal_roll()...\n");
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for(e = UCAL_YEAR;e < UCAL_FIELD_COUNT; e=(UCalendarDateFields)((int32_t)e + 1)) {
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        limit = maxlimit;
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < limit; i++) {
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_roll(cal, e, 1, &status);
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status)) {
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                limit = i;
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_ZERO_ERROR;
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < limit; i++) {
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_roll(cal, e, -1, &status);
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status)) {
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ucal_roll -1 failed: %s\n", u_errorName(status));
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                return;
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        checkDateTime(cal, y, m, d, hr, min, sec, ms, e);
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(cal);
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*--------------- */
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting ucal_add() across ZONE_OFFSET and DST_OFFSE transitions.\n");
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (itemPtr = transitionItems; itemPtr->zone != NULL; itemPtr++) {
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status=U_ZERO_ERROR;
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        u_uastrcpy(tzID, itemPtr->zone);
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_open failed for zone %s: %s\n", itemPtr->zone, u_errorName(status));
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            continue;
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_setDateTime(cal, itemPtr->year, itemPtr->month, itemPtr->day, itemPtr->hour, 0, 0, &status);
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_add(cal, UCAL_DATE, 1, &status);
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        hr = ucal_get(cal, UCAL_HOUR_OF_DAY, &status);
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ( U_FAILURE(status) ) {
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_add failed adding day across transition for zone %s: %s\n", itemPtr->zone, u_errorName(status));
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if ( hr != itemPtr->hour ) {
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_add produced wrong hour %d when adding day across transition for zone %s\n", hr, itemPtr->zone);
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_add(cal, UCAL_DATE, -1, &status);
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            hr = ucal_get(cal, UCAL_HOUR_OF_DAY, &status);
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_FAILURE(status) ) {
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ucal_add failed subtracting day across transition for zone %s: %s\n", itemPtr->zone, u_errorName(status));
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if ( hr != itemPtr->hour ) {
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("ucal_add produced wrong hour %d when subtracting day across transition for zone %s\n", hr, itemPtr->zone);
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_close(cal);
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*------------------------------------------------------ */
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*Testing the Limits for various Fields of Calendar*/
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetLimits()
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar *cal = 0;
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t min, max, gr_min, le_max, ac_min, ac_max, val;
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[4];
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzID, "PST");
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*open the calendar used */
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_GREGORIAN, &status);;
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucal_open() for gregorian calendar failed in TestGetLimits: %s - (Are you missing data?)\n", u_errorName(status));
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the getLimits function for various fields\n");
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(cal, 1999, UCAL_MARCH, 5, &status); /* Set the date to be March 5, 1999 */
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    val = ucal_get(cal, UCAL_DAY_OF_WEEK, &status);
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    min = ucal_getLimit(cal, UCAL_DAY_OF_WEEK, UCAL_MINIMUM, &status);
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    max = ucal_getLimit(cal, UCAL_DAY_OF_WEEK, UCAL_MAXIMUM, &status);
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( (min != UCAL_SUNDAY || max != UCAL_SATURDAY ) && (min > val && val > max)  && (val != UCAL_FRIDAY)){
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           log_err("FAIL: Min/max bad\n");
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           log_err("FAIL: Day of week %d out of range\n", val);
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           log_err("FAIL: FAIL: Day of week should be SUNDAY Got %d\n", val);
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("getLimits successful\n");
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    val = ucal_get(cal, UCAL_DAY_OF_WEEK_IN_MONTH, &status);
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    min = ucal_getLimit(cal, UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_MINIMUM, &status);
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    max = ucal_getLimit(cal, UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_MAXIMUM, &status);
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( (min != 0 || max != 5 ) && (min > val && val > max)  && (val != 1)){
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           log_err("FAIL: Min/max bad\n");
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           log_err("FAIL: Day of week in month %d out of range\n", val);
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           log_err("FAIL: FAIL: Day of week in month should be SUNDAY Got %d\n", val);
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("getLimits successful\n");
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    min=ucal_getLimit(cal, UCAL_MONTH, UCAL_MINIMUM, &status);
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    max=ucal_getLimit(cal, UCAL_MONTH, UCAL_MAXIMUM, &status);
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gr_min=ucal_getLimit(cal, UCAL_MONTH, UCAL_GREATEST_MINIMUM, &status);
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_max=ucal_getLimit(cal, UCAL_MONTH, UCAL_LEAST_MAXIMUM, &status);
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ac_min=ucal_getLimit(cal, UCAL_MONTH, UCAL_ACTUAL_MINIMUM, &status);
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ac_max=ucal_getLimit(cal, UCAL_MONTH, UCAL_ACTUAL_MAXIMUM, &status);
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Error in getLimits: %s\n", u_errorName(status));
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(min!=0 || max!=11 || gr_min!=0 || le_max!=11 || ac_min!=0 || ac_max!=11)
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("There is and error in getLimits in fetching the values\n");
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("getLimits successful\n");
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(cal, 1999, UCAL_MARCH, 5, 4, 10, 35, &status);
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    val=ucal_get(cal, UCAL_HOUR_OF_DAY, &status);
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    min=ucal_getLimit(cal, UCAL_HOUR_OF_DAY, UCAL_MINIMUM, &status);
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    max=ucal_getLimit(cal, UCAL_HOUR_OF_DAY, UCAL_MAXIMUM, &status);
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gr_min=ucal_getLimit(cal, UCAL_MINUTE, UCAL_GREATEST_MINIMUM, &status);
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    le_max=ucal_getLimit(cal, UCAL_MINUTE, UCAL_LEAST_MAXIMUM, &status);
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ac_min=ucal_getLimit(cal, UCAL_MINUTE, UCAL_ACTUAL_MINIMUM, &status);
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ac_max=ucal_getLimit(cal, UCAL_SECOND, UCAL_ACTUAL_MAXIMUM, &status);
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if( (min!=0 || max!= 11 || gr_min!=0 || le_max!=60 || ac_min!=0 || ac_max!=60) &&
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        (min>val && val>max) && val!=4){
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Min/max bad\n");
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Hour of Day %d out of range\n", val);
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: HOUR_OF_DAY should be 4 Got %d\n", val);
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("getLimits successful\n");
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*get BOGUS_LIMIT type*/
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    val=ucal_getLimit(cal, UCAL_SECOND, (UCalendarLimitType)99, &status);
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(val != -1){
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: ucal_getLimit() with BOGUS type should return -1\n");
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    status=U_ZERO_ERROR;
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(cal);
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Test that the days of the week progress properly when add is called repeatedly
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for increments of 24 days.
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestDOWProgression()
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t initialDOW, DOW, newDOW, expectedDOW;
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar *cal = 0;
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDateFormat *datfor = 0;
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1;
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t delta=24;
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[4];
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char tempMsgBuf[256];
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strcpy(tzID, fgGMTID);
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*open the calendar used */
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal=ucal_open(tzID, u_strlen(tzID), "en_US", UCAL_TRADITIONAL, &status);;
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucal_open failed: %s - (Are you missing data?)\n", u_errorName(status));
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    datfor=udat_open(UDAT_MEDIUM,UDAT_MEDIUM ,NULL, fgGMTID,-1,NULL, 0, &status);
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error in creating the dateformat : %s (Are you missing data?)\n", u_errorName(status));
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDate(cal, 1999, UCAL_JANUARY, 1, &status);
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the DOW progression\n");
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    initialDOW = ucal_get(cal, UCAL_DAY_OF_WEEK, &status);
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) { log_data_err("ucal_get() failed: %s (Are you missing data?)\n", u_errorName(status) ); return; }
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    newDOW = initialDOW;
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    do {
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        DOW = newDOW;
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("DOW = %d...\n", DOW);
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        date1=ucal_getMillis(cal, &status);
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status)){ log_err("ucal_getMiilis() failed: %s\n", u_errorName(status)); return;}
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%s\n", u_austrcpy(tempMsgBuf, myDateFormat(datfor, date1)));
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_add(cal,UCAL_DAY_OF_WEEK, delta, &status);
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) { log_err("ucal_add() failed: %s\n", u_errorName(status)); return; }
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        newDOW = ucal_get(cal, UCAL_DAY_OF_WEEK, &status);
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) { log_err("ucal_get() failed: %s\n", u_errorName(status)); return; }
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        expectedDOW = 1 + (DOW + delta - 1) % 7;
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        date1=ucal_getMillis(cal, &status);
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(status)){ log_err("ucal_getMiilis() failed: %s\n", u_errorName(status)); return;}
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (newDOW != expectedDOW) {
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("Day of week should be %d instead of %d on %s", expectedDOW, newDOW,
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_austrcpy(tempMsgBuf, myDateFormat(datfor, date1)) );
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    while (newDOW != initialDOW);
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(cal);
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    udat_close(datfor);
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Confirm that the offset between local time and GMT behaves as expected.
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGMTvsLocal()
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("\nTesting the offset between the GMT and local time\n");
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testZones(1999, 1, 1, 12, 0, 0);
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testZones(1999, 4, 16, 18, 30, 0);
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    testZones(1998, 12, 17, 19, 0, 0);
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void testZones(int32_t yr, int32_t mo, int32_t dt, int32_t hr, int32_t mn, int32_t sc)
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t offset,utc, expected;
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar *gmtcal = 0, *cal = 0;
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date1;
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double temp;
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDateFormat *datfor = 0;
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[4];
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char tempMsgBuf[256];
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_strcpy(tzID, fgGMTID);
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    gmtcal=ucal_open(tzID, 3, "en_US", UCAL_TRADITIONAL, &status);;
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucal_open failed: %s - (Are you missing data?)\n", u_errorName(status));
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzID, "PST");
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal = ucal_open(tzID, 3, "en_US", UCAL_TRADITIONAL, &status);
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_open failed: %s\n", u_errorName(status));
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    datfor=udat_open(UDAT_MEDIUM,UDAT_MEDIUM ,NULL, fgGMTID,-1,NULL, 0, &status);
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(status)){
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("error in creating the dateformat : %s (Are you missing data?)\n", u_errorName(status));
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(gmtcal, yr, mo - 1, dt, hr, mn, sc, &status);
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucal_setDateTime failed: %s (Are you missing data?)\n", u_errorName(status));
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_set(gmtcal, UCAL_MILLISECOND, 0);
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    date1 = ucal_getMillis(gmtcal, &status);
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_getMillis failed: %s\n", u_errorName(status));
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    log_verbose("date = %s\n", u_austrcpy(tempMsgBuf, myDateFormat(datfor, date1)) );
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setMillis(cal, date1, &status);
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_setMillis() failed: %s\n", u_errorName(status));
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    offset = ucal_get(cal, UCAL_ZONE_OFFSET, &status);
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    offset += ucal_get(cal, UCAL_DST_OFFSET, &status);
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_get() failed: %s\n", u_errorName(status));
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    temp=(double)((double)offset / 1000.0 / 60.0 / 60.0);
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*printf("offset for %s %f hr\n", austrdup(myDateFormat(datfor, date1)), temp);*/
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    utc = ((ucal_get(cal, UCAL_HOUR_OF_DAY, &status) * 60 +
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(cal, UCAL_MINUTE, &status)) * 60 +
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   ucal_get(cal, UCAL_SECOND, &status)) * 1000 +
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(cal, UCAL_MILLISECOND, &status) - offset;
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_get() failed: %s\n", u_errorName(status));
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expected = ((hr * 60 + mn) * 60 + sc) * 1000;
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (utc != expected) {
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        temp=(double)(utc - expected)/ 1000 / 60 / 60.0;
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Discrepancy of %d  millis = %fhr\n", utc-expected, temp );
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: the offset between local and GMT is correct\n");
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(gmtcal);
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(cal);
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    udat_close(datfor);
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* INTERNAL FUNCTIONS USED */
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*------------------------------------------------------------------------------------------- */
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void checkDateTime(UCalendar* c,
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        int32_t y, int32_t m, int32_t d,
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        int32_t hr, int32_t min, int32_t sec,
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        int32_t ms, UCalendarDateFields field)
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucal_get(c, UCAL_YEAR, &status) != y ||
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_MONTH, &status) != m ||
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_DATE, &status) != d ||
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_HOUR, &status) != hr ||
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_MINUTE, &status) != min ||
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_SECOND, &status) != sec ||
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_MILLISECOND, &status) != ms) {
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("U_FAILURE for field  %d, Expected y/m/d h:m:s:ms of %d/%d/%d %d:%d:%d:%d  got %d/%d/%d %d:%d:%d:%d\n",
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (int32_t)field, y, m + 1, d, hr, min, sec, ms,
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_YEAR, &status),
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_MONTH, &status) + 1,
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_DATE, &status),
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_HOUR, &status),
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_MINUTE, &status) + 1,
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_SECOND, &status),
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_MILLISECOND, &status) );
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_FAILURE(status)){
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("ucal_get failed: %s\n", u_errorName(status));
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    return;
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     }
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Confirmed: %d/%d/%d %d:%d:%d:%d\n", y, m + 1, d, hr, min, sec, ms);
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void checkDate(UCalendar* c, int32_t y, int32_t m, int32_t d)
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucal_get(c,UCAL_YEAR, &status) != y ||
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_MONTH, &status) != m ||
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_DATE, &status) != d) {
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAILURE: Expected y/m/d of %d/%d/%d  got %d/%d/%d\n", y, m + 1, d,
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_YEAR, &status),
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_MONTH, &status) + 1,
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_get(c, UCAL_DATE, &status) );
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_get failed: %s\n", u_errorName(status));
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("Confirmed: %d/%d/%d\n", y, m + 1, d);
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------- */
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void verify1(const char* msg, UCalendar* c, UDateFormat* dat, int32_t year, int32_t month, int32_t day)
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d1;
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucal_get(c, UCAL_YEAR, &status) == year &&
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_MONTH, &status) == month &&
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_DATE, &status) == day) {
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Calendar::get failed: %s\n", u_errorName(status));
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: %s\n", msg);
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        d1=ucal_getMillis(c, &status);
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_getMillis failed: %s\n", u_errorName(status));
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*log_verbose(austrdup(myDateFormat(dat, d1)) );*/
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: %s\n", msg);
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        d1=ucal_getMillis(c, &status);
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_getMillis failed: %s\n", u_errorName(status) );
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Got %s  Expected %d/%d/%d \n", austrdup(myDateFormat(dat, d1)), year, month + 1, day );
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* ------------------------------------ */
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void verify2(const char* msg, UCalendar* c, UDateFormat* dat, int32_t year, int32_t month, int32_t day,
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                                     int32_t hour, int32_t min, int32_t sec, int32_t am_pm)
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate d1;
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char tempMsgBuf[256];
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucal_get(c, UCAL_YEAR, &status) == year &&
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_MONTH, &status) == month &&
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_DATE, &status) == day &&
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_HOUR, &status) == hour &&
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_MINUTE, &status) == min &&
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_SECOND, &status) == sec &&
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_get(c, UCAL_AM_PM, &status) == am_pm ){
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: Calendar::get failed: %s\n", u_errorName(status));
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("PASS: %s\n", msg);
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        d1=ucal_getMillis(c, &status);
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_getMillis failed: %s\n", u_errorName(status));
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("%s\n" , u_austrcpy(tempMsgBuf, myDateFormat(dat, d1)) );
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else {
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: %s\n", msg);
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        d1=ucal_getMillis(c, &status);
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_getMillis failed: %s\n", u_errorName(status));
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            return;
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("Got %s Expected %d/%d/%d/ %d:%d:%d  %s\n", austrdup(myDateFormat(dat, d1)),
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            year, month + 1, day, hour, min, sec, (am_pm==0) ? "AM": "PM");
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestGregorianChange() {
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UChar utc[] = { 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0 }; /* "Etc/GMT" */
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t dayMillis = 86400 * INT64_C(1000);    /* 1 day = 86400 seconds */
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar *cal;
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate date;
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode errorCode = U_ZERO_ERROR;
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test ucal_setGregorianChange() on a Gregorian calendar. */
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal = ucal_open(utc, -1, "", UCAL_GREGORIAN, &errorCode);
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("ucal_open(UTC) failed: %s - (Are you missing data?)\n", u_errorName(errorCode));
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setGregorianChange(cal, -365 * (dayMillis * (UDate)1), &errorCode);
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_setGregorianChange(1969) failed: %s\n", u_errorName(errorCode));
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        date = ucal_getGregorianChange(cal, &errorCode);
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(U_FAILURE(errorCode) || date != -365 * (dayMillis * (UDate)1)) {
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("ucal_getGregorianChange() failed: %s, date = %f\n", u_errorName(errorCode), date);
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(cal);
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Test ucal_setGregorianChange() on a non-Gregorian calendar where it should fail. */
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    cal = ucal_open(utc, -1, "th@calendar=buddhist", UCAL_TRADITIONAL, &errorCode);
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(U_FAILURE(errorCode)) {
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_open(UTC, non-Gregorian) failed: %s\n", u_errorName(errorCode));
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setGregorianChange(cal, -730 * (dayMillis * (UDate)1), &errorCode);
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode != U_UNSUPPORTED_ERROR) {
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_setGregorianChange(non-Gregorian calendar) did not yield U_UNSUPPORTED_ERROR but %s\n",
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(errorCode));
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    errorCode = U_ZERO_ERROR;
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    date = ucal_getGregorianChange(cal, &errorCode);
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(errorCode != U_UNSUPPORTED_ERROR) {
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("ucal_getGregorianChange(non-Gregorian calendar) did not yield U_UNSUPPORTED_ERROR but %s\n",
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                u_errorName(errorCode));
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(cal);
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestGetKeywordValuesForLocale() {
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define PREFERRED_SIZE 15
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define MAX_NUMBER_OF_KEYWORDS 5
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *PREFERRED[PREFERRED_SIZE][MAX_NUMBER_OF_KEYWORDS+1] = {
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "root",        "gregorian", NULL, NULL, NULL, NULL },
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "und",         "gregorian", NULL, NULL, NULL, NULL },
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "en_US",       "gregorian", NULL, NULL, NULL, NULL },
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "en_029",      "gregorian", NULL, NULL, NULL, NULL },
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "th_TH",       "buddhist", "gregorian", NULL, NULL, NULL },
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "und_TH",      "buddhist", "gregorian", NULL, NULL, NULL },
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "en_TH",       "buddhist", "gregorian", NULL, NULL, NULL },
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "he_IL",       "gregorian", "hebrew", "islamic", "islamic-civil", "islamic-tbla" },
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "ar_EG",       "gregorian", "coptic", "islamic", "islamic-civil", "islamic-tbla" },
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "ja",          "gregorian", "japanese", NULL, NULL, NULL },
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "ps_Guru_IN",  "gregorian", "indian", NULL, NULL, NULL },
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "th@calendar=gregorian", "buddhist", "gregorian", NULL, NULL, NULL },
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "en@calendar=islamic",   "gregorian", NULL, NULL, NULL, NULL },
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "zh_TW",       "gregorian", "roc", "chinese", NULL, NULL },
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            { "ar_IR",       "persian", "gregorian", "islamic", "islamic-civil", "islamic-tbla" },
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const int32_t EXPECTED_SIZE[PREFERRED_SIZE] = { 1, 1, 1, 1, 2, 2, 2, 5, 5, 2, 2, 2, 1, 3, 5 };
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t i, size, j;
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UEnumeration *all, *pref;
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *loc = NULL;
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool matchPref, matchAll;
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *value;
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t valueLength;
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UList *ALLList = NULL;
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UEnumeration *ALL = ucal_getKeywordValuesForLocale("calendar", uloc_getDefault(), FALSE, &status);
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (i = 0; i < PREFERRED_SIZE; i++) {
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pref = NULL;
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            all = NULL;
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            loc = PREFERRED[i][0];
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pref = ucal_getKeywordValuesForLocale("calendar", loc, TRUE, &status);
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            matchPref = FALSE;
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            matchAll = FALSE;
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            value = NULL;
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            valueLength = 0;
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_SUCCESS(status) && uenum_count(pref, &status) == EXPECTED_SIZE[i]) {
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                matchPref = TRUE;
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (j = 0; j < EXPECTED_SIZE[i]; j++) {
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if ((value = uenum_next(pref, &valueLength, &status)) != NULL && U_SUCCESS(status)) {
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (uprv_strcmp(value, PREFERRED[i][j+1]) != 0) {
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            matchPref = FALSE;
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            break;
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        matchPref = FALSE;
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("ERROR getting keyword value for locale \"%s\"\n", loc);
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        break;
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!matchPref) {
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: Preferred values for locale \"%s\" does not match expected.\n", loc);
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                break;
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum_close(pref);
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            all = ucal_getKeywordValuesForLocale("calendar", loc, FALSE, &status);
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            size = uenum_count(all, &status);
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_SUCCESS(status) && size == uenum_count(ALL, &status)) {
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                matchAll = TRUE;
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ALLList = ulist_getListFromEnum(ALL);
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                for (j = 0; j < size; j++) {
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if ((value = uenum_next(all, &valueLength, &status)) != NULL && U_SUCCESS(status)) {
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (!ulist_containsString(ALLList, value, uprv_strlen(value))) {
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("Locale %s have %s not in ALL\n", loc, value);
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            matchAll = FALSE;
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            break;
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        matchAll = FALSE;
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("ERROR getting \"all\" keyword value for locale \"%s\"\n", loc);
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        break;
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (!matchAll) {
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: All values for locale \"%s\" does not match expected.\n", loc);
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uenum_close(all);
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err_status(status, "Failed to get ALL keyword values for default locale %s: %s.\n", uloc_getDefault(), u_errorName(status));
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uenum_close(ALL);
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Weekend tests, ported from
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * icu4j/trunk/main/tests/core/src/com/ibm/icu/dev/test/calendar/IBMCalendarTest.java
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and extended a bit. Notes below from IBMCalendarTest.java ...
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This test tests for specific locale data. This is probably okay
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * as far as US data is concerned, but if the Arabic/Yemen data
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * changes, this test will have to be updated.
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t year;
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t month;
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t day;
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t hour;
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t millisecOffset;
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool   isWeekend;
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TestWeekendDates;
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char * locale;
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const        TestWeekendDates * dates;
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t      numDates;
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TestWeekendDatesList;
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TestWeekendDates weekendDates_en_US[] = {
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 17, 23,  0, 0 }, /* Fri 23:00        */
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 18,  0, -1, 0 }, /* Fri 23:59:59.999 */
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 18,  0,  0, 1 }, /* Sat 00:00        */
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 18, 15,  0, 1 }, /* Sat 15:00        */
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 19, 23,  0, 1 }, /* Sun 23:00        */
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 20,  0, -1, 1 }, /* Sun 23:59:59.999 */
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 20,  0,  0, 0 }, /* Mon 00:00        */
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 20,  8,  0, 0 }, /* Mon 08:00        */
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TestWeekendDates weekendDates_ar_OM[] = {
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 15, 23,  0, 0 }, /* Wed 23:00        */
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 16,  0, -1, 0 }, /* Wed 23:59:59.999 */
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 16,  0,  0, 1 }, /* Thu 00:00        */
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 16, 15,  0, 1 }, /* Thu 15:00        */
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 17, 23,  0, 1 }, /* Fri 23:00        */
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 18,  0, -1, 1 }, /* Fri 23:59:59.999 */
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 18,  0,  0, 0 }, /* Sat 00:00        */
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { 2000, UCAL_MARCH, 18,  8,  0, 0 }, /* Sat 08:00        */
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TestWeekendDatesList testDates[] = {
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en_US", weekendDates_en_US, sizeof(weekendDates_en_US)/sizeof(weekendDates_en_US[0]) },
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "ar_OM", weekendDates_ar_OM, sizeof(weekendDates_ar_OM)/sizeof(weekendDates_ar_OM[0]) },
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendarDaysOfWeek  dayOfWeek;
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendarWeekdayType dayType;
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t              transition; /* transition time if dayType is UCAL_WEEKEND_ONSET or UCAL_WEEKEND_CEASE; else must be 0 */
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TestDaysOfWeek;
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *           locale;
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TestDaysOfWeek * days;
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t                numDays;
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TestDaysOfWeekList;
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TestDaysOfWeek daysOfWeek_en_US[] = {
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_MONDAY,   UCAL_WEEKDAY,       0        },
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_FRIDAY,   UCAL_WEEKDAY,       0        },
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_SATURDAY, UCAL_WEEKEND,       0        },
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_SUNDAY,   UCAL_WEEKEND,       0        },
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TestDaysOfWeek daysOfWeek_ar_OM[] = { /* Thursday:Friday */
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_WEDNESDAY,UCAL_WEEKDAY,       0        },
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_SATURDAY, UCAL_WEEKDAY,       0        },
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_THURSDAY, UCAL_WEEKEND,       0        },
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_FRIDAY,   UCAL_WEEKEND,       0        },
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TestDaysOfWeek daysOfWeek_hi_IN[] = { /* Sunday only */
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_MONDAY,   UCAL_WEEKDAY,       0        },
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_FRIDAY,   UCAL_WEEKDAY,       0        },
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_SATURDAY, UCAL_WEEKDAY,       0        },
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { UCAL_SUNDAY,   UCAL_WEEKEND,       0        },
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TestDaysOfWeekList testDays[] = {
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en_US", daysOfWeek_en_US, sizeof(daysOfWeek_en_US)/sizeof(daysOfWeek_en_US[0]) },
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "ar_OM", daysOfWeek_ar_OM, sizeof(daysOfWeek_ar_OM)/sizeof(daysOfWeek_ar_OM[0]) },
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "hi_IN", daysOfWeek_hi_IN, sizeof(daysOfWeek_hi_IN)/sizeof(daysOfWeek_hi_IN[0]) },
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar logDateFormat[] = { 0x0045,0x0045,0x0045,0x0020,0x004D,0x004D,0x004D,0x0020,0x0064,0x0064,0x0020,0x0079,
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0x0079,0x0079,0x0079,0x0020,0x0047,0x0020,0x0048,0x0048,0x003A,0x006D,0x006D,0x003A,
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       0x0073,0x0073,0x002E,0x0053,0x0053,0x0053,0 }; /* "EEE MMM dd yyyy G HH:mm:ss.SSS" */
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum { kFormattedDateMax = 2*sizeof(logDateFormat)/sizeof(logDateFormat[0]) };
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestWeekend() {
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TestWeekendDatesList * testDatesPtr = testDates;
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TestDaysOfWeekList *   testDaysPtr = testDays;
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t count, subCount;
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode fmtStatus = U_ZERO_ERROR;
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDateFormat * fmt = udat_open(UDAT_NONE, UDAT_NONE, "en", NULL, 0, NULL, 0, &fmtStatus);
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(fmtStatus)) {
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        udat_applyPattern(fmt, FALSE, logDateFormat, -1);
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("Unable to create UDateFormat - %s\n", u_errorName(fmtStatus));
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (count = sizeof(testDates)/sizeof(testDates[0]); count-- > 0; ++testDatesPtr) {
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode status = U_ZERO_ERROR;
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCalendar * cal = ucal_open(NULL, 0, testDatesPtr->locale, UCAL_GREGORIAN, &status);
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("locale: %s\n", testDatesPtr->locale);
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const TestWeekendDates * weekendDatesPtr = testDatesPtr->dates;
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (subCount = testDatesPtr->numDates; subCount--; ++weekendDatesPtr) {
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UDate dateToTest;
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBool isWeekend;
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                char  fmtDateBytes[kFormattedDateMax] = "<could not format test date>"; /* initialize for failure */
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_clear(cal);
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setDateTime(cal, weekendDatesPtr->year, weekendDatesPtr->month, weekendDatesPtr->day,
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 weekendDatesPtr->hour, 0, 0, &status);
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                dateToTest = ucal_getMillis(cal, &status) + weekendDatesPtr->millisecOffset;
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                isWeekend = ucal_isWeekend(cal, dateToTest, &status);
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_SUCCESS(fmtStatus)) {
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UChar fmtDate[kFormattedDateMax];
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    (void)udat_format(fmt, dateToTest, fmtDate, kFormattedDateMax, NULL, &fmtStatus);
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_SUCCESS(fmtStatus)) {
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        u_austrncpy(fmtDateBytes, fmtDate, kFormattedDateMax);
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fmtDateBytes[kFormattedDateMax-1] = 0;
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        fmtStatus = U_ZERO_ERROR;
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if ( U_FAILURE(status) ) {
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: locale %s date %s isWeekend() status %s\n", testDatesPtr->locale, fmtDateBytes, u_errorName(status) );
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    status = U_ZERO_ERROR;
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if ( (isWeekend!=0) != (weekendDatesPtr->isWeekend!=0) ) {
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: locale %s date %s isWeekend %d, expected the opposite\n", testDatesPtr->locale, fmtDateBytes, isWeekend );
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_verbose("OK:   locale %s date %s isWeekend %d\n", testDatesPtr->locale, fmtDateBytes, isWeekend );
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_close(cal);
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: ucal_open for locale %s failed: %s - (Are you missing data?)\n", testDatesPtr->locale, u_errorName(status) );
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(fmtStatus)) {
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        udat_close(fmt);
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (count = sizeof(testDays)/sizeof(testDays[0]); count-- > 0; ++testDaysPtr) {
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode status = U_ZERO_ERROR;
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCalendar * cal = ucal_open(NULL, 0, testDaysPtr->locale, UCAL_GREGORIAN, &status);
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_verbose("locale: %s\n", testDaysPtr->locale);
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const TestDaysOfWeek * daysOfWeekPtr = testDaysPtr->days;
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            for (subCount = testDaysPtr->numDays; subCount--; ++daysOfWeekPtr) {
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t transition = 0;
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UCalendarWeekdayType dayType = ucal_getDayOfWeekType(cal, daysOfWeekPtr->dayOfWeek, &status);
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if ( dayType == UCAL_WEEKEND_ONSET || dayType == UCAL_WEEKEND_CEASE ) {
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    transition = ucal_getWeekendTransition(cal, daysOfWeekPtr->dayOfWeek, &status);
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if ( U_FAILURE(status) ) {
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: locale %s DOW %d getDayOfWeekType() status %s\n", testDaysPtr->locale, daysOfWeekPtr->dayOfWeek, u_errorName(status) );
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    status = U_ZERO_ERROR;
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if ( dayType != daysOfWeekPtr->dayType || transition != daysOfWeekPtr->transition ) {
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: locale %s DOW %d type %d, expected %d\n", testDaysPtr->locale, daysOfWeekPtr->dayOfWeek, dayType, daysOfWeekPtr->dayType );
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_verbose("OK:   locale %s DOW %d type %d\n", testDaysPtr->locale, daysOfWeekPtr->dayOfWeek, dayType );
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_close(cal);
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: ucal_open for locale %s failed: %s - (Are you missing data?)\n", testDaysPtr->locale, u_errorName(status) );
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TestFieldDifference
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar * timezone;
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *  locale;
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate         start;
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate         target;
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool         progressive; /* TRUE to compute progressive difference for each field, FALSE to reset calendar after each call */
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t       yDiff;
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t       MDiff;
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t       dDiff;
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t       HDiff;
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t       mDiff;
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t       sDiff; /* 0x7FFFFFFF indicates overflow error expected */
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TFDItem;
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar tzUSPacific[] = { 0x55,0x53,0x2F,0x50,0x61,0x63,0x69,0x66,0x69,0x63,0 }; /* "US/Pacific" */
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar tzGMT[] = { 0x47,0x4D,0x54,0 }; /* "GMT" */
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TFDItem tfdItems[] = {
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* timezone    locale          start              target           progres  yDf  MDf    dDf     HDf       mDf         sDf */
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* For these we compute the progressive difference for each field - not resetting the calendar after each call */
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzUSPacific, "en_US",        1267459800000.0,   1277772600000.0,  TRUE,     0,   3,    27,      9,       40,          0 }, /* 2010-Mar-01 08:10 -> 2010-Jun-28 17:50 */
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzUSPacific, "en_US",        1267459800000.0,   1299089280000.0,  TRUE,     1,   0,     1,      1,       58,          0 }, /* 2010-Mar-01 08:10 -> 2011-Mar-02 10:08 */
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* For these we compute the total difference for each field - resetting the calendar after each call */
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",        0.0,               1073692800000.0,  FALSE,   34, 408, 12427, 298248, 17894880, 1073692800 }, /* 1970-Jan-01 00:00 -> 2004-Jan-10 00:00 */
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",        0.0,               1073779200000.0,  FALSE,   34, 408, 12428, 298272, 17896320, 1073779200 }, /* 1970-Jan-01 00:00 -> 2004-Jan-11 00:00 */
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",        0.0,               2147472000000.0,  FALSE,   68, 816, 24855, 596520, 35791200, 2147472000 }, /* 1970-Jan-01 00:00 -> 2038-Jan-19 00:00 */
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",        0.0,               2147558400000.0,  FALSE,   68, 816, 24856, 596544, 35792640, 0x7FFFFFFF }, /* 1970-Jan-01 00:00 -> 2038-Jan-20 00:00, seconds diff overflow */
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",        0.0,              -1073692800000.0,  FALSE,  -34,-408,-12427,-298248,-17894880,-1073692800 }, /* 1970-Jan-01 00:00 -> 1935-Dec-24 00:00 */
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",        0.0,              -1073779200000.0,  FALSE,  -34,-408,-12428,-298272,-17896320,-1073779200 }, /* 1970-Jan-01 00:00 -> 1935-Dec-23 00:00 */
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* check fwd/backward on either side of era boundary and across era boundary */
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",       -61978089600000.0,-61820409600000.0,  FALSE,    4,  59,  1825,  43800,  2628000,  157680000 }, /* CE   5-Dec-31 00:00 -> CE  10-Dec-30 00:00 */
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",       -61820409600000.0,-61978089600000.0,  FALSE,   -4, -59, -1825, -43800, -2628000, -157680000 }, /* CE  10-Dec-30 00:00 -> CE   5-Dec-31 00:00 */
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",       -62451129600000.0,-62293449600000.0,  FALSE,    4,  59,  1825,  43800,  2628000,  157680000 }, /* BCE 10-Jan-04 00:00 -> BCE  5-Jan-03 00:00 */
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",       -62293449600000.0,-62451129600000.0,  FALSE,   -4, -59, -1825, -43800, -2628000, -157680000 }, /* BCE  5-Jan-03 00:00 -> BCE 10-Jan-04 00:00 */
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",       -62293449600000.0,-61978089600000.0,  FALSE,    9, 119,  3650,  87600,  5256000,  315360000 }, /* BCE  5-Jan-03 00:00 -> CE   5-Dec-31 00:00 */
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT,       "en_US",       -61978089600000.0,-62293449600000.0,  FALSE,   -9,-119, -3650, -87600, -5256000, -315360000 }, /* CE   5-Dec-31 00:00 -> BCE  5-Jan-03 00:00 */
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=roc",    -1672704000000.0, -1515024000000.0,  FALSE,    4,  59,  1825,  43800,  2628000,  157680000 }, /* MG   5-Dec-30 00:00 -> MG  10-Dec-29 00:00 */
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=roc",    -1515024000000.0, -1672704000000.0,  FALSE,   -4, -59, -1825, -43800, -2628000, -157680000 }, /* MG  10-Dec-29 00:00 -> MG   5-Dec-30 00:00 */
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=roc",    -2145744000000.0, -1988064000000.0,  FALSE,    4,  59,  1825,  43800,  2628000,  157680000 }, /* BMG 10-Jan-03 00:00 -> BMG  5-Jan-02 00:00 */
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=roc",    -1988064000000.0, -2145744000000.0,  FALSE,   -4, -59, -1825, -43800, -2628000, -157680000 }, /* BMG  5-Jan-02 00:00 -> BMG 10-Jan-03 00:00 */
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=roc",    -1988064000000.0, -1672704000000.0,  FALSE,    9, 119,  3650,  87600,  5256000,  315360000 }, /* BMG  5-Jan-02 00:00 -> MG   5-Dec-30 00:00 */
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=roc",    -1672704000000.0, -1988064000000.0,  FALSE,   -9,-119, -3650, -87600, -5256000, -315360000 }, /* MG   5-Dec-30 00:00 -> BMG  5-Jan-02 00:00 */
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=coptic",-53026531200000.0,-52868851200000.0,  FALSE,    4,  64,  1825,  43800,  2628000,  157680000 }, /* Er1  5-Nas-05 00:00 -> Er1 10-Nas-04 00:00 */
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=coptic",-52868851200000.0,-53026531200000.0,  FALSE,   -4, -64, -1825, -43800, -2628000, -157680000 }, /* Er1 10-Nas-04 00:00 -> Er1  5-Nas-05 00:00 */
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=coptic",-53499571200000.0,-53341891200000.0,  FALSE,    4,  64,  1825,  43800,  2628000,  157680000 }, /* Er0 10-Tou-04 00:00 -> Er0  5-Tou-02 00:00 */
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=coptic",-53341891200000.0,-53499571200000.0,  FALSE,   -4, -64, -1825, -43800, -2628000, -157680000 }, /* Er0  5-Tou-02 00:00 -> Er0 10-Tou-04 00:00 */
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=coptic",-53341891200000.0,-53026531200000.0,  FALSE,    9, 129,  3650,  87600,  5256000,  315360000 }, /* Er0  5-Tou-02 00:00 -> Er1  5-Nas-05 00:00 */
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { tzGMT, "en@calendar=coptic",-53026531200000.0,-53341891200000.0,  FALSE,   -9,-129, -3650, -87600, -5256000, -315360000 }, /* Er1  5-Nas-05 00:00 -> Er0  5-Tou-02 00:00 */
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL,        NULL,           0.0,               0.0,              FALSE,    0,   0,     0,      0,        0,          0 }  /* terminator */
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestFieldDifference() {
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const TFDItem * tfdItemPtr;
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (tfdItemPtr = tfdItems; tfdItemPtr->timezone != NULL; tfdItemPtr++) {
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode status = U_ZERO_ERROR;
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCalendar* ucal = ucal_open(tfdItemPtr->timezone, -1, tfdItemPtr->locale, UCAL_DEFAULT, &status);
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: for locale \"%s\", ucal_open had status %s\n", tfdItemPtr->locale, u_errorName(status) );
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t yDf, MDf, dDf, HDf, mDf, sDf;
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (tfdItemPtr->progressive) {
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setMillis(ucal, tfdItemPtr->start, &status);
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_YEAR, &status);
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                MDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_MONTH, &status);
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                dDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_DATE, &status);
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                HDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_HOUR, &status);
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                mDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_MINUTE, &status);
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_SECOND, &status);
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: for locale \"%s\", start %.1f, target %.1f, ucal_setMillis or ucal_getFieldDifference had status %s\n",
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            tfdItemPtr->locale, tfdItemPtr->start, tfdItemPtr->target, u_errorName(status) );
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if ( yDf !=  tfdItemPtr->yDiff ||
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            MDf !=  tfdItemPtr->MDiff ||
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            dDf !=  tfdItemPtr->dDiff ||
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            HDf !=  tfdItemPtr->HDiff ||
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            mDf !=  tfdItemPtr->mDiff ||
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            sDf !=  tfdItemPtr->sDiff ) {
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_data_err("FAIL: for locale \"%s\", start %.1f, target %.1f, expected y-M-d-H-m-s progressive diffs %d-%d-%d-%d-%d-%d, got %d-%d-%d-%d-%d-%d\n",
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            tfdItemPtr->locale, tfdItemPtr->start, tfdItemPtr->target,
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            tfdItemPtr->yDiff, tfdItemPtr->MDiff, tfdItemPtr->dDiff, tfdItemPtr->HDiff, tfdItemPtr->mDiff, tfdItemPtr->sDiff,
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            yDf, MDf, dDf, HDf, mDf, sDf);
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setMillis(ucal, tfdItemPtr->start, &status);
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_YEAR, &status);
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setMillis(ucal, tfdItemPtr->start, &status);
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                MDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_MONTH, &status);
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setMillis(ucal, tfdItemPtr->start, &status);
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                dDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_DATE, &status);
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setMillis(ucal, tfdItemPtr->start, &status);
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                HDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_HOUR, &status);
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setMillis(ucal, tfdItemPtr->start, &status);
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                mDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_MINUTE, &status);
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: for locale \"%s\", start %.1f, target %.1f, ucal_setMillis or ucal_getFieldDifference (y-M-d-H-m) had status %s\n",
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            tfdItemPtr->locale, tfdItemPtr->start, tfdItemPtr->target, u_errorName(status) );
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if ( yDf !=  tfdItemPtr->yDiff ||
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            MDf !=  tfdItemPtr->MDiff ||
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            dDf !=  tfdItemPtr->dDiff ||
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            HDf !=  tfdItemPtr->HDiff ||
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            mDf !=  tfdItemPtr->mDiff ) {
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_data_err("FAIL: for locale \"%s\", start %.1f, target %.1f, expected y-M-d-H-m total diffs %d-%d-%d-%d-%d, got %d-%d-%d-%d-%d\n",
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            tfdItemPtr->locale, tfdItemPtr->start, tfdItemPtr->target,
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            tfdItemPtr->yDiff, tfdItemPtr->MDiff, tfdItemPtr->dDiff, tfdItemPtr->HDiff, tfdItemPtr->mDiff,
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            yDf, MDf, dDf, HDf, mDf);
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setMillis(ucal, tfdItemPtr->start, &status);
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                sDf = ucal_getFieldDifference(ucal, tfdItemPtr->target, UCAL_SECOND, &status);
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (tfdItemPtr->sDiff != 0x7FFFFFFF) {
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_FAILURE(status)) {
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("FAIL: for locale \"%s\", start %.1f, target %.1f, ucal_setMillis or ucal_getFieldDifference (seconds) had status %s\n",
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                tfdItemPtr->locale, tfdItemPtr->start, tfdItemPtr->target, u_errorName(status) );
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else if (sDf !=  tfdItemPtr->sDiff) {
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_data_err("FAIL: for locale \"%s\", start %.1f, target %.1f, expected seconds progressive diff %d, got %d\n",
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                tfdItemPtr->locale, tfdItemPtr->start, tfdItemPtr->target, tfdItemPtr->sDiff, sDf);
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (!U_FAILURE(status)) {
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: for locale \"%s\", start %.1f, target %.1f, for ucal_getFieldDifference (seconds) expected overflow error, got none\n",
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            tfdItemPtr->locale, tfdItemPtr->start, tfdItemPtr->target );
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_close(ucal);
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestAmbiguousWallTime() {
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[32];
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar* ucal;
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate t, expected;
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    u_uastrcpy(tzID, "America/New_York");
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal = ucal_open(tzID, -1, NULL, UCAL_DEFAULT, &status);
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Failed to create a calendar");
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return;
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucal_getAttribute(ucal, UCAL_REPEATED_WALL_TIME) != UCAL_WALLTIME_LAST) {
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Default UCAL_REPEATED_WALL_TIME value is not UCAL_WALLTIME_LAST");
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (ucal_getAttribute(ucal, UCAL_SKIPPED_WALL_TIME) != UCAL_WALLTIME_LAST) {
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Default UCAL_SKIPPED_WALL_TIME value is not UCAL_WALLTIME_LAST");
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* UCAL_WALLTIME_FIRST on US fall transition */
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(ucal, UCAL_REPEATED_WALL_TIME, UCAL_WALLTIME_FIRST);
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(ucal);
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(ucal, 2011, 11-1, 6, 1, 30, 0, &status);
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t = ucal_getMillis(ucal, &status);
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expected = 1320557400000.0; /* 2011-11-06T05:30:00Z */
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Calculating time 2011-11-06 01:30:00 with UCAL_WALLTIME_FIRST - %s\n", u_errorName(status));
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (t != expected) {
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: 2011-11-06 01:30:00 with UCAL_WALLTIME_FIRST - got: %f, expected: %f\n", t, expected);
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* UCAL_WALLTIME_LAST on US fall transition */
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(ucal, UCAL_REPEATED_WALL_TIME, UCAL_WALLTIME_LAST);
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(ucal);
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(ucal, 2011, 11-1, 6, 1, 30, 0, &status);
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t = ucal_getMillis(ucal, &status);
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expected = 1320561000000.0; /* 2011-11-06T06:30:00Z */
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Calculating time 2011-11-06 01:30:00 with UCAL_WALLTIME_LAST - %s\n", u_errorName(status));
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (t != expected) {
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: 2011-11-06 01:30:00 with UCAL_WALLTIME_LAST - got: %f, expected: %f\n", t, expected);
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* UCAL_WALLTIME_FIRST on US spring transition */
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(ucal, UCAL_SKIPPED_WALL_TIME, UCAL_WALLTIME_FIRST);
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(ucal);
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(ucal, 2011, 3-1, 13, 2, 30, 0, &status);
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t = ucal_getMillis(ucal, &status);
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expected = 1299997800000.0; /* 2011-03-13T06:30:00Z */
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Calculating time 2011-03-13 02:30:00 with UCAL_WALLTIME_FIRST - %s\n", u_errorName(status));
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (t != expected) {
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: 2011-03-13 02:30:00 with UCAL_WALLTIME_FIRST - got: %f, expected: %f\n", t, expected);
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* UCAL_WALLTIME_LAST on US spring transition */
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(ucal, UCAL_SKIPPED_WALL_TIME, UCAL_WALLTIME_LAST);
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(ucal);
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(ucal, 2011, 3-1, 13, 2, 30, 0, &status);
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t = ucal_getMillis(ucal, &status);
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expected = 1300001400000.0; /* 2011-03-13T07:30:00Z */
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Calculating time 2011-03-13 02:30:00 with UCAL_WALLTIME_LAST - %s\n", u_errorName(status));
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (t != expected) {
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: 2011-03-13 02:30:00 with UCAL_WALLTIME_LAST - got: %f, expected: %f\n", t, expected);
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* UCAL_WALLTIME_NEXT_VALID on US spring transition */
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(ucal, UCAL_SKIPPED_WALL_TIME, UCAL_WALLTIME_NEXT_VALID);
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(ucal);
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(ucal, 2011, 3-1, 13, 2, 30, 0, &status);
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t = ucal_getMillis(ucal, &status);
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    expected = 1299999600000.0; /* 2011-03-13T07:00:00Z */
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_FAILURE(status)) {
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_err("FAIL: Calculating time 2011-03-13 02:30:00 with UCAL_WALLTIME_NEXT_VALID - %s\n", u_errorName(status));
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if (t != expected) {
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: 2011-03-13 02:30:00 with UCAL_WALLTIME_NEXT_VALID - got: %f, expected: %f\n", t, expected);
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* non-lenient on US spring transition */
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setAttribute(ucal, UCAL_LENIENT, 0);
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_clear(ucal);
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_setDateTime(ucal, 2011, 3-1, 13, 2, 30, 0, &status);
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    t = ucal_getMillis(ucal, &status);
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (U_SUCCESS(status)) {
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /* must return error */
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL: Non-lenient did not fail with 2011-03-13 02:30:00\n");
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ucal_close(ucal);
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TestAddRollEra0AndEraBounds, for #9226
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org typedef struct {
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     const char * locale;
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     UBool era0YearsGoBackwards; /* until we have API to get this, per #9393 */
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } EraTestItem;
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const EraTestItem eraTestItems[] = {
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* calendars with non-modern era 0 that goes backwards, max era == 1 */
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=gregorian", TRUE },
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=roc", TRUE },
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=coptic", TRUE },
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* calendars with non-modern era 0 that goes forwards, max era > 1 */
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=japanese", FALSE },
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=chinese", FALSE },
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* calendars with non-modern era 0 that goes forwards, max era == 1 */
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=ethiopic", FALSE },
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* calendars with only one era  = 0, forwards */
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=buddhist", FALSE },
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=hebrew", FALSE },
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=islamic", FALSE },
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=indian", FALSE },
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=persian", FALSE },
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "en@calendar=ethiopic-amete-alem", FALSE },
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL, FALSE }
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar zoneGMT[] = { 0x47,0x4D,0x54,0 };
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestAddRollEra0AndEraBounds() {
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const EraTestItem * eraTestItemPtr;
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (eraTestItemPtr = eraTestItems; eraTestItemPtr->locale != NULL; eraTestItemPtr++) {
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode status = U_ZERO_ERROR;
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UCalendar *ucalTest = ucal_open(zoneGMT, -1, eraTestItemPtr->locale, UCAL_DEFAULT, &status);
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if ( U_SUCCESS(status) ) {
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t yrBefore, yrAfter, yrMax, eraAfter, eraMax, eraNow;
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_clear(ucalTest);
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_set(ucalTest, UCAL_YEAR, 2);
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_set(ucalTest, UCAL_ERA, 0);
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            yrBefore = ucal_get(ucalTest, UCAL_YEAR, &status);
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_add(ucalTest, UCAL_YEAR, 1, &status);
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status)) {
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: set era 0 year 2 then add 1 year and get year for %s, error %s\n",
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        eraTestItemPtr->locale, u_errorName(status));
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if ( (eraTestItemPtr->era0YearsGoBackwards && yrAfter>yrBefore) ||
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        (!eraTestItemPtr->era0YearsGoBackwards && yrAfter<yrBefore) ) {
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: era 0 add 1 year does not move forward in time for %s\n", eraTestItemPtr->locale);
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_clear(ucalTest);
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_set(ucalTest, UCAL_YEAR, 2);
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_set(ucalTest, UCAL_ERA, 0);
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            yrBefore = ucal_get(ucalTest, UCAL_YEAR, &status);
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_roll(ucalTest, UCAL_YEAR, 1, &status);
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (U_FAILURE(status)) {
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: set era 0 year 2 then roll 1 year and get year for %s, error %s\n",
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        eraTestItemPtr->locale, u_errorName(status));
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else if ( (eraTestItemPtr->era0YearsGoBackwards && yrAfter>yrBefore) ||
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        (!eraTestItemPtr->era0YearsGoBackwards && yrAfter<yrBefore) ) {
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_err("FAIL: era 0 roll 1 year does not move forward in time for %s\n", eraTestItemPtr->locale);
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_clear(ucalTest);
21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_set(ucalTest, UCAL_YEAR, 1);
21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_set(ucalTest, UCAL_ERA, 0);
21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if (eraTestItemPtr->era0YearsGoBackwards) {
21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_roll(ucalTest, UCAL_YEAR, 1, &status); /* roll forward in time to era 0 boundary */
21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                eraAfter = ucal_get(ucalTest, UCAL_ERA, &status);
21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: set era 0 year 1 then roll 1 year and get year,era for %s, error %s\n",
21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            eraTestItemPtr->locale, u_errorName(status));
21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* all calendars with era0YearsGoBackwards have "unbounded" era0 year values, so we should pin at yr 1 */
21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (eraAfter != 0 || yrAfter != 1) {
21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: era 0 roll 1 year from year 1 does not stay within era or pin to year 1 for %s (get era %d year %d)\n",
21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            eraTestItemPtr->locale, eraAfter, yrAfter);
21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* roll backward in time to where era 0 years go negative, except for the Chinese
21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   calendar, which uses negative eras instead of having years outside the range 1-60 */
21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char * calType = ucal_getType(ucalTest, &status);
21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_roll(ucalTest, UCAL_YEAR, -2, &status);
21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                eraAfter = ucal_get(ucalTest, UCAL_ERA, &status);
21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: set era 0 year 1 then roll -2 years and get year,era for %s, error %s\n",
21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            eraTestItemPtr->locale, u_errorName(status));
21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if ( uprv_strcmp(calType,"chinese")!=0 && (eraAfter != 0 || yrAfter != -1) ) {
21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: era 0 roll -2 years from year 1 does not stay within era or produce year -1 for %s (get era %d year %d)\n",
21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            eraTestItemPtr->locale, eraAfter, yrAfter);
21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_clear(ucalTest);
21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            {
21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t eraMin = ucal_getLimit(ucalTest, UCAL_ERA, UCAL_MINIMUM, &status);
21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const char * calType = ucal_getType(ucalTest, &status);
21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (eraMin != 0 && uprv_strcmp(calType, "chinese") != 0) {
21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: ucal_getLimit returns minimum era %d (should be 0) for calType %s, error %s\n", eraMin, calType, u_errorName(status));
21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_ZERO_ERROR;
21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_clear(ucalTest);
21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_set(ucalTest, UCAL_YEAR, 1);
21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_set(ucalTest, UCAL_ERA, 0);
21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            eraMax = ucal_getLimit(ucalTest, UCAL_ERA, UCAL_MAXIMUM, &status);
21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_SUCCESS(status) && eraMax > 0 ) {
21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* try similar tests for era 1 (if calendar has it), in which years always go forward */
21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_ZERO_ERROR;
21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_clear(ucalTest);
21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_set(ucalTest, UCAL_YEAR, 2);
21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_set(ucalTest, UCAL_ERA, 1);
21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yrBefore = ucal_get(ucalTest, UCAL_YEAR, &status);
21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_add(ucalTest, UCAL_YEAR, 1, &status);
21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: set era 1 year 2 then add 1 year and get year for %s, error %s\n",
21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            eraTestItemPtr->locale, u_errorName(status));
21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if ( yrAfter<yrBefore ) {
21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: era 1 add 1 year does not move forward in time for %s\n", eraTestItemPtr->locale);
21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_ZERO_ERROR;
21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_clear(ucalTest);
21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_set(ucalTest, UCAL_YEAR, 2);
21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_set(ucalTest, UCAL_ERA, 1);
21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yrBefore = ucal_get(ucalTest, UCAL_YEAR, &status);
21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_roll(ucalTest, UCAL_YEAR, 1, &status);
21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: set era 1 year 2 then roll 1 year and get year for %s, error %s\n",
21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            eraTestItemPtr->locale, u_errorName(status));
21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if ( yrAfter<yrBefore ) {
21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: era 1 roll 1 year does not move forward in time for %s\n", eraTestItemPtr->locale);
21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_ZERO_ERROR;
21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_clear(ucalTest);
21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_set(ucalTest, UCAL_YEAR, 1);
21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_set(ucalTest, UCAL_ERA, 1);
21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yrMax = ucal_getLimit(ucalTest, UCAL_YEAR, UCAL_ACTUAL_MAXIMUM, &status); /* max year value for era 1 */
22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_roll(ucalTest, UCAL_YEAR, -1, &status); /* roll down which should pin or wrap to end */
22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
22026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                eraAfter = ucal_get(ucalTest, UCAL_ERA, &status);
22036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status)) {
22046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: set era 1 year 1 then roll -1 year and get year,era for %s, error %s\n",
22056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            eraTestItemPtr->locale, u_errorName(status));
22066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* if yrMax is reasonable we should wrap to that, else we should pin at yr 1 */
22076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (yrMax >= 32768) {
22086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (eraAfter != 1 || yrAfter != 1) {
22096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("FAIL: era 1 roll -1 year from year 1 does not stay within era or pin to year 1 for %s (get era %d year %d)\n",
22106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                eraTestItemPtr->locale, eraAfter, yrAfter);
22116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
22126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (eraAfter != 1 || yrAfter != yrMax) {
22136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_err("FAIL: era 1 roll -1 year from year 1 does not stay within era or wrap to year %d for %s (get era %d year %d)\n",
22146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            yrMax, eraTestItemPtr->locale, eraAfter, yrAfter);
22156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else {
22166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    /* now roll up which should wrap to beginning */
22176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_roll(ucalTest, UCAL_YEAR, 1, &status); /* now roll up which should wrap to beginning */
22186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
22196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    eraAfter = ucal_get(ucalTest, UCAL_ERA, &status);
22206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_FAILURE(status)) {
22216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("FAIL: era 1 roll 1 year from end and get year,era for %s, error %s\n",
22226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                eraTestItemPtr->locale, u_errorName(status));
22236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else if (eraAfter != 1 || yrAfter != 1) {
22246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("FAIL: era 1 roll 1 year from year %d does not stay within era or wrap to year 1 for %s (get era %d year %d)\n",
22256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                yrMax, eraTestItemPtr->locale, eraAfter, yrAfter);
22266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
22276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
22286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                /* if current era  > 1, try the same roll tests for current era */
22306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                ucal_setMillis(ucalTest, ucal_getNow(), &status);
22316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                eraNow = ucal_get(ucalTest, UCAL_ERA, &status);
22326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if ( U_SUCCESS(status) && eraNow > 1 ) {
22336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    status = U_ZERO_ERROR;
22346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_clear(ucalTest);
22356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_set(ucalTest, UCAL_YEAR, 1);
22366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_set(ucalTest, UCAL_ERA, eraNow);
22376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    yrMax = ucal_getLimit(ucalTest, UCAL_YEAR, UCAL_ACTUAL_MAXIMUM, &status); /* max year value for this era */
22386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_roll(ucalTest, UCAL_YEAR, -1, &status);
22396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
22406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    eraAfter = ucal_get(ucalTest, UCAL_ERA, &status);
22416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_FAILURE(status)) {
22426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("FAIL: set era %d year 1 then roll -1 year and get year,era for %s, error %s\n",
22436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                eraNow, eraTestItemPtr->locale, u_errorName(status));
22446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    /* if yrMax is reasonable we should wrap to that, else we should pin at yr 1 */
22456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else if (yrMax >= 32768) {
22466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (eraAfter != eraNow || yrAfter != 1) {
22476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("FAIL: era %d roll -1 year from year 1 does not stay within era or pin to year 1 for %s (get era %d year %d)\n",
22486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    eraNow, eraTestItemPtr->locale, eraAfter, yrAfter);
22496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
22506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else if (eraAfter != eraNow || yrAfter != yrMax) {
22516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("FAIL: era %d roll -1 year from year 1 does not stay within era or wrap to year %d for %s (get era %d year %d)\n",
22526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                eraNow, yrMax, eraTestItemPtr->locale, eraAfter, yrAfter);
22536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    } else {
22546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        /* now roll up which should wrap to beginning */
22556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        ucal_roll(ucalTest, UCAL_YEAR, 1, &status); /* now roll up which should wrap to beginning */
22566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        yrAfter = ucal_get(ucalTest, UCAL_YEAR, &status);
22576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        eraAfter = ucal_get(ucalTest, UCAL_ERA, &status);
22586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        if (U_FAILURE(status)) {
22596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("FAIL: era %d roll 1 year from end and get year,era for %s, error %s\n",
22606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    eraNow, eraTestItemPtr->locale, u_errorName(status));
22616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        } else if (eraAfter != eraNow || yrAfter != 1) {
22626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            log_err("FAIL: era %d roll 1 year from year %d does not stay within era or wrap to year 1 for %s (get era %d year %d)\n",
22636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    eraNow, yrMax, eraTestItemPtr->locale, eraAfter, yrAfter);
22646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        }
22656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
22666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
22676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
22686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_close(ucalTest);
22706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
22716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: ucal_open fails for zone GMT, locale %s, UCAL_DEFAULT\n", eraTestItemPtr->locale);
22726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
22736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
22746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
22756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
22776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * TestGetTZTransition, for #9606
22786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
22796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct {
22816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const char *descrip;    /* test description */
22826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UChar * zoneName; /* pointer to zero-terminated zone name */
22836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t year;           /* starting point for test is gregorian calendar noon on day specified by y,M,d here */
22846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t month;
22856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t day;
22866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool hasPrev;          /* does it have a previous transition from starting point? If so we test inclusive from that */
22876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool hasNext;          /* does it have a next transition from starting point? If so we test inclusive from that */
22886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} TZTransitionItem;
22896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* have zoneGMT above */
22916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar zoneUSPacific[] = { 0x55,0x53,0x2F,0x50,0x61,0x63,0x69,0x66,0x69,0x63,0 }; /* "US/Pacific" */
22926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar zoneCairo[]     = { 0x41,0x66,0x72,0x69,0x63,0x61,0x2F,0x43,0x61,0x69,0x72,0x6F,0 }; /* "Africa/Cairo", DST cancelled since 2011 */
22936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar zoneIceland[]   = { 0x41,0x74,0x6C,0x61,0x6E,0x74,0x69,0x63,0x2F,0x52,0x65,0x79,0x6B,0x6A,0x61,0x76,0x69,0x6B,0 }; /* "Atlantic/Reykjavik", always on DST (since when?) */
22946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const TZTransitionItem tzTransitionItems[] = {
22966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "USPacific mid 2012", zoneUSPacific, 2012, UCAL_JULY, 1, TRUE , TRUE  },
22976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "USPacific mid  100", zoneUSPacific,  100, UCAL_JULY, 1, FALSE, TRUE  }, /* no transitions before 100 CE... */
22986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "Cairo     mid 2012", zoneCairo,     2012, UCAL_JULY, 1, TRUE , FALSE }, /* DST cancelled since 2011 */
22996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { "Iceland   mid 2012", zoneIceland,   2012, UCAL_JULY, 1, TRUE , FALSE }, /* always on DST */
23006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    { NULL,                 NULL,             0,         0, 0, FALSE, FALSE } /* terminator */
23016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
23026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestGetTZTransition() {
23046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status = U_ZERO_ERROR;
23056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UCalendar * ucal = ucal_open(zoneGMT, -1, "en", UCAL_GREGORIAN, &status);
23066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if ( U_SUCCESS(status) ) {
23076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const TZTransitionItem * itemPtr;
23086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        for (itemPtr = tzTransitionItems; itemPtr->descrip != NULL; itemPtr++) {
23096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UDate curMillis;
23106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_setTimeZone(ucal, itemPtr->zoneName, -1, &status);
23116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ucal_setDateTime(ucal, itemPtr->year, itemPtr->month, itemPtr->day, 12, 0, 0, &status);
23126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            curMillis = ucal_getMillis(ucal, &status);
23136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (void)curMillis;    /* Suppress set but not used warning. */
23146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if ( U_SUCCESS(status) ) {
23156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UDate transition1, transition2;
23166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                UBool result;
23176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                result = ucal_getTimeZoneTransitionDate(ucal, UCAL_TZ_TRANSITION_PREVIOUS, &transition1, &status);
23196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status) || result != itemPtr->hasPrev) {
23206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_data_err("FAIL: %s ucal_getTimeZoneTransitionDate prev status %s, expected result %d but got %d\n",
23216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            itemPtr->descrip, u_errorName(status), itemPtr->hasPrev, result);
23226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (result) {
23236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_setMillis(ucal, transition1, &status);
23246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    result = ucal_getTimeZoneTransitionDate(ucal, UCAL_TZ_TRANSITION_PREVIOUS_INCLUSIVE, &transition2, &status);
23256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_FAILURE(status) || !result || transition2 != transition1) {
23266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("FAIL: %s ucal_getTimeZoneTransitionDate prev_inc status %s, result %d, expected date %.1f but got %.1f\n",
23276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                itemPtr->descrip, u_errorName(status), result, transition1, transition2);
23286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
23296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
23306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_ZERO_ERROR;
23316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                result = ucal_getTimeZoneTransitionDate(ucal, UCAL_TZ_TRANSITION_NEXT, &transition1, &status);
23336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                if (U_FAILURE(status) || result != itemPtr->hasNext) {
23346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    log_data_err("FAIL: %s ucal_getTimeZoneTransitionDate next status %s, expected result %d but got %d\n",
23356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            itemPtr->descrip, u_errorName(status), itemPtr->hasNext, result);
23366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                } else if (result) {
23376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    ucal_setMillis(ucal, transition1, &status);
23386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    result = ucal_getTimeZoneTransitionDate(ucal, UCAL_TZ_TRANSITION_NEXT_INCLUSIVE, &transition2, &status);
23396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    if (U_FAILURE(status) || !result || transition2 != transition1) {
23406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        log_err("FAIL: %s ucal_getTimeZoneTransitionDate next_inc status %s, result %d, expected date %.1f but got %.1f\n",
23416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                itemPtr->descrip, u_errorName(status), result, transition1, transition2);
23426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    }
23436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                }
23446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_ZERO_ERROR;
23456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            } else {
23466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                log_data_err("FAIL setup: can't setup calendar for %s, status %s\n",
23476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            itemPtr->descrip, u_errorName(status));
23486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                status = U_ZERO_ERROR;
23496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
23506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        ucal_close(ucal);
23526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
23536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        log_data_err("FAIL setup: ucal_open status %s\n", u_errorName(status));
23546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
23566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar winEastern[] = /* Eastern Standard Time */
23586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x45,0x61,0x73,0x74,0x65,0x72,0x6E,0x20,0x53,0x74,0x61,0x6E,0x64,0x61,0x72,0x64,0x20,0x54,0x69,0x6D,0x65,0x00};
23596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar tzNewYork[] = /* America/New_York */
23616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x41,0x6D,0x65,0x72,0x69,0x63,0x61,0x2F,0x4E,0x65,0x77,0x5F,0x59,0x6F,0x72,0x6B,0x00};
23626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar tzTronto[] = /* America/Toronto */
23636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x41,0x6D,0x65,0x72,0x69,0x63,0x61,0x2F,0x54,0x6F,0x72,0x6F,0x6E,0x74,0x6F,0x00};
23646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const UChar sBogus[] = /* Bogus */
23666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {0x42,0x6F,0x67,0x75,0x73,0x00};
23676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestGetWindowsTimeZoneID() {
23696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status;
23706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar winID[64];
23716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len;
23726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
23746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
23756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = ucal_getWindowsTimeZoneID(tzNewYork, u_strlen(tzNewYork), winID, sizeof(winID)/sizeof(winID[0]), &status);
23766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
23776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: Windows ID for America/New_York, status %s\n", u_errorName(status));
23786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (len != u_strlen(winEastern) || u_strncmp(winID, winEastern, len) != 0) {
23796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: Windows ID for America/New_York\n");
23806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
23836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
23846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = ucal_getWindowsTimeZoneID(tzTronto, u_strlen(tzTronto), winID, sizeof(winID)/sizeof(winID[0]), &status);
23856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
23866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: Windows ID for America/Toronto, status %s\n", u_errorName(status));
23876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (len != u_strlen(winEastern) || u_strncmp(winID, winEastern, len) != 0) {
23886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: Windows ID for America/Toronto\n");
23896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
23916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
23926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
23936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = ucal_getWindowsTimeZoneID(sBogus, u_strlen(sBogus), winID, sizeof(winID)/sizeof(winID[0]), &status);
23946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
23956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: Windows ID for Bogus, status %s\n", u_errorName(status));
23966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (len != 0) {
23976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: Windows ID for Bogus\n");
23986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
23996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
24016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid TestGetTimeZoneIDByWindowsID() {
24036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode status;
24046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar tzID[64];
24056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len;
24066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
24086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
24096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = ucal_getTimeZoneIDForWindowsID(winEastern, -1, NULL, tzID, sizeof(tzID)/sizeof(tzID[0]), &status);
24106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
24116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: TZ ID for Eastern Standard Time, status %s\n", u_errorName(status));
24126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (len != u_strlen(tzNewYork) || u_strncmp(tzID, tzNewYork, len) != 0) {
24136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: TZ ID for Eastern Standard Time\n");
24146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
24156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
24176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
24186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = ucal_getTimeZoneIDForWindowsID(winEastern, u_strlen(winEastern), "US", tzID, sizeof(tzID)/sizeof(tzID[0]), &status);
24196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
24206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: TZ ID for Eastern Standard Time - US, status %s\n", u_errorName(status));
24216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (len != u_strlen(tzNewYork) || u_strncmp(tzID, tzNewYork, len) != 0) {
24226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: TZ ID for Eastern Standard Time - US\n");
24236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
24246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
24266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
24276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = ucal_getTimeZoneIDForWindowsID(winEastern, u_strlen(winEastern), "CA", tzID, sizeof(tzID)/sizeof(tzID[0]), &status);
24286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
24296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: TZ ID for Eastern Standard Time - CA, status %s\n", u_errorName(status));
24306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (len != u_strlen(tzTronto) || u_strncmp(tzID, tzTronto, len) != 0) {
24316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: TZ ID for Eastern Standard Time - CA\n");
24326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
24336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
24366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        status = U_ZERO_ERROR;
24376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        len = ucal_getTimeZoneIDForWindowsID(sBogus, -1, NULL, tzID, sizeof(tzID)/sizeof(tzID[0]), &status);
24386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_FAILURE(status)) {
24396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_data_err("FAIL: TZ ID for Bogus, status %s\n", u_errorName(status));
24406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else if (len != 0) {
24416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            log_err("FAIL: TZ ID for Bogus\n");
24426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
24436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
24446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
24456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
2448