12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others. 22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2004-2010, International Business Machines Corporation and * 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.timescale; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale; 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test; 172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestFmwk; 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.GregorianCalendar; 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.SimpleTimeZone; 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeZone; 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.UniversalTimeScale; 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author Owner 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * TODO To change the template for this generated type comment go to 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Window - Preferences - Java - Code Style - Code Templates 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class TimeScaleDataTest extends TestFmwk 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert{ 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Default contstructor. 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public TimeScaleDataTest() 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void roundTripTest(long value, int scale) 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long rt = UniversalTimeScale.toLong(UniversalTimeScale.from(value, scale), scale); 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (rt != value) { 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("Round-trip error: time scale = " + scale + ", value = " + value + ", round-trip = " + rt); 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void toLimitTest(long toLimit, long fromLimit, int scale) 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long result = UniversalTimeScale.toLong(toLimit, scale); 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (result != fromLimit) { 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("toLimit failure: scale = " + scale + ", toLimit = " + toLimit + 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", toLong(toLimit, scale) = " + result + ", fromLimit = " + fromLimit); 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void epochOffsetTest(long epochOffset, long units, int scale) 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long universalEpoch = epochOffset * units; 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long local = UniversalTimeScale.toLong(universalEpoch, scale); 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (local != 0) { 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("toLong(epochOffset, scale): scale = " + scale + ", epochOffset = " + universalEpoch + 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", result = " + local); 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert local = UniversalTimeScale.toLong(0, scale); 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (local != -epochOffset) { 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("toLong(0, scale): scale = " + scale + ", result = " + local); 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long universal = UniversalTimeScale.from(-epochOffset, scale); 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (universal != 0) { 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("from(-epochOffest, scale): scale = " + scale + ", epochOffset = " + epochOffset + 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ", result = " + universal); 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert universal = UniversalTimeScale.from(0, scale); 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (universal != universalEpoch) { 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("from(0, scale): scale = " + scale + ", result = " + universal); 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestEpochOffsets() 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int scale = 0; scale < UniversalTimeScale.MAX_SCALE; scale += 1) { 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long units = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.UNITS_VALUE); 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long epochOffset = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.EPOCH_OFFSET_VALUE); 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert epochOffsetTest(epochOffset, units, scale); 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1002d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestFromLimits() 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int scale = 0; scale < UniversalTimeScale.MAX_SCALE; scale += 1) { 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long fromMin = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MIN_VALUE); 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long fromMax = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MAX_VALUE); 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundTripTest(fromMin, scale); 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert roundTripTest(fromMax, scale); 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestToLimits() 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert { 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int scale = 0; scale < UniversalTimeScale.MAX_SCALE; scale += 1) { 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long fromMin = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MIN_VALUE); 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long fromMax = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MAX_VALUE); 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long toMin = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.TO_MIN_VALUE); 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long toMax = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.TO_MAX_VALUE); 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toLimitTest(toMin, fromMin, scale); 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert toLimitTest(toMax, fromMax, scale); 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // Test with data from .Net System.DateTime ---------------------------- *** 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This data was generated by C++.Net code like 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Console::WriteLine(L" {{ {0}, 1, 1, INT64_C({1}) }},", year, DateTime(year, 1, 1).Ticks); 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * with the DateTime constructor taking int values for year, month, and date. 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static private final long dotNetDateTimeTicks[] = { 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* year, month, day, ticks */ 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 100, 1, 1, 31241376000000000L, 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 100, 3, 1, 31292352000000000L, 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 200, 1, 1, 62798112000000000L, 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 200, 3, 1, 62849088000000000L, 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 300, 1, 1, 94354848000000000L, 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 300, 3, 1, 94405824000000000L, 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 400, 1, 1, 125911584000000000L, 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 400, 3, 1, 125963424000000000L, 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 500, 1, 1, 157469184000000000L, 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 500, 3, 1, 157520160000000000L, 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 600, 1, 1, 189025920000000000L, 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 600, 3, 1, 189076896000000000L, 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 700, 1, 1, 220582656000000000L, 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 700, 3, 1, 220633632000000000L, 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 800, 1, 1, 252139392000000000L, 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 800, 3, 1, 252191232000000000L, 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 900, 1, 1, 283696992000000000L, 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 900, 3, 1, 283747968000000000L, 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1000, 1, 1, 315253728000000000L, 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1000, 3, 1, 315304704000000000L, 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1100, 1, 1, 346810464000000000L, 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1100, 3, 1, 346861440000000000L, 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1200, 1, 1, 378367200000000000L, 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1200, 3, 1, 378419040000000000L, 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1300, 1, 1, 409924800000000000L, 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1300, 3, 1, 409975776000000000L, 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1400, 1, 1, 441481536000000000L, 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1400, 3, 1, 441532512000000000L, 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1500, 1, 1, 473038272000000000L, 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1500, 3, 1, 473089248000000000L, 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1600, 1, 1, 504595008000000000L, 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1600, 3, 1, 504646848000000000L, 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1700, 1, 1, 536152608000000000L, 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1700, 3, 1, 536203584000000000L, 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1800, 1, 1, 567709344000000000L, 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1800, 3, 1, 567760320000000000L, 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1900, 1, 1, 599266080000000000L, 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1900, 3, 1, 599317056000000000L, 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2000, 1, 1, 630822816000000000L, 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2000, 3, 1, 630874656000000000L, 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2100, 1, 1, 662380416000000000L, 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2100, 3, 1, 662431392000000000L, 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2200, 1, 1, 693937152000000000L, 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2200, 3, 1, 693988128000000000L, 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2300, 1, 1, 725493888000000000L, 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2300, 3, 1, 725544864000000000L, 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2400, 1, 1, 757050624000000000L, 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2400, 3, 1, 757102464000000000L, 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2500, 1, 1, 788608224000000000L, 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2500, 3, 1, 788659200000000000L, 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2600, 1, 1, 820164960000000000L, 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2600, 3, 1, 820215936000000000L, 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2700, 1, 1, 851721696000000000L, 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2700, 3, 1, 851772672000000000L, 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2800, 1, 1, 883278432000000000L, 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2800, 3, 1, 883330272000000000L, 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2900, 1, 1, 914836032000000000L, 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2900, 3, 1, 914887008000000000L, 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3000, 1, 1, 946392768000000000L, 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3000, 3, 1, 946443744000000000L, 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1, 1, 1, 0L, 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1601, 1, 1, 504911232000000000L, 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1899, 12, 31, 599265216000000000L, 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1904, 1, 1, 600527520000000000L, 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1970, 1, 1, 621355968000000000L, 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2001, 1, 1, 631139040000000000L, 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9900, 3, 1, 3123873216000000000L, 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 9999, 12, 31, 3155378112000000000L 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * ICU's Universal Time Scale is designed to be tick-for-tick compatible with 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * .Net System.DateTime. Verify that this is so for the 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * .Net-supported date range (years 1-9999 AD). 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This requires a proleptic Gregorian calendar because that's what .Net uses. 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Proleptic: No Julian/Gregorian switchover, or a switchover before 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * any date that we test, that is, before 0001 AD. 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2132d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public void TestDotNet() { 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone utc; 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final long dayMillis = 86400 * 1000L; /* 1 day = 86400 seconds */ 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final long dayTicks = 86400 * 10000000L; 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final int kYear = 0; // offset for dotNetDateTimeTicks[] field 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final int kMonth = 1; 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final int kDay = 2; 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final int kTicks = 3; 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert final int kIncrement = 4; 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert GregorianCalendar cal; 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long icuDate; 2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long ticks, millis; 2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int i; 2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Open a proleptic Gregorian calendar. */ 2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long before0001AD = -1000000 * dayMillis; 2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert utc = new SimpleTimeZone(0, "UTC"); 2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal = new GregorianCalendar(utc, Locale.ENGLISH); 2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.setGregorianChange(new Date(before0001AD)); 2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for(i = 0; i < dotNetDateTimeTicks.length; i += kIncrement) { 2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Test conversion from .Net/Universal time to ICU time. */ 2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert millis = UniversalTimeScale.toLong(dotNetDateTimeTicks[i + kTicks], UniversalTimeScale.ICU4C_TIME); 2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set((int)dotNetDateTimeTicks[i + kYear], 2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (int)dotNetDateTimeTicks[i + kMonth] - 1, /* Java & ICU use January = month 0. */ 2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (int)dotNetDateTimeTicks[i + kDay]); 2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert icuDate = cal.getTimeInMillis(); 2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(millis != icuDate) { 2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Print days not millis. */ 2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("UniversalTimeScale.toLong(ticks[" + i + "], ICU4C)=" + 2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (millis/dayMillis) + " != " + (icuDate/dayMillis) + 2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "=ucal_getMillis(" + dotNetDateTimeTicks[i + kYear] + 2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-" + dotNetDateTimeTicks[i + kMonth] + 2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-" + dotNetDateTimeTicks[i + kDay] + ")"); 2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Test conversion from ICU time to .Net/Universal time. */ 2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ticks = UniversalTimeScale.from(icuDate, UniversalTimeScale.ICU4C_TIME); 2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(ticks != dotNetDateTimeTicks[i + kTicks]) { 2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* Print days not ticks. */ 2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln("UniversalTimeScale.from(date[" + i + "], ICU4C)=" + 2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert (ticks/dayTicks) + " != " + dotNetDateTimeTicks[i + kTicks]/dayTicks + 2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "=.Net System.DateTime(" + dotNetDateTimeTicks[i + kYear] + 2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-" + dotNetDateTimeTicks[i + kMonth] + 2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert "-" + dotNetDateTimeTicks[i + kDay] + ").Ticks"); 2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 263