001 /* 002 * Copyright 2001-2011 Stephen Colebourne 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.joda.time; 017 018 import java.io.ByteArrayInputStream; 019 import java.io.ByteArrayOutputStream; 020 import java.io.ObjectInputStream; 021 import java.io.ObjectOutputStream; 022 import java.io.PrintStream; 023 import java.lang.reflect.Method; 024 import java.lang.reflect.Modifier; 025 import java.security.AllPermission; 026 import java.security.CodeSource; 027 import java.security.Permission; 028 import java.security.PermissionCollection; 029 import java.security.Permissions; 030 import java.security.Policy; 031 import java.security.ProtectionDomain; 032 import java.text.DateFormatSymbols; 033 import java.util.HashSet; 034 import java.util.LinkedHashMap; 035 import java.util.Locale; 036 import java.util.Map; 037 import java.util.Set; 038 import java.util.TimeZone; 039 040 import junit.framework.TestCase; 041 import junit.framework.TestSuite; 042 043 import org.joda.time.tz.DefaultNameProvider; 044 import org.joda.time.tz.NameProvider; 045 import org.joda.time.tz.Provider; 046 import org.joda.time.tz.UTCProvider; 047 import org.joda.time.tz.ZoneInfoProvider; 048 049 /** 050 * This class is a JUnit test for DateTimeZone. 051 * 052 * @author Stephen Colebourne 053 */ 054 public class TestDateTimeZone extends TestCase { 055 private static final boolean OLD_JDK; 056 static { 057 String str = System.getProperty("java.version"); 058 boolean old = true; 059 if (str.length() > 3 && 060 str.charAt(0) == '1' && 061 str.charAt(1) == '.' && 062 (str.charAt(2) == '4' || str.charAt(2) == '5' || str.charAt(2) == '6')) { 063 old = false; 064 } 065 OLD_JDK = old; 066 } 067 068 // Test in 2002/03 as time zones are more well known 069 // (before the late 90's they were all over the place) 070 071 private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris"); 072 private static final DateTimeZone LONDON = DateTimeZone.forID("Europe/London"); 073 074 long y2002days = 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 075 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 076 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 077 366 + 365; 078 long y2003days = 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 079 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 080 365 + 365 + 366 + 365 + 365 + 365 + 366 + 365 + 365 + 365 + 081 366 + 365 + 365; 082 083 // 2002-06-09 084 private long TEST_TIME_SUMMER = 085 (y2002days + 31L + 28L + 31L + 30L + 31L + 9L -1L) * DateTimeConstants.MILLIS_PER_DAY; 086 087 // 2002-01-09 088 private long TEST_TIME_WINTER = 089 (y2002days + 9L -1L) * DateTimeConstants.MILLIS_PER_DAY; 090 091 // // 2002-04-05 Fri 092 // private long TEST_TIME1 = 093 // (y2002days + 31L + 28L + 31L + 5L -1L) * DateTimeConstants.MILLIS_PER_DAY 094 // + 12L * DateTimeConstants.MILLIS_PER_HOUR 095 // + 24L * DateTimeConstants.MILLIS_PER_MINUTE; 096 // 097 // // 2003-05-06 Tue 098 // private long TEST_TIME2 = 099 // (y2003days + 31L + 28L + 31L + 30L + 6L -1L) * DateTimeConstants.MILLIS_PER_DAY 100 // + 14L * DateTimeConstants.MILLIS_PER_HOUR 101 // + 28L * DateTimeConstants.MILLIS_PER_MINUTE; 102 103 private static final Policy RESTRICT; 104 private static final Policy ALLOW; 105 static { 106 // don't call Policy.getPolicy() 107 RESTRICT = new Policy() { 108 public PermissionCollection getPermissions(CodeSource codesource) { 109 Permissions p = new Permissions(); 110 p.add(new AllPermission()); // enable everything 111 return p; 112 } 113 public void refresh() { 114 } 115 public boolean implies(ProtectionDomain domain, Permission permission) { 116 if (permission instanceof JodaTimePermission) { 117 return false; 118 } 119 return true; 120 // return super.implies(domain, permission); 121 } 122 }; 123 ALLOW = new Policy() { 124 public PermissionCollection getPermissions(CodeSource codesource) { 125 Permissions p = new Permissions(); 126 p.add(new AllPermission()); // enable everything 127 return p; 128 } 129 public void refresh() { 130 } 131 }; 132 } 133 134 private DateTimeZone zone; 135 private Locale locale; 136 137 public static void main(String[] args) { 138 junit.textui.TestRunner.run(suite()); 139 } 140 141 public static TestSuite suite() { 142 return new TestSuite(TestDateTimeZone.class); 143 } 144 145 public TestDateTimeZone(String name) { 146 super(name); 147 } 148 149 protected void setUp() throws Exception { 150 locale = Locale.getDefault(); 151 zone = DateTimeZone.getDefault(); 152 Locale.setDefault(Locale.UK); 153 } 154 155 protected void tearDown() throws Exception { 156 Locale.setDefault(locale); 157 DateTimeZone.setDefault(zone); 158 } 159 160 //----------------------------------------------------------------------- 161 public void testDefault() { 162 assertNotNull(DateTimeZone.getDefault()); 163 164 DateTimeZone.setDefault(PARIS); 165 assertSame(PARIS, DateTimeZone.getDefault()); 166 167 try { 168 DateTimeZone.setDefault(null); 169 fail(); 170 } catch (IllegalArgumentException ex) {} 171 } 172 173 public void testDefaultSecurity() { 174 if (OLD_JDK) { 175 return; 176 } 177 try { 178 Policy.setPolicy(RESTRICT); 179 System.setSecurityManager(new SecurityManager()); 180 DateTimeZone.setDefault(PARIS); 181 fail(); 182 } catch (SecurityException ex) { 183 // ok 184 } finally { 185 System.setSecurityManager(null); 186 Policy.setPolicy(ALLOW); 187 } 188 } 189 190 //----------------------------------------------------------------------- 191 public void testForID_String() { 192 assertEquals(DateTimeZone.getDefault(), DateTimeZone.forID((String) null)); 193 194 DateTimeZone zone = DateTimeZone.forID("Europe/London"); 195 assertEquals("Europe/London", zone.getID()); 196 197 zone = DateTimeZone.forID("UTC"); 198 assertSame(DateTimeZone.UTC, zone); 199 200 zone = DateTimeZone.forID("+00:00"); 201 assertSame(DateTimeZone.UTC, zone); 202 203 zone = DateTimeZone.forID("+00"); 204 assertSame(DateTimeZone.UTC, zone); 205 206 zone = DateTimeZone.forID("+01:23"); 207 assertEquals("+01:23", zone.getID()); 208 assertEquals(DateTimeConstants.MILLIS_PER_HOUR + (23L * DateTimeConstants.MILLIS_PER_MINUTE), 209 zone.getOffset(TEST_TIME_SUMMER)); 210 211 zone = DateTimeZone.forID("-02:00"); 212 assertEquals("-02:00", zone.getID()); 213 assertEquals((-2L * DateTimeConstants.MILLIS_PER_HOUR), 214 zone.getOffset(TEST_TIME_SUMMER)); 215 216 zone = DateTimeZone.forID("-07:05:34.0"); 217 assertEquals("-07:05:34", zone.getID()); 218 assertEquals((-7L * DateTimeConstants.MILLIS_PER_HOUR) + 219 (-5L * DateTimeConstants.MILLIS_PER_MINUTE) + 220 (-34L * DateTimeConstants.MILLIS_PER_SECOND), 221 zone.getOffset(TEST_TIME_SUMMER)); 222 223 try { 224 DateTimeZone.forID("SST"); 225 fail(); 226 } catch (IllegalArgumentException ex) {} 227 try { 228 DateTimeZone.forID("europe/london"); 229 fail(); 230 } catch (IllegalArgumentException ex) {} 231 try { 232 DateTimeZone.forID("Europe/UK"); 233 fail(); 234 } catch (IllegalArgumentException ex) {} 235 try { 236 DateTimeZone.forID("+"); 237 fail(); 238 } catch (IllegalArgumentException ex) {} 239 try { 240 DateTimeZone.forID("+0"); 241 fail(); 242 } catch (IllegalArgumentException ex) {} 243 } 244 245 public void testForID_String_old() { 246 Map<String, String> map = new LinkedHashMap<String, String>(); 247 map.put("GMT", "UTC"); 248 map.put("WET", "WET"); 249 map.put("CET", "CET"); 250 map.put("MET", "CET"); 251 map.put("ECT", "CET"); 252 map.put("EET", "EET"); 253 map.put("MIT", "Pacific/Apia"); 254 map.put("HST", "Pacific/Honolulu"); 255 map.put("AST", "America/Anchorage"); 256 map.put("PST", "America/Los_Angeles"); 257 map.put("MST", "America/Denver"); 258 map.put("PNT", "America/Phoenix"); 259 map.put("CST", "America/Chicago"); 260 map.put("EST", "America/New_York"); 261 map.put("IET", "America/Indiana/Indianapolis"); 262 map.put("PRT", "America/Puerto_Rico"); 263 map.put("CNT", "America/St_Johns"); 264 map.put("AGT", "America/Argentina/Buenos_Aires"); 265 map.put("BET", "America/Sao_Paulo"); 266 map.put("ART", "Africa/Cairo"); 267 map.put("CAT", "Africa/Harare"); 268 map.put("EAT", "Africa/Addis_Ababa"); 269 map.put("NET", "Asia/Yerevan"); 270 map.put("PLT", "Asia/Karachi"); 271 map.put("IST", "Asia/Kolkata"); 272 map.put("BST", "Asia/Dhaka"); 273 map.put("VST", "Asia/Ho_Chi_Minh"); 274 map.put("CTT", "Asia/Shanghai"); 275 map.put("JST", "Asia/Tokyo"); 276 map.put("ACT", "Australia/Darwin"); 277 map.put("AET", "Australia/Sydney"); 278 map.put("SST", "Pacific/Guadalcanal"); 279 map.put("NST", "Pacific/Auckland"); 280 for (String key : map.keySet()) { 281 String value = map.get(key); 282 TimeZone juZone = TimeZone.getTimeZone(key); 283 DateTimeZone zone = DateTimeZone.forTimeZone(juZone); 284 assertEquals(value, zone.getID()); 285 // System.out.println(juZone); 286 // System.out.println(juZone.getDisplayName()); 287 // System.out.println(zone); 288 // System.out.println("------"); 289 } 290 } 291 292 //----------------------------------------------------------------------- 293 public void testForOffsetHours_int() { 294 assertEquals(DateTimeZone.UTC, DateTimeZone.forOffsetHours(0)); 295 assertEquals(DateTimeZone.forID("+03:00"), DateTimeZone.forOffsetHours(3)); 296 assertEquals(DateTimeZone.forID("-02:00"), DateTimeZone.forOffsetHours(-2)); 297 try { 298 DateTimeZone.forOffsetHours(999999); 299 fail(); 300 } catch (IllegalArgumentException ex) {} 301 } 302 303 //----------------------------------------------------------------------- 304 public void testForOffsetHoursMinutes_int_int() { 305 assertEquals(DateTimeZone.UTC, DateTimeZone.forOffsetHoursMinutes(0, 0)); 306 assertEquals(DateTimeZone.forID("+03:15"), DateTimeZone.forOffsetHoursMinutes(3, 15)); 307 assertEquals(DateTimeZone.forID("-02:00"), DateTimeZone.forOffsetHoursMinutes(-2, 0)); 308 assertEquals(DateTimeZone.forID("-02:30"), DateTimeZone.forOffsetHoursMinutes(-2, 30)); 309 try { 310 DateTimeZone.forOffsetHoursMinutes(2, 60); 311 fail(); 312 } catch (IllegalArgumentException ex) {} 313 try { 314 DateTimeZone.forOffsetHoursMinutes(-2, 60); 315 fail(); 316 } catch (IllegalArgumentException ex) {} 317 try { 318 DateTimeZone.forOffsetHoursMinutes(2, -1); 319 fail(); 320 } catch (IllegalArgumentException ex) {} 321 try { 322 DateTimeZone.forOffsetHoursMinutes(-2, -1); 323 fail(); 324 } catch (IllegalArgumentException ex) {} 325 try { 326 DateTimeZone.forOffsetHoursMinutes(999999, 0); 327 fail(); 328 } catch (IllegalArgumentException ex) {} 329 } 330 331 //----------------------------------------------------------------------- 332 public void testForOffsetMillis_int() { 333 assertSame(DateTimeZone.UTC, DateTimeZone.forOffsetMillis(0)); 334 assertEquals(DateTimeZone.forID("+03:00"), DateTimeZone.forOffsetMillis(3 * 60 * 60 * 1000)); 335 assertEquals(DateTimeZone.forID("-02:00"), DateTimeZone.forOffsetMillis(-2 * 60 * 60 * 1000)); 336 assertEquals(DateTimeZone.forID("+04:45:17.045"), 337 DateTimeZone.forOffsetMillis( 338 4 * 60 * 60 * 1000 + 45 * 60 * 1000 + 17 * 1000 + 45)); 339 } 340 341 //----------------------------------------------------------------------- 342 public void testForTimeZone_TimeZone() { 343 assertEquals(DateTimeZone.getDefault(), DateTimeZone.forTimeZone((TimeZone) null)); 344 345 DateTimeZone zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("Europe/London")); 346 assertEquals("Europe/London", zone.getID()); 347 assertSame(DateTimeZone.UTC, DateTimeZone.forTimeZone(TimeZone.getTimeZone("UTC"))); 348 349 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("+00:00")); 350 assertSame(DateTimeZone.UTC, zone); 351 352 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+00:00")); 353 assertSame(DateTimeZone.UTC, zone); 354 355 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+00:00")); 356 assertSame(DateTimeZone.UTC, zone); 357 358 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+00")); 359 assertSame(DateTimeZone.UTC, zone); 360 361 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+01:23")); 362 assertEquals("+01:23", zone.getID()); 363 assertEquals(DateTimeConstants.MILLIS_PER_HOUR + (23L * DateTimeConstants.MILLIS_PER_MINUTE), 364 zone.getOffset(TEST_TIME_SUMMER)); 365 366 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+1:23")); 367 assertEquals("+01:23", zone.getID()); 368 assertEquals(DateTimeConstants.MILLIS_PER_HOUR + (23L * DateTimeConstants.MILLIS_PER_MINUTE), 369 zone.getOffset(TEST_TIME_SUMMER)); 370 371 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT-02:00")); 372 assertEquals("-02:00", zone.getID()); 373 assertEquals((-2L * DateTimeConstants.MILLIS_PER_HOUR), zone.getOffset(TEST_TIME_SUMMER)); 374 375 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+2")); 376 assertEquals("+02:00", zone.getID()); 377 assertEquals((2L * DateTimeConstants.MILLIS_PER_HOUR), zone.getOffset(TEST_TIME_SUMMER)); 378 379 zone = DateTimeZone.forTimeZone(TimeZone.getTimeZone("EST")); 380 assertEquals("America/New_York", zone.getID()); 381 } 382 383 public void testTimeZoneConversion() { 384 TimeZone jdkTimeZone = TimeZone.getTimeZone("GMT-10"); 385 assertEquals("GMT-10:00", jdkTimeZone.getID()); 386 387 DateTimeZone jodaTimeZone = DateTimeZone.forTimeZone(jdkTimeZone); 388 assertEquals("-10:00", jodaTimeZone.getID()); 389 assertEquals(jdkTimeZone.getRawOffset(), jodaTimeZone.getOffset(0L)); 390 391 TimeZone convertedTimeZone = jodaTimeZone.toTimeZone(); 392 assertEquals("GMT-10:00", jdkTimeZone.getID()); 393 394 assertEquals(jdkTimeZone.getID(), convertedTimeZone.getID()); 395 assertEquals(jdkTimeZone.getRawOffset(), convertedTimeZone.getRawOffset()); 396 } 397 398 //----------------------------------------------------------------------- 399 public void testGetAvailableIDs() { 400 assertTrue(DateTimeZone.getAvailableIDs().contains("UTC")); 401 } 402 403 //----------------------------------------------------------------------- 404 public void testProvider() { 405 try { 406 assertNotNull(DateTimeZone.getProvider()); 407 408 Provider provider = DateTimeZone.getProvider(); 409 DateTimeZone.setProvider(null); 410 assertEquals(provider.getClass(), DateTimeZone.getProvider().getClass()); 411 412 try { 413 DateTimeZone.setProvider(new MockNullIDSProvider()); 414 fail(); 415 } catch (IllegalArgumentException ex) {} 416 try { 417 DateTimeZone.setProvider(new MockEmptyIDSProvider()); 418 fail(); 419 } catch (IllegalArgumentException ex) {} 420 try { 421 DateTimeZone.setProvider(new MockNoUTCProvider()); 422 fail(); 423 } catch (IllegalArgumentException ex) {} 424 try { 425 DateTimeZone.setProvider(new MockBadUTCProvider()); 426 fail(); 427 } catch (IllegalArgumentException ex) {} 428 429 Provider prov = new MockOKProvider(); 430 DateTimeZone.setProvider(prov); 431 assertSame(prov, DateTimeZone.getProvider()); 432 assertEquals(2, DateTimeZone.getAvailableIDs().size()); 433 assertTrue(DateTimeZone.getAvailableIDs().contains("UTC")); 434 assertTrue(DateTimeZone.getAvailableIDs().contains("Europe/London")); 435 } finally { 436 DateTimeZone.setProvider(null); 437 assertEquals(ZoneInfoProvider.class, DateTimeZone.getProvider().getClass()); 438 } 439 440 try { 441 System.setProperty("org.joda.time.DateTimeZone.Provider", "org.joda.time.tz.UTCProvider"); 442 DateTimeZone.setProvider(null); 443 assertEquals(UTCProvider.class, DateTimeZone.getProvider().getClass()); 444 } finally { 445 System.getProperties().remove("org.joda.time.DateTimeZone.Provider"); 446 DateTimeZone.setProvider(null); 447 assertEquals(ZoneInfoProvider.class, DateTimeZone.getProvider().getClass()); 448 } 449 450 PrintStream syserr = System.err; 451 try { 452 System.setProperty("org.joda.time.DateTimeZone.Provider", "xxx"); 453 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 454 System.setErr(new PrintStream(baos)); 455 456 DateTimeZone.setProvider(null); 457 458 assertEquals(ZoneInfoProvider.class, DateTimeZone.getProvider().getClass()); 459 String str = new String(baos.toByteArray()); 460 assertTrue(str.indexOf("java.lang.ClassNotFoundException") >= 0); 461 } finally { 462 System.setErr(syserr); 463 System.getProperties().remove("org.joda.time.DateTimeZone.Provider"); 464 DateTimeZone.setProvider(null); 465 assertEquals(ZoneInfoProvider.class, DateTimeZone.getProvider().getClass()); 466 } 467 } 468 469 public void testProviderSecurity() { 470 if (OLD_JDK) { 471 return; 472 } 473 try { 474 Policy.setPolicy(RESTRICT); 475 System.setSecurityManager(new SecurityManager()); 476 DateTimeZone.setProvider(new MockOKProvider()); 477 fail(); 478 } catch (SecurityException ex) { 479 // ok 480 } finally { 481 System.setSecurityManager(null); 482 Policy.setPolicy(ALLOW); 483 } 484 } 485 486 static class MockNullIDSProvider implements Provider { 487 public Set getAvailableIDs() { 488 return null; 489 } 490 public DateTimeZone getZone(String id) { 491 return null; 492 } 493 } 494 static class MockEmptyIDSProvider implements Provider { 495 public Set getAvailableIDs() { 496 return new HashSet(); 497 } 498 public DateTimeZone getZone(String id) { 499 return null; 500 } 501 } 502 static class MockNoUTCProvider implements Provider { 503 public Set getAvailableIDs() { 504 Set set = new HashSet(); 505 set.add("Europe/London"); 506 return set; 507 } 508 public DateTimeZone getZone(String id) { 509 return null; 510 } 511 } 512 static class MockBadUTCProvider implements Provider { 513 public Set getAvailableIDs() { 514 Set set = new HashSet(); 515 set.add("UTC"); 516 set.add("Europe/London"); 517 return set; 518 } 519 public DateTimeZone getZone(String id) { 520 return null; 521 } 522 } 523 static class MockOKProvider implements Provider { 524 public Set getAvailableIDs() { 525 Set set = new HashSet(); 526 set.add("UTC"); 527 set.add("Europe/London"); 528 return set; 529 } 530 public DateTimeZone getZone(String id) { 531 return DateTimeZone.UTC; 532 } 533 } 534 535 //----------------------------------------------------------------------- 536 public void testNameProvider() { 537 try { 538 assertNotNull(DateTimeZone.getNameProvider()); 539 540 NameProvider provider = DateTimeZone.getNameProvider(); 541 DateTimeZone.setNameProvider(null); 542 assertEquals(provider.getClass(), DateTimeZone.getNameProvider().getClass()); 543 544 provider = new MockOKButNullNameProvider(); 545 DateTimeZone.setNameProvider(provider); 546 assertSame(provider, DateTimeZone.getNameProvider()); 547 548 assertEquals("+00:00", DateTimeZone.UTC.getShortName(TEST_TIME_SUMMER)); 549 assertEquals("+00:00", DateTimeZone.UTC.getName(TEST_TIME_SUMMER)); 550 } finally { 551 DateTimeZone.setNameProvider(null); 552 } 553 554 try { 555 System.setProperty("org.joda.time.DateTimeZone.NameProvider", "org.joda.time.tz.DefaultNameProvider"); 556 DateTimeZone.setNameProvider(null); 557 assertEquals(DefaultNameProvider.class, DateTimeZone.getNameProvider().getClass()); 558 } finally { 559 System.getProperties().remove("org.joda.time.DateTimeZone.NameProvider"); 560 DateTimeZone.setNameProvider(null); 561 assertEquals(DefaultNameProvider.class, DateTimeZone.getNameProvider().getClass()); 562 } 563 564 PrintStream syserr = System.err; 565 try { 566 System.setProperty("org.joda.time.DateTimeZone.NameProvider", "xxx"); 567 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 568 System.setErr(new PrintStream(baos)); 569 570 DateTimeZone.setNameProvider(null); 571 572 assertEquals(DefaultNameProvider.class, DateTimeZone.getNameProvider().getClass()); 573 String str = new String(baos.toByteArray()); 574 assertTrue(str.indexOf("java.lang.ClassNotFoundException") >= 0); 575 } finally { 576 System.setErr(syserr); 577 System.getProperties().remove("org.joda.time.DateTimeZone.NameProvider"); 578 DateTimeZone.setNameProvider(null); 579 assertEquals(DefaultNameProvider.class, DateTimeZone.getNameProvider().getClass()); 580 } 581 } 582 583 public void testNameProviderSecurity() { 584 if (OLD_JDK) { 585 return; 586 } 587 try { 588 Policy.setPolicy(RESTRICT); 589 System.setSecurityManager(new SecurityManager()); 590 DateTimeZone.setNameProvider(new MockOKButNullNameProvider()); 591 fail(); 592 } catch (SecurityException ex) { 593 // ok 594 } finally { 595 System.setSecurityManager(null); 596 Policy.setPolicy(ALLOW); 597 } 598 } 599 600 static class MockOKButNullNameProvider implements NameProvider { 601 public String getShortName(Locale locale, String id, String nameKey) { 602 return null; 603 } 604 public String getName(Locale locale, String id, String nameKey) { 605 return null; 606 } 607 } 608 609 //----------------------------------------------------------------------- 610 public void testConstructor() { 611 assertEquals(1, DateTimeZone.class.getDeclaredConstructors().length); 612 assertTrue(Modifier.isProtected(DateTimeZone.class.getDeclaredConstructors()[0].getModifiers())); 613 try { 614 new DateTimeZone(null) { 615 public String getNameKey(long instant) { 616 return null; 617 } 618 public int getOffset(long instant) { 619 return 0; 620 } 621 public int getStandardOffset(long instant) { 622 return 0; 623 } 624 public boolean isFixed() { 625 return false; 626 } 627 public long nextTransition(long instant) { 628 return 0; 629 } 630 public long previousTransition(long instant) { 631 return 0; 632 } 633 public boolean equals(Object object) { 634 return false; 635 } 636 }; 637 } catch (IllegalArgumentException ex) {} 638 } 639 640 //----------------------------------------------------------------------- 641 public void testGetID() { 642 DateTimeZone zone = DateTimeZone.forID("Europe/Paris"); 643 assertEquals("Europe/Paris", zone.getID()); 644 } 645 646 public void testGetNameKey() { 647 DateTimeZone zone = DateTimeZone.forID("Europe/London"); 648 assertEquals("BST", zone.getNameKey(TEST_TIME_SUMMER)); 649 assertEquals("GMT", zone.getNameKey(TEST_TIME_WINTER)); 650 } 651 652 static final boolean JDK6; 653 static { 654 boolean jdk6 = true; 655 try { 656 DateFormatSymbols.class.getMethod("getInstance", new Class[] {Locale.class}); 657 } catch (Exception ex) { 658 jdk6 = false; 659 } 660 JDK6 = jdk6; 661 } 662 663 public void testGetShortName() { 664 DateTimeZone zone = DateTimeZone.forID("Europe/London"); 665 assertEquals("BST", zone.getShortName(TEST_TIME_SUMMER)); 666 assertEquals("GMT", zone.getShortName(TEST_TIME_WINTER)); 667 assertEquals("BST", zone.getShortName(TEST_TIME_SUMMER, Locale.ENGLISH)); 668 } 669 670 public void testGetShortName_berlin() { 671 DateTimeZone berlin = DateTimeZone.forID("Europe/Berlin"); 672 assertEquals("CET", berlin.getShortName(TEST_TIME_WINTER, Locale.ENGLISH)); 673 assertEquals("CEST", berlin.getShortName(TEST_TIME_SUMMER, Locale.ENGLISH)); 674 if (JDK6) { 675 assertEquals("MEZ", berlin.getShortName(TEST_TIME_WINTER, Locale.GERMAN)); 676 assertEquals("MESZ", berlin.getShortName(TEST_TIME_SUMMER, Locale.GERMAN)); 677 } else { 678 assertEquals("CET", berlin.getShortName(TEST_TIME_WINTER, Locale.GERMAN)); 679 assertEquals("CEST", berlin.getShortName(TEST_TIME_SUMMER, Locale.GERMAN)); 680 } 681 } 682 683 public void testGetShortNameProviderName() { 684 assertEquals(null, DateTimeZone.getNameProvider().getShortName(null, "Europe/London", "BST")); 685 assertEquals(null, DateTimeZone.getNameProvider().getShortName(Locale.ENGLISH, null, "BST")); 686 assertEquals(null, DateTimeZone.getNameProvider().getShortName(Locale.ENGLISH, "Europe/London", null)); 687 assertEquals(null, DateTimeZone.getNameProvider().getShortName(null, null, null)); 688 } 689 690 public void testGetShortNameNullKey() { 691 DateTimeZone zone = new MockDateTimeZone("Europe/London"); 692 assertEquals("Europe/London", zone.getShortName(TEST_TIME_SUMMER, Locale.ENGLISH)); 693 } 694 695 public void testGetName() { 696 DateTimeZone zone = DateTimeZone.forID("Europe/London"); 697 assertEquals("British Summer Time", zone.getName(TEST_TIME_SUMMER)); 698 assertEquals("Greenwich Mean Time", zone.getName(TEST_TIME_WINTER)); 699 assertEquals("British Summer Time", zone.getName(TEST_TIME_SUMMER, Locale.ENGLISH)); 700 } 701 702 public void testGetName_berlin() { 703 DateTimeZone berlin = DateTimeZone.forID("Europe/Berlin"); 704 assertEquals("Central European Time", berlin.getName(TEST_TIME_WINTER, Locale.ENGLISH)); 705 assertEquals("Central European Summer Time", berlin.getName(TEST_TIME_SUMMER, Locale.ENGLISH)); 706 if (JDK6) { 707 assertEquals("Mitteleurop\u00e4ische Zeit", berlin.getName(TEST_TIME_WINTER, Locale.GERMAN)); 708 assertEquals("Mitteleurop\u00e4ische Sommerzeit", berlin.getName(TEST_TIME_SUMMER, Locale.GERMAN)); 709 } else { 710 assertEquals("Zentraleurop\u00e4ische Zeit", berlin.getName(TEST_TIME_WINTER, Locale.GERMAN)); 711 assertEquals("Zentraleurop\u00e4ische Sommerzeit", berlin.getName(TEST_TIME_SUMMER, Locale.GERMAN)); 712 } 713 } 714 715 public void testGetNameProviderName() { 716 assertEquals(null, DateTimeZone.getNameProvider().getName(null, "Europe/London", "BST")); 717 assertEquals(null, DateTimeZone.getNameProvider().getName(Locale.ENGLISH, null, "BST")); 718 assertEquals(null, DateTimeZone.getNameProvider().getName(Locale.ENGLISH, "Europe/London", null)); 719 assertEquals(null, DateTimeZone.getNameProvider().getName(null, null, null)); 720 } 721 722 public void testGetNameNullKey() { 723 DateTimeZone zone = new MockDateTimeZone("Europe/London"); 724 assertEquals("Europe/London", zone.getName(TEST_TIME_SUMMER, Locale.ENGLISH)); 725 } 726 727 static class MockDateTimeZone extends DateTimeZone { 728 public MockDateTimeZone(String id) { 729 super(id); 730 } 731 public String getNameKey(long instant) { 732 return null; // null 733 } 734 public int getOffset(long instant) { 735 return 0; 736 } 737 public int getStandardOffset(long instant) { 738 return 0; 739 } 740 public boolean isFixed() { 741 return false; 742 } 743 public long nextTransition(long instant) { 744 return 0; 745 } 746 public long previousTransition(long instant) { 747 return 0; 748 } 749 public boolean equals(Object object) { 750 return false; 751 } 752 } 753 754 //----------------------------------------------------------------------- 755 public void testGetOffset_long() { 756 DateTimeZone zone = DateTimeZone.forID("Europe/Paris"); 757 assertEquals(2L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffset(TEST_TIME_SUMMER)); 758 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffset(TEST_TIME_WINTER)); 759 760 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getStandardOffset(TEST_TIME_SUMMER)); 761 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getStandardOffset(TEST_TIME_WINTER)); 762 763 assertEquals(2L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffsetFromLocal(TEST_TIME_SUMMER)); 764 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffsetFromLocal(TEST_TIME_WINTER)); 765 766 assertEquals(false, zone.isStandardOffset(TEST_TIME_SUMMER)); 767 assertEquals(true, zone.isStandardOffset(TEST_TIME_WINTER)); 768 } 769 770 public void testGetOffset_RI() { 771 DateTimeZone zone = DateTimeZone.forID("Europe/Paris"); 772 assertEquals(2L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffset(new Instant(TEST_TIME_SUMMER))); 773 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffset(new Instant(TEST_TIME_WINTER))); 774 775 assertEquals(zone.getOffset(DateTimeUtils.currentTimeMillis()), zone.getOffset(null)); 776 } 777 778 public void testGetOffsetFixed() { 779 DateTimeZone zone = DateTimeZone.forID("+01:00"); 780 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffset(TEST_TIME_SUMMER)); 781 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffset(TEST_TIME_WINTER)); 782 783 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getStandardOffset(TEST_TIME_SUMMER)); 784 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getStandardOffset(TEST_TIME_WINTER)); 785 786 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffsetFromLocal(TEST_TIME_SUMMER)); 787 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffsetFromLocal(TEST_TIME_WINTER)); 788 789 assertEquals(true, zone.isStandardOffset(TEST_TIME_SUMMER)); 790 assertEquals(true, zone.isStandardOffset(TEST_TIME_WINTER)); 791 } 792 793 public void testGetOffsetFixed_RI() { 794 DateTimeZone zone = DateTimeZone.forID("+01:00"); 795 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffset(new Instant(TEST_TIME_SUMMER))); 796 assertEquals(1L * DateTimeConstants.MILLIS_PER_HOUR, zone.getOffset(new Instant(TEST_TIME_WINTER))); 797 798 assertEquals(zone.getOffset(DateTimeUtils.currentTimeMillis()), zone.getOffset(null)); 799 } 800 801 //----------------------------------------------------------------------- 802 public void testGetMillisKeepLocal() { 803 long millisLondon = TEST_TIME_SUMMER; 804 long millisParis = TEST_TIME_SUMMER - 1L * DateTimeConstants.MILLIS_PER_HOUR; 805 806 assertEquals(millisLondon, LONDON.getMillisKeepLocal(LONDON, millisLondon)); 807 assertEquals(millisParis, LONDON.getMillisKeepLocal(LONDON, millisParis)); 808 assertEquals(millisLondon, PARIS.getMillisKeepLocal(PARIS, millisLondon)); 809 assertEquals(millisParis, PARIS.getMillisKeepLocal(PARIS, millisParis)); 810 811 assertEquals(millisParis, LONDON.getMillisKeepLocal(PARIS, millisLondon)); 812 assertEquals(millisLondon, PARIS.getMillisKeepLocal(LONDON, millisParis)); 813 814 DateTimeZone zone = DateTimeZone.getDefault(); 815 try { 816 DateTimeZone.setDefault(LONDON); 817 assertEquals(millisLondon, PARIS.getMillisKeepLocal(null, millisParis)); 818 } finally { 819 DateTimeZone.setDefault(zone); 820 } 821 } 822 823 //----------------------------------------------------------------------- 824 public void testIsFixed() { 825 DateTimeZone zone = DateTimeZone.forID("Europe/Paris"); 826 assertEquals(false, zone.isFixed()); 827 assertEquals(true, DateTimeZone.UTC.isFixed()); 828 } 829 830 //----------------------------------------------------------------------- 831 public void testTransitionFixed() { 832 DateTimeZone zone = DateTimeZone.forID("+01:00"); 833 assertEquals(TEST_TIME_SUMMER, zone.nextTransition(TEST_TIME_SUMMER)); 834 assertEquals(TEST_TIME_WINTER, zone.nextTransition(TEST_TIME_WINTER)); 835 assertEquals(TEST_TIME_SUMMER, zone.previousTransition(TEST_TIME_SUMMER)); 836 assertEquals(TEST_TIME_WINTER, zone.previousTransition(TEST_TIME_WINTER)); 837 } 838 839 // //----------------------------------------------------------------------- 840 // public void testIsLocalDateTimeOverlap_Berlin() { 841 // DateTimeZone zone = DateTimeZone.forID("Europe/Berlin"); 842 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 10, 28, 1, 0))); 843 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 10, 28, 1, 59, 59, 99))); 844 // assertEquals(true, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 10, 28, 2, 0))); 845 // assertEquals(true, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 10, 28, 2, 30))); 846 // assertEquals(true, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 10, 28, 2, 59, 59, 99))); 847 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 10, 28, 3, 0))); 848 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 10, 28, 4, 0))); 849 // 850 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 3, 25, 1, 30))); // before gap 851 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 3, 25, 2, 30))); // gap 852 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 3, 25, 3, 30))); // after gap 853 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 12, 24, 12, 34))); 854 // } 855 // 856 // //----------------------------------------------------------------------- 857 // public void testIsLocalDateTimeOverlap_NewYork() { 858 // DateTimeZone zone = DateTimeZone.forID("America/New_York"); 859 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 11, 4, 0, 0))); 860 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 11, 4, 0, 59, 59, 99))); 861 // assertEquals(true, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 11, 4, 1, 0))); 862 // assertEquals(true, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 11, 4, 1, 30))); 863 // assertEquals(true, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 11, 4, 1, 59, 59, 99))); 864 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 11, 4, 2, 0))); 865 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 11, 4, 3, 0))); 866 // 867 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 3, 11, 1, 30))); // before gap 868 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 3, 11, 2, 30))); // gap 869 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 3, 11, 3, 30))); // after gap 870 // assertEquals(false, zone.isLocalDateTimeOverlap(new LocalDateTime(2007, 12, 24, 12, 34))); 871 // } 872 873 //----------------------------------------------------------------------- 874 public void testIsLocalDateTimeGap_Berlin() { 875 DateTimeZone zone = DateTimeZone.forID("Europe/Berlin"); 876 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 25, 1, 0))); 877 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 25, 1, 59, 59, 99))); 878 assertEquals(true, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 25, 2, 0))); 879 assertEquals(true, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 25, 2, 30))); 880 assertEquals(true, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 25, 2, 59, 59, 99))); 881 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 25, 3, 0))); 882 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 25, 4, 0))); 883 884 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 10, 28, 1, 30))); // before overlap 885 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 10, 28, 2, 30))); // overlap 886 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 10, 28, 3, 30))); // after overlap 887 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 12, 24, 12, 34))); 888 } 889 890 //----------------------------------------------------------------------- 891 public void testIsLocalDateTimeGap_NewYork() { 892 DateTimeZone zone = DateTimeZone.forID("America/New_York"); 893 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 11, 1, 0))); 894 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 11, 1, 59, 59, 99))); 895 assertEquals(true, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 11, 2, 0))); 896 assertEquals(true, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 11, 2, 30))); 897 assertEquals(true, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 11, 2, 59, 59, 99))); 898 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 11, 3, 0))); 899 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 3, 11, 4, 0))); 900 901 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 11, 4, 0, 30))); // before overlap 902 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 11, 4, 1, 30))); // overlap 903 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 11, 4, 2, 30))); // after overlap 904 assertEquals(false, zone.isLocalDateTimeGap(new LocalDateTime(2007, 12, 24, 12, 34))); 905 } 906 907 //----------------------------------------------------------------------- 908 public void testToTimeZone() { 909 DateTimeZone zone = DateTimeZone.forID("Europe/Paris"); 910 TimeZone tz = zone.toTimeZone(); 911 assertEquals("Europe/Paris", tz.getID()); 912 } 913 914 //----------------------------------------------------------------------- 915 public void testEqualsHashCode() { 916 DateTimeZone zone1 = DateTimeZone.forID("Europe/Paris"); 917 DateTimeZone zone2 = DateTimeZone.forID("Europe/Paris"); 918 assertEquals(true, zone1.equals(zone1)); 919 assertEquals(true, zone1.equals(zone2)); 920 assertEquals(true, zone2.equals(zone1)); 921 assertEquals(true, zone2.equals(zone2)); 922 assertEquals(true, zone1.hashCode() == zone2.hashCode()); 923 924 DateTimeZone zone3 = DateTimeZone.forID("Europe/London"); 925 assertEquals(true, zone3.equals(zone3)); 926 assertEquals(false, zone1.equals(zone3)); 927 assertEquals(false, zone2.equals(zone3)); 928 assertEquals(false, zone3.equals(zone1)); 929 assertEquals(false, zone3.equals(zone2)); 930 assertEquals(false, zone1.hashCode() == zone3.hashCode()); 931 assertEquals(true, zone3.hashCode() == zone3.hashCode()); 932 933 DateTimeZone zone4 = DateTimeZone.forID("+01:00"); 934 assertEquals(true, zone4.equals(zone4)); 935 assertEquals(false, zone1.equals(zone4)); 936 assertEquals(false, zone2.equals(zone4)); 937 assertEquals(false, zone3.equals(zone4)); 938 assertEquals(false, zone4.equals(zone1)); 939 assertEquals(false, zone4.equals(zone2)); 940 assertEquals(false, zone4.equals(zone3)); 941 assertEquals(false, zone1.hashCode() == zone4.hashCode()); 942 assertEquals(true, zone4.hashCode() == zone4.hashCode()); 943 944 DateTimeZone zone5 = DateTimeZone.forID("+02:00"); 945 assertEquals(true, zone5.equals(zone5)); 946 assertEquals(false, zone1.equals(zone5)); 947 assertEquals(false, zone2.equals(zone5)); 948 assertEquals(false, zone3.equals(zone5)); 949 assertEquals(false, zone4.equals(zone5)); 950 assertEquals(false, zone5.equals(zone1)); 951 assertEquals(false, zone5.equals(zone2)); 952 assertEquals(false, zone5.equals(zone3)); 953 assertEquals(false, zone5.equals(zone4)); 954 assertEquals(false, zone1.hashCode() == zone5.hashCode()); 955 assertEquals(true, zone5.hashCode() == zone5.hashCode()); 956 } 957 958 //----------------------------------------------------------------------- 959 public void testToString() { 960 DateTimeZone zone = DateTimeZone.forID("Europe/Paris"); 961 assertEquals("Europe/Paris", zone.toString()); 962 assertEquals("UTC", DateTimeZone.UTC.toString()); 963 } 964 965 //----------------------------------------------------------------------- 966 public void testSerialization1() throws Exception { 967 DateTimeZone zone = DateTimeZone.forID("Europe/Paris"); 968 969 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 970 ObjectOutputStream oos = new ObjectOutputStream(baos); 971 oos.writeObject(zone); 972 byte[] bytes = baos.toByteArray(); 973 oos.close(); 974 975 ByteArrayInputStream bais = new ByteArrayInputStream(bytes); 976 ObjectInputStream ois = new ObjectInputStream(bais); 977 DateTimeZone result = (DateTimeZone) ois.readObject(); 978 ois.close(); 979 980 assertSame(zone, result); 981 } 982 983 //----------------------------------------------------------------------- 984 public void testSerialization2() throws Exception { 985 DateTimeZone zone = DateTimeZone.forID("+01:00"); 986 987 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 988 ObjectOutputStream oos = new ObjectOutputStream(baos); 989 oos.writeObject(zone); 990 byte[] bytes = baos.toByteArray(); 991 oos.close(); 992 993 ByteArrayInputStream bais = new ByteArrayInputStream(bytes); 994 ObjectInputStream ois = new ObjectInputStream(bais); 995 DateTimeZone result = (DateTimeZone) ois.readObject(); 996 ois.close(); 997 998 assertSame(zone, result); 999 } 1000 1001 public void testCommentParse() throws Exception { 1002 // A bug in ZoneInfoCompiler's handling of comments broke Europe/Athens 1003 // after 1980. This test is included to make sure it doesn't break again. 1004 1005 DateTimeZone zone = DateTimeZone.forID("Europe/Athens"); 1006 DateTime dt = new DateTime(2005, 5, 5, 20, 10, 15, 0, zone); 1007 assertEquals(1115313015000L, dt.getMillis()); 1008 } 1009 1010 public void testPatchedNameKeysLondon() throws Exception { 1011 // the tz database does not have unique name keys [1716305] 1012 DateTimeZone zone = DateTimeZone.forID("Europe/London"); 1013 1014 DateTime now = new DateTime(2007, 1, 1, 0, 0, 0, 0); 1015 String str1 = zone.getName(now.getMillis()); 1016 String str2 = zone.getName(now.plusMonths(6).getMillis()); 1017 assertEquals(false, str1.equals(str2)); 1018 } 1019 1020 public void testPatchedNameKeysSydney() throws Exception { 1021 // the tz database does not have unique name keys [1716305] 1022 DateTimeZone zone = DateTimeZone.forID("Australia/Sydney"); 1023 1024 DateTime now = new DateTime(2007, 1, 1, 0, 0, 0, 0); 1025 String str1 = zone.getName(now.getMillis()); 1026 String str2 = zone.getName(now.plusMonths(6).getMillis()); 1027 assertEquals(false, str1.equals(str2)); 1028 } 1029 1030 public void testPatchedNameKeysSydneyHistoric() throws Exception { 1031 // the tz database does not have unique name keys [1716305] 1032 DateTimeZone zone = DateTimeZone.forID("Australia/Sydney"); 1033 1034 DateTime now = new DateTime(1996, 1, 1, 0, 0, 0, 0); 1035 String str1 = zone.getName(now.getMillis()); 1036 String str2 = zone.getName(now.plusMonths(6).getMillis()); 1037 assertEquals(false, str1.equals(str2)); 1038 } 1039 1040 public void testPatchedNameKeysGazaHistoric() throws Exception { 1041 // the tz database does not have unique name keys [1716305] 1042 DateTimeZone zone = DateTimeZone.forID("Africa/Johannesburg"); 1043 1044 DateTime now = new DateTime(1943, 1, 1, 0, 0, 0, 0); 1045 String str1 = zone.getName(now.getMillis()); 1046 String str2 = zone.getName(now.plusMonths(6).getMillis()); 1047 assertEquals(false, str1.equals(str2)); 1048 } 1049 1050 }