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