1 /* 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 17 package android.util; 18 19 import junit.framework.TestCase; 20 21 import java.util.Calendar; 22 import java.util.TimeZone; 23 24 /** 25 * TimeUtilsTest tests the time zone guesser. 26 */ 27 public 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 } 430 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); 439 assertFormatDuration("+1s330ms", 1330); 440 assertFormatDuration("+10s24ms", 10024); 441 } 442 443 public void testFormatHugeDuration() { 444 //assertFormatDuration("+15542d1h11m11s555ms", 1342833071555L); 445 // TODO: improve formatDuration() API 446 assertFormatDuration("+999d23h59m59s999ms", 1342833071555L); 447 assertFormatDuration("-999d23h59m59s999ms", -1342833071555L); 448 } 449 450 private void assertFormatDuration(String expected, long duration) { 451 StringBuilder sb = new StringBuilder(); 452 TimeUtils.formatDuration(duration, sb); 453 assertEquals("formatDuration(" + duration + ")", expected, sb.toString()); 454 } 455 } 456