blob: 237062748f9f993e39bdd946339fdf1c9272cb9d [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2008 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Neal Nguyen1a44d5d2010-01-13 10:42:43 -080017package android.util;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080018
19import junit.framework.TestCase;
20
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080021import java.util.Calendar;
22import java.util.TimeZone;
23
24/**
25 * TimeUtilsTest tests the time zone guesser.
26 */
27public class TimeUtilsTest extends TestCase {
28 public void testMainstream() throws Exception {
29 String[] mainstream = new String[] {
30 "America/New_York", // Eastern
31 "America/Chicago", // Central
32 "America/Denver", // Mountain
33 "America/Los_Angeles", // Pacific
34 "America/Anchorage", // Alaska
35 "Pacific/Honolulu", // Hawaii, no DST
36 };
37
38 for (String name : mainstream) {
39 TimeZone tz = TimeZone.getTimeZone(name);
40 Calendar c = Calendar.getInstance(tz);
41 TimeZone guess;
42
43 c.set(2008, Calendar.OCTOBER, 20, 12, 00, 00);
44 guess = guess(c, "us");
45 assertEquals(name, guess.getID());
46
47 c.set(2009, Calendar.JANUARY, 20, 12, 00, 00);
48 guess = guess(c, "us");
49 assertEquals(name, guess.getID());
50 }
51 }
52
53 public void testWeird() throws Exception {
54 String[] weird = new String[] {
55 "America/Phoenix", // Mountain, no DST
56 "America/Adak", // Same as Hawaii, but with DST
57 };
58
59 for (String name : weird) {
60 TimeZone tz = TimeZone.getTimeZone(name);
61 Calendar c = Calendar.getInstance(tz);
62 TimeZone guess;
63
64 c.set(2008, Calendar.OCTOBER, 20, 12, 00, 00);
65 guess = guess(c, "us");
66 assertEquals(name, guess.getID());
67 }
68 }
69
70 public void testOld() throws Exception {
71 String[] old = new String[] {
72 "America/Indiana/Indianapolis", // Eastern, formerly no DST
73 };
74
75 for (String name : old) {
76 TimeZone tz = TimeZone.getTimeZone(name);
77 Calendar c = Calendar.getInstance(tz);
78 TimeZone guess;
79
80 c.set(2005, Calendar.OCTOBER, 20, 12, 00, 00);
81 guess = guess(c, "us");
82 assertEquals(name, guess.getID());
83 }
84 }
85
86 public void testWorld() throws Exception {
87 String[] world = new String[] {
88 "ad", "Europe/Andorra",
89 "ae", "Asia/Dubai",
90 "af", "Asia/Kabul",
91 "ag", "America/Antigua",
92 "ai", "America/Anguilla",
93 "al", "Europe/Tirane",
94 "am", "Asia/Yerevan",
95 "an", "America/Curacao",
96 "ao", "Africa/Luanda",
97 "aq", "Antarctica/McMurdo",
98 "aq", "Antarctica/DumontDUrville",
99 "aq", "Antarctica/Casey",
100 "aq", "Antarctica/Davis",
101 "aq", "Antarctica/Mawson",
102 "aq", "Antarctica/Syowa",
103 "aq", "Antarctica/Rothera",
104 "aq", "Antarctica/Palmer",
105 "ar", "America/Argentina/Buenos_Aires",
106 "as", "Pacific/Pago_Pago",
107 "at", "Europe/Vienna",
108 "au", "Australia/Sydney",
109 "au", "Australia/Adelaide",
110 "au", "Australia/Perth",
111 "au", "Australia/Eucla",
112 "aw", "America/Aruba",
113 "ax", "Europe/Mariehamn",
114 "az", "Asia/Baku",
115 "ba", "Europe/Sarajevo",
116 "bb", "America/Barbados",
117 "bd", "Asia/Dhaka",
118 "be", "Europe/Brussels",
119 "bf", "Africa/Ouagadougou",
120 "bg", "Europe/Sofia",
121 "bh", "Asia/Bahrain",
122 "bi", "Africa/Bujumbura",
123 "bj", "Africa/Porto-Novo",
124 "bm", "Atlantic/Bermuda",
125 "bn", "Asia/Brunei",
126 "bo", "America/La_Paz",
127 "br", "America/Noronha",
128 "br", "America/Sao_Paulo",
129 "br", "America/Manaus",
130 "bs", "America/Nassau",
131 "bt", "Asia/Thimphu",
132 "bw", "Africa/Gaborone",
133 "by", "Europe/Minsk",
134 "bz", "America/Belize",
135 "ca", "America/St_Johns",
136 "ca", "America/Halifax",
137 "ca", "America/Toronto",
138 "ca", "America/Winnipeg",
139 "ca", "America/Edmonton",
140 "ca", "America/Vancouver",
141 "cc", "Indian/Cocos",
142 "cd", "Africa/Lubumbashi",
143 "cd", "Africa/Kinshasa",
144 "cf", "Africa/Bangui",
145 "cg", "Africa/Brazzaville",
146 "ch", "Europe/Zurich",
147 "ci", "Africa/Abidjan",
148 "ck", "Pacific/Rarotonga",
149 "cl", "America/Santiago",
150 "cl", "Pacific/Easter",
151 "cm", "Africa/Douala",
152 "cn", "Asia/Shanghai",
153 "co", "America/Bogota",
154 "cr", "America/Costa_Rica",
155 "cu", "America/Havana",
156 "cv", "Atlantic/Cape_Verde",
157 "cx", "Indian/Christmas",
158 "cy", "Asia/Nicosia",
159 "cz", "Europe/Prague",
160 "de", "Europe/Berlin",
161 "dj", "Africa/Djibouti",
162 "dk", "Europe/Copenhagen",
163 "dm", "America/Dominica",
164 "do", "America/Santo_Domingo",
165 "dz", "Africa/Algiers",
166 "ec", "America/Guayaquil",
167 "ec", "Pacific/Galapagos",
168 "ee", "Europe/Tallinn",
169 "eg", "Africa/Cairo",
170 "eh", "Africa/El_Aaiun",
171 "er", "Africa/Asmara",
172 "es", "Europe/Madrid",
173 "es", "Atlantic/Canary",
174 "et", "Africa/Addis_Ababa",
175 "fi", "Europe/Helsinki",
176 "fj", "Pacific/Fiji",
177 "fk", "Atlantic/Stanley",
178 "fm", "Pacific/Ponape",
179 "fm", "Pacific/Truk",
180 "fo", "Atlantic/Faroe",
181 "fr", "Europe/Paris",
182 "ga", "Africa/Libreville",
183 "gb", "Europe/London",
184 "gd", "America/Grenada",
185 "ge", "Asia/Tbilisi",
186 "gf", "America/Cayenne",
187 "gg", "Europe/Guernsey",
188 "gh", "Africa/Accra",
189 "gi", "Europe/Gibraltar",
190 "gl", "America/Danmarkshavn",
191 "gl", "America/Scoresbysund",
192 "gl", "America/Godthab",
193 "gl", "America/Thule",
194 "gm", "Africa/Banjul",
195 "gn", "Africa/Conakry",
196 "gp", "America/Guadeloupe",
197 "gq", "Africa/Malabo",
198 "gr", "Europe/Athens",
199 "gs", "Atlantic/South_Georgia",
200 "gt", "America/Guatemala",
201 "gu", "Pacific/Guam",
202 "gw", "Africa/Bissau",
203 "gy", "America/Guyana",
204 "hk", "Asia/Hong_Kong",
205 "hn", "America/Tegucigalpa",
206 "hr", "Europe/Zagreb",
207 "ht", "America/Port-au-Prince",
208 "hu", "Europe/Budapest",
209 "id", "Asia/Jayapura",
210 "id", "Asia/Makassar",
211 "id", "Asia/Jakarta",
212 "ie", "Europe/Dublin",
213 "il", "Asia/Jerusalem",
214 "im", "Europe/Isle_of_Man",
215 "in", "Asia/Calcutta",
216 "io", "Indian/Chagos",
217 "iq", "Asia/Baghdad",
218 "ir", "Asia/Tehran",
219 "is", "Atlantic/Reykjavik",
220 "it", "Europe/Rome",
221 "je", "Europe/Jersey",
222 "jm", "America/Jamaica",
223 "jo", "Asia/Amman",
224 "jp", "Asia/Tokyo",
225 "ke", "Africa/Nairobi",
226 "kg", "Asia/Bishkek",
227 "kh", "Asia/Phnom_Penh",
228 "ki", "Pacific/Kiritimati",
229 "ki", "Pacific/Enderbury",
230 "ki", "Pacific/Tarawa",
231 "km", "Indian/Comoro",
232 "kn", "America/St_Kitts",
233 "kp", "Asia/Pyongyang",
234 "kr", "Asia/Seoul",
235 "kw", "Asia/Kuwait",
236 "ky", "America/Cayman",
237 "kz", "Asia/Almaty",
238 "kz", "Asia/Aqtau",
239 "la", "Asia/Vientiane",
240 "lb", "Asia/Beirut",
241 "lc", "America/St_Lucia",
242 "li", "Europe/Vaduz",
243 "lk", "Asia/Colombo",
244 "lr", "Africa/Monrovia",
245 "ls", "Africa/Maseru",
246 "lt", "Europe/Vilnius",
247 "lu", "Europe/Luxembourg",
248 "lv", "Europe/Riga",
249 "ly", "Africa/Tripoli",
250 "ma", "Africa/Casablanca",
251 "mc", "Europe/Monaco",
252 "md", "Europe/Chisinau",
253 "me", "Europe/Podgorica",
254 "mg", "Indian/Antananarivo",
255 "mh", "Pacific/Majuro",
256 "mk", "Europe/Skopje",
257 "ml", "Africa/Bamako",
258 "mm", "Asia/Rangoon",
259 "mn", "Asia/Choibalsan",
260 "mn", "Asia/Hovd",
261 "mo", "Asia/Macau",
262 "mp", "Pacific/Saipan",
263 "mq", "America/Martinique",
264 "mr", "Africa/Nouakchott",
265 "ms", "America/Montserrat",
266 "mt", "Europe/Malta",
267 "mu", "Indian/Mauritius",
268 "mv", "Indian/Maldives",
269 "mw", "Africa/Blantyre",
270 "mx", "America/Mexico_City",
271 "mx", "America/Chihuahua",
272 "mx", "America/Tijuana",
273 "my", "Asia/Kuala_Lumpur",
274 "mz", "Africa/Maputo",
275 "na", "Africa/Windhoek",
276 "nc", "Pacific/Noumea",
277 "ne", "Africa/Niamey",
278 "nf", "Pacific/Norfolk",
279 "ng", "Africa/Lagos",
280 "ni", "America/Managua",
281 "nl", "Europe/Amsterdam",
282 "no", "Europe/Oslo",
283 "np", "Asia/Katmandu",
284 "nr", "Pacific/Nauru",
285 "nu", "Pacific/Niue",
286 "nz", "Pacific/Auckland",
287 "nz", "Pacific/Chatham",
288 "om", "Asia/Muscat",
289 "pa", "America/Panama",
290 "pe", "America/Lima",
291 "pf", "Pacific/Gambier",
292 "pf", "Pacific/Marquesas",
293 "pf", "Pacific/Tahiti",
294 "pg", "Pacific/Port_Moresby",
295 "ph", "Asia/Manila",
296 "pk", "Asia/Karachi",
297 "pl", "Europe/Warsaw",
298 "pm", "America/Miquelon",
299 "pn", "Pacific/Pitcairn",
300 "pr", "America/Puerto_Rico",
301 "ps", "Asia/Gaza",
302 "pt", "Europe/Lisbon",
303 "pt", "Atlantic/Azores",
304 "pw", "Pacific/Palau",
305 "py", "America/Asuncion",
306 "qa", "Asia/Qatar",
307 "re", "Indian/Reunion",
308 "ro", "Europe/Bucharest",
309 "rs", "Europe/Belgrade",
310 "ru", "Asia/Kamchatka",
311 "ru", "Asia/Magadan",
312 "ru", "Asia/Vladivostok",
313 "ru", "Asia/Yakutsk",
314 "ru", "Asia/Irkutsk",
315 "ru", "Asia/Krasnoyarsk",
316 "ru", "Asia/Novosibirsk",
317 "ru", "Asia/Yekaterinburg",
318 "ru", "Europe/Samara",
319 "ru", "Europe/Moscow",
320 "ru", "Europe/Kaliningrad",
321 "rw", "Africa/Kigali",
322 "sa", "Asia/Riyadh",
323 "sb", "Pacific/Guadalcanal",
324 "sc", "Indian/Mahe",
325 "sd", "Africa/Khartoum",
326 "se", "Europe/Stockholm",
327 "sg", "Asia/Singapore",
328 "sh", "Atlantic/St_Helena",
329 "si", "Europe/Ljubljana",
330 "sj", "Arctic/Longyearbyen",
331 "sk", "Europe/Bratislava",
332 "sl", "Africa/Freetown",
333 "sm", "Europe/San_Marino",
334 "sn", "Africa/Dakar",
335 "so", "Africa/Mogadishu",
336 "sr", "America/Paramaribo",
337 "st", "Africa/Sao_Tome",
338 "sv", "America/El_Salvador",
339 "sy", "Asia/Damascus",
340 "sz", "Africa/Mbabane",
341 "tc", "America/Grand_Turk",
342 "td", "Africa/Ndjamena",
343 "tf", "Indian/Kerguelen",
344 "tg", "Africa/Lome",
345 "th", "Asia/Bangkok",
346 "tj", "Asia/Dushanbe",
347 "tk", "Pacific/Fakaofo",
348 "tl", "Asia/Dili",
349 "tm", "Asia/Ashgabat",
350 "tn", "Africa/Tunis",
351 "to", "Pacific/Tongatapu",
352 "tr", "Europe/Istanbul",
353 "tt", "America/Port_of_Spain",
354 "tv", "Pacific/Funafuti",
355 "tw", "Asia/Taipei",
356 "tz", "Africa/Dar_es_Salaam",
357 "ua", "Europe/Kiev",
358 "ug", "Africa/Kampala",
359 "um", "Pacific/Wake",
360 "um", "Pacific/Johnston",
361 "um", "Pacific/Midway",
362 "us", "America/New_York",
363 "us", "America/Chicago",
364 "us", "America/Denver",
365 "us", "America/Los_Angeles",
366 "us", "America/Anchorage",
367 "us", "Pacific/Honolulu",
368 "uy", "America/Montevideo",
369 "uz", "Asia/Tashkent",
370 "va", "Europe/Vatican",
371 "vc", "America/St_Vincent",
372 "ve", "America/Caracas",
373 "vg", "America/Tortola",
374 "vi", "America/St_Thomas",
375 "vn", "Asia/Saigon",
376 "vu", "Pacific/Efate",
377 "wf", "Pacific/Wallis",
378 "ws", "Pacific/Apia",
379 "ye", "Asia/Aden",
380 "yt", "Indian/Mayotte",
381 "za", "Africa/Johannesburg",
382 "zm", "Africa/Lusaka",
383 "zw", "Africa/Harare",
384 };
385
386 for (int i = 0; i < world.length; i += 2) {
387 String country = world[i];
388 String name = world[i + 1];
389
390 TimeZone tz = TimeZone.getTimeZone(name);
391 Calendar c = Calendar.getInstance(tz);
392 TimeZone guess;
393
394 c.set(2009, Calendar.JULY, 20, 12, 00, 00);
395 guess = guess(c, country);
396 assertEquals(name, guess.getID());
397
398 c.set(2009, Calendar.JANUARY, 20, 12, 00, 00);
399 guess = guess(c, country);
400 assertEquals(name, guess.getID());
401 }
402 }
403
404 public void testWorldWeird() throws Exception {
405 String[] world = new String[] {
406 // Distinguisable from Sydney only when DST not in effect
407 "au", "Australia/Lord_Howe",
408 };
409
410 for (int i = 0; i < world.length; i += 2) {
411 String country = world[i];
412 String name = world[i + 1];
413
414 TimeZone tz = TimeZone.getTimeZone(name);
415 Calendar c = Calendar.getInstance(tz);
416 TimeZone guess;
417
418 c.set(2009, Calendar.JULY, 20, 12, 00, 00);
419 guess = guess(c, country);
420 assertEquals(name, guess.getID());
421 }
422 }
423
424 private static TimeZone guess(Calendar c, String country) {
425 return TimeUtils.getTimeZone(c.get(c.ZONE_OFFSET) + c.get(c.DST_OFFSET),
426 c.get(c.DST_OFFSET) != 0,
427 c.getTimeInMillis(),
428 country);
429 }
Bjorn Bringert901b3792010-11-23 14:43:12 +0000430
431 public void testFormatDuration() {
432 assertFormatDuration("0", 0);
433 assertFormatDuration("-1ms", -1);
434 assertFormatDuration("+1ms", 1);
435 assertFormatDuration("+10ms", 10);
436 assertFormatDuration("+100ms", 100);
437 assertFormatDuration("+101ms", 101);
438 assertFormatDuration("+330ms", 330);
Mitchell Willsf9a80cb2015-09-22 15:30:08 -0700439 assertFormatDuration("+1s0ms", 1000);
Bjorn Bringert901b3792010-11-23 14:43:12 +0000440 assertFormatDuration("+1s330ms", 1330);
441 assertFormatDuration("+10s24ms", 10024);
Mitchell Willsf9a80cb2015-09-22 15:30:08 -0700442 assertFormatDuration("+1m0s30ms", 60030);
443 assertFormatDuration("+1h0m0s30ms", 3600030);
444 assertFormatDuration("+1d0h0m0s30ms", 86400030);
Bjorn Bringert901b3792010-11-23 14:43:12 +0000445 }
446
Jeff Sharkeyeaaf3962012-07-21 12:37:26 -0700447 public void testFormatHugeDuration() {
Mitchell Willsf9a80cb2015-09-22 15:30:08 -0700448 assertFormatDuration("+15542d1h11m11s555ms", 1342833071555L);
449 assertFormatDuration("-15542d1h11m11s555ms", -1342833071555L);
Jeff Sharkeyeaaf3962012-07-21 12:37:26 -0700450 }
451
Bjorn Bringert901b3792010-11-23 14:43:12 +0000452 private void assertFormatDuration(String expected, long duration) {
453 StringBuilder sb = new StringBuilder();
454 TimeUtils.formatDuration(duration, sb);
455 assertEquals("formatDuration(" + duration + ")", expected, sb.toString());
456 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800457}