16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org **************************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (c) 1997-2013, International Business Machines Corporation and * 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * others. All Rights Reserved. * 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org **************************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utmscale.h" 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucal.h" 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cintltst.h" 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdlib.h> 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <time.h> 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define LOOP_COUNT 10000 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAPI(void); 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestData(void); 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestMonkey(void); 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestDotNet(void); 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addUtmsTest(TestNode** root); 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid addUtmsTest(TestNode** root) 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestAPI, "tsformat/utmstest/TestAPI"); 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestData, "tsformat/utmstest/TestData"); 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestMonkey, "tsformat/utmstest/TestMonkey"); 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org addTest(root, &TestDotNet, "tsformat/utmstest/TestDotNet"); 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Return a random int64_t where U_INT64_MIN <= ran <= U_INT64_MAX. 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic uint64_t randomInt64(void) 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t ran = 0; 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static UBool initialized = FALSE; 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (!initialized) { 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org srand((unsigned)time(NULL)); 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org initialized = TRUE; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Assume rand has at least 12 bits of precision */ 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < sizeof(ran); i += 1) { 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ((char*)&ran)[i] = (char)((rand() & 0x0FF0) >> 4); 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return ran; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int64_t ranInt; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int64_t ranMin; 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int64_t ranMax; 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void initRandom(int64_t min, int64_t max) 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org uint64_t interval = max - min; 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ranMin = min; 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ranMax = max; 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ranInt = 0; 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Verify that we don't have a huge interval. */ 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (interval < (uint64_t)U_INT64_MAX) { 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ranInt = interval; 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int64_t randomInRange(void) 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t value; 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (ranInt != 0) { 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value = randomInt64() % ranInt; 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (value < 0) { 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value = -value; 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value += ranMin; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } else { 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org do { 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org value = randomInt64(); 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } while (value < ranMin || value > ranMax); 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return value; 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void roundTripTest(int64_t value, UDateTimeScale scale) 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t rt = utmscale_toInt64(utmscale_fromInt64(value, scale, &status), scale, &status); 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (rt != value) { 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("Round-trip error: time scale = %d, value = %lld, round-trip = %lld.\n", scale, value, rt); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void toLimitTest(int64_t toLimit, int64_t fromLimit, UDateTimeScale scale) 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t result = utmscale_toInt64(toLimit, scale, &status); 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (result != fromLimit) { 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("toLimit failure: scale = %d, toLimit = %lld , utmscale_toInt64(toLimit, scale, &status) = %lld, fromLimit = %lld.\n", 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org scale, toLimit, result, fromLimit); 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void epochOffsetTest(int64_t epochOffset, int64_t units, UDateTimeScale scale) 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t universal = 0; 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t universalEpoch = epochOffset * units; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t local = utmscale_toInt64(universalEpoch, scale, &status); 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (local != 0) { 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(epochOffset, scale, &status): scale = %d epochOffset = %lld, result = %lld.\n", scale, epochOffset, local); 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org local = utmscale_toInt64(0, scale, &status); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (local != -epochOffset) { 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(0, scale): scale = %d, result = %lld.\n", scale, local); 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org universal = utmscale_fromInt64(-epochOffset, scale, &status); 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (universal != 0) { 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("from(-epochOffest, scale): scale = %d, epochOffset = %lld, result = %lld.\n", scale, epochOffset, universal); 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org universal = utmscale_fromInt64(0, scale, &status); 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (universal != universalEpoch) { 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(0, scale): scale = %d, result = %lld.\n", scale, universal); 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestEpochOffsets(void) 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t scale; 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t units = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_UNITS_VALUE, &status); 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t epochOffset = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_EPOCH_OFFSET_VALUE, &status); 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org epochOffsetTest(epochOffset, units, (UDateTimeScale)scale); 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestFromLimits(void) 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t scale; 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t fromMin = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_FROM_MIN_VALUE, &status); 1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t fromMax = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_FROM_MAX_VALUE, &status); 1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org roundTripTest(fromMin, (UDateTimeScale)scale); 1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org roundTripTest(fromMax, (UDateTimeScale)scale); 1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestToLimits(void) 1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t scale; 1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { 1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t fromMin = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_FROM_MIN_VALUE, &status); 1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t fromMax = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_FROM_MAX_VALUE, &status); 1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t toMin = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_TO_MIN_VALUE, &status); 1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t toMax = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_TO_MAX_VALUE, &status); 1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org toLimitTest(toMin, fromMin, (UDateTimeScale)scale); 1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org toLimitTest(toMax, fromMax, (UDateTimeScale)scale); 1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestFromInt64(void) 1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t scale; 1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t result; 1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_fromInt64(0, -1, &status); 2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)result; /* Suppress set but not used warning. */ 2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status != U_ILLEGAL_ARGUMENT_ERROR) { 2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(0, -1, status) did not set status to U_ILLEGAL_ARGUMENT_ERROR.\n"); 2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { 2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t fromMin, fromMax; 2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fromMin = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_FROM_MIN_VALUE, &status); 2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fromMax = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_FROM_MAX_VALUE, &status); 2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_fromInt64(0, (UDateTimeScale)scale, &status); 2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status == U_ILLEGAL_ARGUMENT_ERROR) { 2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(0, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_fromInt64(fromMin, (UDateTimeScale)scale, &status); 2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status == U_ILLEGAL_ARGUMENT_ERROR) { 2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(fromMin, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fromMin > U_INT64_MIN) { 2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_fromInt64(fromMin - 1, (UDateTimeScale)scale, &status); 2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status != U_ILLEGAL_ARGUMENT_ERROR) { 2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(fromMin - 1, %d, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_fromInt64(fromMax, (UDateTimeScale)scale, &status); 2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status == U_ILLEGAL_ARGUMENT_ERROR) { 2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(fromMax, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fromMax < U_INT64_MAX) { 2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_fromInt64(fromMax + 1, (UDateTimeScale)scale, &status); 2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status != U_ILLEGAL_ARGUMENT_ERROR) { 2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(fromMax + 1, %d, &status) didn't generate U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_fromInt64(0, UDTS_MAX_SCALE, &status); 2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status != U_ILLEGAL_ARGUMENT_ERROR) { 2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(0, UDTS_MAX_SCALE, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n"); 2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestToInt64(void) 2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t scale; 2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t result; 2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_toInt64(0, -1, &status); 2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (void)result; /* suppress set but not used warning. */ 2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status != U_ILLEGAL_ARGUMENT_ERROR) { 2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(0, -1, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n"); 2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { 2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t toMin, toMax; 2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org toMin = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_TO_MIN_VALUE, &status); 2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org toMax = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_TO_MAX_VALUE, &status); 2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_toInt64(0, (UDateTimeScale)scale, &status); 2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status == U_ILLEGAL_ARGUMENT_ERROR) { 2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(0, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_toInt64(toMin, (UDateTimeScale)scale, &status); 2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status == U_ILLEGAL_ARGUMENT_ERROR) { 2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(toMin, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toMin > U_INT64_MIN) { 2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_toInt64(toMin - 1, (UDateTimeScale)scale, &status); 2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status != U_ILLEGAL_ARGUMENT_ERROR) { 2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(toMin - 1, %d, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_toInt64(toMax, (UDateTimeScale)scale, &status); 2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status == U_ILLEGAL_ARGUMENT_ERROR) { 2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(toMax, %d, &status) generated U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (toMax < U_INT64_MAX) { 3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_toInt64(toMax + 1, (UDateTimeScale)scale, &status); 3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status != U_ILLEGAL_ARGUMENT_ERROR) { 3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(toMax + 1, %d, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n", scale); 3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org status = U_ZERO_ERROR; 3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org result = utmscale_toInt64(0, UDTS_MAX_SCALE, &status); 3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (status != U_ILLEGAL_ARGUMENT_ERROR) { 3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(0, UDTS_MAX_SCALE, &status) did not generate U_ILLEGAL_ARGUMENT_ERROR.\n"); 3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestAPI(void) 3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestFromInt64(); 3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestToInt64(); 3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestData(void) 3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestEpochOffsets(); 3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestFromLimits(); 3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org TestToLimits(); 3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void TestMonkey(void) 3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t scale; 3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode status = U_ZERO_ERROR; 3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (scale = 0; scale < UDTS_MAX_SCALE; scale += 1) { 3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t fromMin = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_FROM_MIN_VALUE, &status); 3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t fromMax = utmscale_getTimeScaleValue((UDateTimeScale)scale, UTSV_FROM_MAX_VALUE, &status); 3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org initRandom(fromMin, fromMax); 3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < LOOP_COUNT; i += 1) { 3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t value = randomInRange(); 3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org roundTripTest(value, (UDateTimeScale)scale); 3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct DotNetDateTimeTicks { 3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t year; 3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t month; 3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t day; 3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t ticks; 3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct DotNetDateTimeTicks DotNetDateTimeTicks; 3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This data was generated by C++.Net code like 3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Console::WriteLine(L" {{ {0}, 1, 1, INT64_C({1}) }},", year, DateTime(year, 1, 1).Ticks); 3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with the DateTime constructor taking int values for year, month, and date. 3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic const DotNetDateTimeTicks dotNetDateTimeTicks[]={ 3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* year, month, day, ticks */ 3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 100, 1, 1, INT64_C(31241376000000000) }, 3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 100, 3, 1, INT64_C(31292352000000000) }, 3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 200, 1, 1, INT64_C(62798112000000000) }, 3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 200, 3, 1, INT64_C(62849088000000000) }, 3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 300, 1, 1, INT64_C(94354848000000000) }, 3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 300, 3, 1, INT64_C(94405824000000000) }, 3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 400, 1, 1, INT64_C(125911584000000000) }, 3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 400, 3, 1, INT64_C(125963424000000000) }, 3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 500, 1, 1, INT64_C(157469184000000000) }, 3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 500, 3, 1, INT64_C(157520160000000000) }, 3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 600, 1, 1, INT64_C(189025920000000000) }, 3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 600, 3, 1, INT64_C(189076896000000000) }, 3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 700, 1, 1, INT64_C(220582656000000000) }, 3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 700, 3, 1, INT64_C(220633632000000000) }, 3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 800, 1, 1, INT64_C(252139392000000000) }, 3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 800, 3, 1, INT64_C(252191232000000000) }, 3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 900, 1, 1, INT64_C(283696992000000000) }, 3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 900, 3, 1, INT64_C(283747968000000000) }, 3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1000, 1, 1, INT64_C(315253728000000000) }, 3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1000, 3, 1, INT64_C(315304704000000000) }, 3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1100, 1, 1, INT64_C(346810464000000000) }, 3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1100, 3, 1, INT64_C(346861440000000000) }, 3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1200, 1, 1, INT64_C(378367200000000000) }, 3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1200, 3, 1, INT64_C(378419040000000000) }, 3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1300, 1, 1, INT64_C(409924800000000000) }, 3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1300, 3, 1, INT64_C(409975776000000000) }, 3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1400, 1, 1, INT64_C(441481536000000000) }, 3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1400, 3, 1, INT64_C(441532512000000000) }, 3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1500, 1, 1, INT64_C(473038272000000000) }, 3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1500, 3, 1, INT64_C(473089248000000000) }, 3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1600, 1, 1, INT64_C(504595008000000000) }, 3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1600, 3, 1, INT64_C(504646848000000000) }, 3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1700, 1, 1, INT64_C(536152608000000000) }, 3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1700, 3, 1, INT64_C(536203584000000000) }, 3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1800, 1, 1, INT64_C(567709344000000000) }, 4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1800, 3, 1, INT64_C(567760320000000000) }, 4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1900, 1, 1, INT64_C(599266080000000000) }, 4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1900, 3, 1, INT64_C(599317056000000000) }, 4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2000, 1, 1, INT64_C(630822816000000000) }, 4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2000, 3, 1, INT64_C(630874656000000000) }, 4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2100, 1, 1, INT64_C(662380416000000000) }, 4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2100, 3, 1, INT64_C(662431392000000000) }, 4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2200, 1, 1, INT64_C(693937152000000000) }, 4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2200, 3, 1, INT64_C(693988128000000000) }, 4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2300, 1, 1, INT64_C(725493888000000000) }, 4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2300, 3, 1, INT64_C(725544864000000000) }, 4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2400, 1, 1, INT64_C(757050624000000000) }, 4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2400, 3, 1, INT64_C(757102464000000000) }, 4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2500, 1, 1, INT64_C(788608224000000000) }, 4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2500, 3, 1, INT64_C(788659200000000000) }, 4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2600, 1, 1, INT64_C(820164960000000000) }, 4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2600, 3, 1, INT64_C(820215936000000000) }, 4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2700, 1, 1, INT64_C(851721696000000000) }, 4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2700, 3, 1, INT64_C(851772672000000000) }, 4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2800, 1, 1, INT64_C(883278432000000000) }, 4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2800, 3, 1, INT64_C(883330272000000000) }, 4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2900, 1, 1, INT64_C(914836032000000000) }, 4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2900, 3, 1, INT64_C(914887008000000000) }, 4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3000, 1, 1, INT64_C(946392768000000000) }, 4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 3000, 3, 1, INT64_C(946443744000000000) }, 4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1, 1, 1, INT64_C(0) }, 4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1601, 1, 1, INT64_C(504911232000000000) }, 4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1899, 12, 31, INT64_C(599265216000000000) }, 4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1904, 1, 1, INT64_C(600527520000000000) }, 4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1970, 1, 1, INT64_C(621355968000000000) }, 4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 2001, 1, 1, INT64_C(631139040000000000) }, 4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9900, 3, 1, INT64_C(3123873216000000000) }, 4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 9999, 12, 31, INT64_C(3155378112000000000) } 4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU's Universal Time Scale is designed to be tick-for-tick compatible with 4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * .Net System.DateTime. Verify that this is so for the 4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * .Net-supported date range (years 1-9999 AD). 4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This requires a proleptic Gregorian calendar because that's what .Net uses. 4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Proleptic: No Julian/Gregorian switchover, or a switchover before 4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * any date that we test, that is, before 0001 AD. 4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void 4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTestDotNet() { 4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const UChar utc[] = { 0x45, 0x74, 0x63, 0x2f, 0x47, 0x4d, 0x54, 0 }; /* "Etc/GMT" */ 4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int32_t dayMillis = 86400 * INT64_C(1000); /* 1 day = 86400 seconds */ 4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int64_t dayTicks = 86400 * INT64_C(10000000); 4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const DotNetDateTimeTicks *dt; 4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UCalendar *cal; 4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode errorCode; 4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UDate icuDate; 4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int64_t ticks, millis; 4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t i; 4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Open a proleptic Gregorian calendar. */ 4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org errorCode = U_ZERO_ERROR; 4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org cal = ucal_open(utc, -1, "", UCAL_GREGORIAN, &errorCode); 4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucal_setGregorianChange(cal, -1000000 * (dayMillis * (UDate)1), &errorCode); 4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(U_FAILURE(errorCode)) { 4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_data_err("ucal_open(UTC/proleptic Gregorian) failed: %s - (Are you missing data?)\n", u_errorName(errorCode)); 4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucal_close(cal); 4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for(i = 0; i < LENGTHOF(dotNetDateTimeTicks); ++i) { 4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Test conversion from .Net/Universal time to ICU time. */ 4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org dt = dotNetDateTimeTicks + i; 4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org millis = utmscale_toInt64(dt->ticks, UDTS_ICU4C_TIME, &errorCode); 4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucal_clear(cal); 4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucal_setDate(cal, dt->year, dt->month - 1, dt->day, &errorCode); /* Java & ICU use January = month 0. */ 4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org icuDate = ucal_getMillis(cal, &errorCode); 4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(millis != icuDate) { 4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Print days not millis to stay within printf() range. */ 4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_toInt64(ticks[%d], ICU4C)=%dd != %dd=ucal_getMillis(%04d-%02d-%02d)\n", 4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int)i, (int)(millis/dayMillis), (int)(icuDate/dayMillis), (int)dt->year, (int)dt->month, (int)dt->day); 4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Test conversion from ICU time to .Net/Universal time. */ 4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ticks = utmscale_fromInt64((int64_t)icuDate, UDTS_ICU4C_TIME, &errorCode); 4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if(ticks != dt->ticks) { 4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /* Print days not ticks to stay within printf() range. */ 4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org log_err("utmscale_fromInt64(date[%d], ICU4C)=%dd != %dd=.Net System.DateTime(%04d-%02d-%02d).Ticks\n", 4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org (int)i, (int)(ticks/dayTicks), (int)(dt->ticks/dayTicks), (int)dt->year, (int)dt->month, (int)dt->day); 4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ucal_close(cal); 4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */ 490