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