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