1/* GENERATED SOURCE. DO NOT MODIFY. */
2// © 2016 and later: Unicode, Inc. and others.
3// License & terms of use: http://www.unicode.org/copyright.html#License
4/*
5 *******************************************************************************
6 * Copyright (C) 2004-2010, International Business Machines Corporation and    *
7 * others. All Rights Reserved.                                                *
8 *******************************************************************************
9 *
10 */
11
12package android.icu.dev.test.timescale;
13
14import java.util.Date;
15import java.util.Locale;
16
17import org.junit.Test;
18
19import android.icu.dev.test.TestFmwk;
20import android.icu.util.GregorianCalendar;
21import android.icu.util.SimpleTimeZone;
22import android.icu.util.TimeZone;
23import android.icu.util.UniversalTimeScale;
24
25/**
26 * @author Owner
27 *
28 * TODO To change the template for this generated type comment go to
29 * Window - Preferences - Java - Code Style - Code Templates
30 */
31public class TimeScaleDataTest extends TestFmwk
32{
33
34    /**
35     * Default contstructor.
36     */
37    public TimeScaleDataTest()
38    {
39    }
40
41    private void roundTripTest(long value, int scale)
42    {
43        long rt = UniversalTimeScale.toLong(UniversalTimeScale.from(value, scale), scale);
44
45        if (rt != value) {
46            errln("Round-trip error: time scale = " + scale + ", value = " + value + ", round-trip = " + rt);
47        }
48    }
49
50    private void toLimitTest(long toLimit, long fromLimit, int scale)
51    {
52        long result = UniversalTimeScale.toLong(toLimit, scale);
53
54        if (result != fromLimit) {
55            errln("toLimit failure: scale = " + scale + ", toLimit = " + toLimit +
56                  ", toLong(toLimit, scale) = " + result + ", fromLimit = " + fromLimit);
57        }
58    }
59
60    private void epochOffsetTest(long epochOffset, long units, int scale)
61    {
62        long universalEpoch = epochOffset * units;
63        long local = UniversalTimeScale.toLong(universalEpoch, scale);
64
65        if (local != 0) {
66            errln("toLong(epochOffset, scale): scale = " + scale + ", epochOffset = " + universalEpoch +
67                  ", result = " + local);
68        }
69
70        local = UniversalTimeScale.toLong(0, scale);
71
72        if (local != -epochOffset) {
73            errln("toLong(0, scale): scale = " + scale + ", result = " + local);
74        }
75
76        long universal = UniversalTimeScale.from(-epochOffset, scale);
77
78        if (universal != 0) {
79            errln("from(-epochOffest, scale): scale = " + scale + ", epochOffset = " + epochOffset +
80                  ", result = " + universal);
81        }
82
83        universal = UniversalTimeScale.from(0, scale);
84
85        if (universal != universalEpoch) {
86            errln("from(0, scale): scale = " + scale + ", result = " + universal);
87        }
88    }
89
90    @Test
91    public void TestEpochOffsets()
92    {
93        for (int scale = 0; scale < UniversalTimeScale.MAX_SCALE; scale += 1) {
94            long units       = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.UNITS_VALUE);
95            long epochOffset = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.EPOCH_OFFSET_VALUE);
96
97            epochOffsetTest(epochOffset, units, scale);
98        }
99    }
100
101    @Test
102    public void TestFromLimits()
103    {
104        for (int scale = 0; scale < UniversalTimeScale.MAX_SCALE; scale += 1) {
105            long fromMin = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MIN_VALUE);
106            long fromMax = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MAX_VALUE);
107
108            roundTripTest(fromMin, scale);
109            roundTripTest(fromMax, scale);
110        }
111    }
112
113    @Test
114    public void TestToLimits()
115    {
116        for (int scale = 0; scale < UniversalTimeScale.MAX_SCALE; scale += 1) {
117            long fromMin = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MIN_VALUE);
118            long fromMax = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.FROM_MAX_VALUE);
119            long toMin   = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.TO_MIN_VALUE);
120            long toMax   = UniversalTimeScale.getTimeScaleValue(scale, UniversalTimeScale.TO_MAX_VALUE);
121
122            toLimitTest(toMin, fromMin, scale);
123            toLimitTest(toMax, fromMax, scale);
124       }
125    }
126
127    // Test with data from .Net System.DateTime ---------------------------- ***
128
129    /*
130     * This data was generated by C++.Net code like
131     * Console::WriteLine(L"    {{ {0}, 1, 1, INT64_C({1}) }},", year, DateTime(year, 1, 1).Ticks);
132     * with the DateTime constructor taking int values for year, month, and date.
133     */
134    static private final long dotNetDateTimeTicks[] = {
135        /* year, month, day, ticks */
136        100, 1, 1, 31241376000000000L,
137        100, 3, 1, 31292352000000000L,
138        200, 1, 1, 62798112000000000L,
139        200, 3, 1, 62849088000000000L,
140        300, 1, 1, 94354848000000000L,
141        300, 3, 1, 94405824000000000L,
142        400, 1, 1, 125911584000000000L,
143        400, 3, 1, 125963424000000000L,
144        500, 1, 1, 157469184000000000L,
145        500, 3, 1, 157520160000000000L,
146        600, 1, 1, 189025920000000000L,
147        600, 3, 1, 189076896000000000L,
148        700, 1, 1, 220582656000000000L,
149        700, 3, 1, 220633632000000000L,
150        800, 1, 1, 252139392000000000L,
151        800, 3, 1, 252191232000000000L,
152        900, 1, 1, 283696992000000000L,
153        900, 3, 1, 283747968000000000L,
154        1000, 1, 1, 315253728000000000L,
155        1000, 3, 1, 315304704000000000L,
156        1100, 1, 1, 346810464000000000L,
157        1100, 3, 1, 346861440000000000L,
158        1200, 1, 1, 378367200000000000L,
159        1200, 3, 1, 378419040000000000L,
160        1300, 1, 1, 409924800000000000L,
161        1300, 3, 1, 409975776000000000L,
162        1400, 1, 1, 441481536000000000L,
163        1400, 3, 1, 441532512000000000L,
164        1500, 1, 1, 473038272000000000L,
165        1500, 3, 1, 473089248000000000L,
166        1600, 1, 1, 504595008000000000L,
167        1600, 3, 1, 504646848000000000L,
168        1700, 1, 1, 536152608000000000L,
169        1700, 3, 1, 536203584000000000L,
170        1800, 1, 1, 567709344000000000L,
171        1800, 3, 1, 567760320000000000L,
172        1900, 1, 1, 599266080000000000L,
173        1900, 3, 1, 599317056000000000L,
174        2000, 1, 1, 630822816000000000L,
175        2000, 3, 1, 630874656000000000L,
176        2100, 1, 1, 662380416000000000L,
177        2100, 3, 1, 662431392000000000L,
178        2200, 1, 1, 693937152000000000L,
179        2200, 3, 1, 693988128000000000L,
180        2300, 1, 1, 725493888000000000L,
181        2300, 3, 1, 725544864000000000L,
182        2400, 1, 1, 757050624000000000L,
183        2400, 3, 1, 757102464000000000L,
184        2500, 1, 1, 788608224000000000L,
185        2500, 3, 1, 788659200000000000L,
186        2600, 1, 1, 820164960000000000L,
187        2600, 3, 1, 820215936000000000L,
188        2700, 1, 1, 851721696000000000L,
189        2700, 3, 1, 851772672000000000L,
190        2800, 1, 1, 883278432000000000L,
191        2800, 3, 1, 883330272000000000L,
192        2900, 1, 1, 914836032000000000L,
193        2900, 3, 1, 914887008000000000L,
194        3000, 1, 1, 946392768000000000L,
195        3000, 3, 1, 946443744000000000L,
196        1, 1, 1, 0L,
197        1601, 1, 1, 504911232000000000L,
198        1899, 12, 31, 599265216000000000L,
199        1904, 1, 1, 600527520000000000L,
200        1970, 1, 1, 621355968000000000L,
201        2001, 1, 1, 631139040000000000L,
202        9900, 3, 1, 3123873216000000000L,
203        9999, 12, 31, 3155378112000000000L
204    };
205
206    /*
207     * ICU's Universal Time Scale is designed to be tick-for-tick compatible with
208     * .Net System.DateTime. Verify that this is so for the
209     * .Net-supported date range (years 1-9999 AD).
210     * This requires a proleptic Gregorian calendar because that's what .Net uses.
211     * Proleptic: No Julian/Gregorian switchover, or a switchover before
212     * any date that we test, that is, before 0001 AD.
213     */
214    @Test
215    public void TestDotNet() {
216        TimeZone utc;
217        final long dayMillis = 86400 * 1000L;    /* 1 day = 86400 seconds */
218        final long dayTicks = 86400 * 10000000L;
219        final int kYear = 0;  // offset for dotNetDateTimeTicks[] field
220        final int kMonth = 1;
221        final int kDay = 2;
222        final int kTicks = 3;
223        final int kIncrement = 4;
224        GregorianCalendar cal;
225        long icuDate;
226        long ticks, millis;
227        int i;
228
229        /* Open a proleptic Gregorian calendar. */
230        long before0001AD = -1000000 * dayMillis;
231        utc = new SimpleTimeZone(0, "UTC");
232        cal = new GregorianCalendar(utc, Locale.ENGLISH);
233        cal.setGregorianChange(new Date(before0001AD));
234        for(i = 0; i < dotNetDateTimeTicks.length; i += kIncrement) {
235            /* Test conversion from .Net/Universal time to ICU time. */
236            millis = UniversalTimeScale.toLong(dotNetDateTimeTicks[i + kTicks], UniversalTimeScale.ICU4C_TIME);
237            cal.clear();
238            cal.set((int)dotNetDateTimeTicks[i + kYear],
239                    (int)dotNetDateTimeTicks[i + kMonth] - 1, /* Java & ICU use January = month 0. */
240                    (int)dotNetDateTimeTicks[i + kDay]);
241            icuDate = cal.getTimeInMillis();
242            if(millis != icuDate) {
243                /* Print days not millis. */
244                errln("UniversalTimeScale.toLong(ticks[" + i + "], ICU4C)=" +
245                      (millis/dayMillis) + " != " + (icuDate/dayMillis) +
246                      "=ucal_getMillis(" + dotNetDateTimeTicks[i + kYear] +
247                      "-" + dotNetDateTimeTicks[i + kMonth] +
248                      "-" + dotNetDateTimeTicks[i + kDay] + ")");
249            }
250
251            /* Test conversion from ICU time to .Net/Universal time. */
252            ticks = UniversalTimeScale.from(icuDate, UniversalTimeScale.ICU4C_TIME);
253            if(ticks != dotNetDateTimeTicks[i + kTicks]) {
254                /* Print days not ticks. */
255                errln("UniversalTimeScale.from(date[" + i + "], ICU4C)=" +
256                      (ticks/dayTicks) + " != " + dotNetDateTimeTicks[i + kTicks]/dayTicks +
257                      "=.Net System.DateTime(" + dotNetDateTimeTicks[i + kYear] +
258                      "-" + dotNetDateTimeTicks[i + kMonth] +
259                      "-" + dotNetDateTimeTicks[i + kDay] + ").Ticks");
260            }
261        }
262    }
263}
264