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