public void testTimeZoneHelperFromXVCalendarBoston() throws Exception {
    Property tz = new Property("TZ", "-05");
    List<Property> dayLightList = new ArrayList<Property>();
    dayLightList.add(new Property("DAYLIGHT", "TRUE;-04;20070311T020000;20071104T020000;;"));
    dayLightList.add(new Property("DAYLIGHT", "TRUE;-04;20080309T020000;20081102T020000;;"));
    dayLightList.add(new Property("DAYLIGHT", "TRUE;-04;20090308T020000;20091101T020000;;"));
    TimeZoneHelper vctz = new TimeZoneHelper(tz, dayLightList);
    List<TimeZoneTransition> transitions = vctz.getTransitions();

    assertEquals(6, transitions.size());
    assertEquals(-18000000, vctz.getBasicOffset());
    for (TimeZoneTransition transition : transitions) {
      assertEquals("", transition.getName());
    }
    assertEquals(-14400000, transitions.get(0).getOffset());
    assertEquals(1173596400000L, transitions.get(0).getTime());
    assertEquals(-18000000, transitions.get(1).getOffset());
    assertEquals(1194159600000L, transitions.get(1).getTime());
    assertEquals(-14400000, transitions.get(2).getOffset());
    assertEquals(1205046000000L, transitions.get(2).getTime());
    assertEquals(-18000000, transitions.get(3).getOffset());
    assertEquals(1225609200000L, transitions.get(3).getTime());
    assertEquals(-14400000, transitions.get(4).getOffset());
    assertEquals(1236495600000L, transitions.get(4).getTime());
    assertEquals(-18000000, transitions.get(5).getOffset());
    assertEquals(1257058800000L, transitions.get(5).getTime());

    assertEquals("America/New_York", vctz.toID()); // First run
    assertEquals("America/New_York", vctz.toID()); // Second run (cached)
  }
  public void testTimeZoneHelperFromICalendarBerlinUntil() throws Exception {

    VTimezone vtz = new VTimezone();
    vtz.addProperty("TZID", "Berlino"); // No hint
    TzStandardComponent standardC = new TzStandardComponent();
    standardC.addProperty("TZOFFSETFROM", "+0200");
    standardC.addProperty("TZOFFSETTO", "+0100");
    standardC.addProperty("TZNAME", "CET");
    standardC.addProperty("DTSTART", "19701025T030000");
    standardC.addProperty(
        "RRULE", "FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10;UNTIL=20091231T000113Z");
    TzDaylightComponent dayLightC = new TzDaylightComponent();
    dayLightC.addProperty("TZOFFSETFROM", "+0100");
    dayLightC.addProperty("TZOFFSETTO", "+0200");
    dayLightC.addProperty("TZNAME", "CEST");
    dayLightC.addProperty("DTSTART", "19700329T020000");
    dayLightC.addProperty(
        "RRULE", "FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3;UNTIL=20091231T000113Z");
    vtz.addStandardc(standardC);
    vtz.addDaylightc(dayLightC);

    TimeZoneHelper vctz =
        new TimeZoneHelper(
            vtz,
            1167609600000L, // 01 Jan 2007 @ 00:00:00 UTC
            1324771200000L); // 25 Dec 2011 @ 00:00:00 UTC
    List<TimeZoneTransition> transitions = vctz.getTransitions();

    assertEquals("Berlino", vctz.getName());
    assertEquals(6, transitions.size());
    assertEquals(3600000, vctz.getBasicOffset());
    boolean dst = true;
    for (TimeZoneTransition transition : transitions) {
      if (dst) {
        assertEquals("CEST", transition.getName());
      } else {
        assertEquals("CET", transition.getName());
      }
      dst = !dst;
    }
    assertEquals(7200000, transitions.get(0).getOffset());
    assertEquals(1174784400000L, transitions.get(0).getTime());
    assertEquals(3600000, transitions.get(1).getOffset());
    assertEquals(1193533200000L, transitions.get(1).getTime());
    assertEquals(7200000, transitions.get(2).getOffset());
    assertEquals(1206838800000L, transitions.get(2).getTime());
    assertEquals(3600000, transitions.get(3).getOffset());
    assertEquals(1224982800000L, transitions.get(3).getTime());
    assertEquals(7200000, transitions.get(4).getOffset());
    assertEquals(1238288400000L, transitions.get(4).getTime());
    assertEquals(3600000, transitions.get(5).getOffset());
    assertEquals(1256432400000L, transitions.get(5).getTime());

    assertEquals("Europe/Berlin", vctz.toID()); // First run
    assertEquals("Europe/Berlin", vctz.toID()); // Second run (cached)
  }
  public void testTimeZoneHelperFromOlsonIDBogota() {

    TimeZoneHelper vctz =
        new TimeZoneHelper(
            "America/Bogota",
            1167609600000L, // 01 Jan 2007 @ 00:00:00 UTC
            1349049600000L); // 01 Oct 2012 @ 00:00:00 UTC
    List<TimeZoneTransition> transitions = vctz.getTransitions();

    assertEquals("America/Bogota", vctz.toID());
    assertEquals(-18000000, vctz.getBasicOffset());
    assertEquals(0, transitions.size());
  }
  public void testTimeZoneHelperFromOlsonIDCanberra() {

    TimeZoneHelper vctz =
        new TimeZoneHelper(
            "Australia/Canberra",
            1167609600000L, // 01 Jan 2007 @ 00:00:00 UTC
            1349049600000L); // 01 Oct 2012 @ 00:00:00 UTC
    List<TimeZoneTransition> transitions = vctz.getTransitions();

    assertEquals("Australia/Canberra", vctz.toID());
    assertEquals(36000000, vctz.getBasicOffset());
    assertEquals("Australia/Canberra", transitions.get(0).getName());
    assertEquals(39600000, transitions.get(0).getOffset());
    assertEquals(1162051200000L, transitions.get(0).getTime());
    assertEquals("Australia/Canberra", transitions.get(1).getName());
    assertEquals(36000000, transitions.get(1).getOffset());
    assertEquals(1174752000000L, transitions.get(1).getTime());
  }
  public void testTimeZoneHelperFromOlsonIDRome() {

    TimeZoneHelper vctz =
        new TimeZoneHelper(
            "Europe/Rome",
            1167609600000L, // 01 Jan 2007 @ 00:00:00 UTC
            1349049600000L); // 01 Oct 2012 @ 00:00:00 UTC
    List<TimeZoneTransition> transitions = vctz.getTransitions();

    assertEquals("Europe/Rome", vctz.toID());
    assertEquals(3600000, vctz.getBasicOffset());
    assertEquals("Europe/Rome", transitions.get(0).getName());
    assertEquals(7200000, transitions.get(0).getOffset());
    assertEquals(1174784400000L, transitions.get(0).getTime());
    assertEquals("Europe/Rome", transitions.get(1).getName());
    assertEquals(3600000, transitions.get(1).getOffset());
    assertEquals(1193533200000L, transitions.get(1).getTime());
  }
  // --------------------------------------------------------------- Test cases
  public void testTimeZoneHelperFromXVCalendarRome() throws Exception {
    Property tz = new Property("TZ", "+01");
    List<Property> dayLightList = new ArrayList<Property>();
    dayLightList.add(new Property("DAYLIGHT", "TRUE;+02;20070325T010000Z;20071028T010000Z;;"));
    dayLightList.add(new Property("DAYLIGHT", "TRUE;+02;20080330T010000Z;20081026T010000Z;;"));
    dayLightList.add(new Property("DAYLIGHT", "TRUE;+02;20090329T010000Z;20091025T010000Z;;"));
    dayLightList.add(new Property("DAYLIGHT", "TRUE;+02;20100328T010000Z;20101031T010000Z;;"));
    dayLightList.add(new Property("DAYLIGHT", "TRUE;+02;20110327T010000Z;20111030T010000Z;;"));
    TimeZoneHelper vctz = new TimeZoneHelper(tz, dayLightList);
    List<TimeZoneTransition> transitions = vctz.getTransitions();

    assertEquals(10, transitions.size());
    assertEquals(3600000, vctz.getBasicOffset());
    for (TimeZoneTransition transition : transitions) {
      assertEquals("", transition.getName());
    }
    assertEquals(7200000, transitions.get(0).getOffset());
    assertEquals(1174784400000L, transitions.get(0).getTime());
    assertEquals(3600000, transitions.get(1).getOffset());
    assertEquals(1193533200000L, transitions.get(1).getTime());
    assertEquals(7200000, transitions.get(2).getOffset());
    assertEquals(1206838800000L, transitions.get(2).getTime());
    assertEquals(3600000, transitions.get(3).getOffset());
    assertEquals(1224982800000L, transitions.get(3).getTime());
    assertEquals(7200000, transitions.get(4).getOffset());
    assertEquals(1238288400000L, transitions.get(4).getTime());
    assertEquals(3600000, transitions.get(5).getOffset());
    assertEquals(1256432400000L, transitions.get(5).getTime());
    assertEquals(7200000, transitions.get(6).getOffset());
    assertEquals(1269738000000L, transitions.get(6).getTime());
    assertEquals(3600000, transitions.get(7).getOffset());
    assertEquals(1288486800000L, transitions.get(7).getTime());
    assertEquals(7200000, transitions.get(8).getOffset());
    assertEquals(1301187600000L, transitions.get(8).getTime());
    assertEquals(3600000, transitions.get(9).getOffset());
    assertEquals(1319936400000L, transitions.get(9).getTime());

    assertEquals("Europe/Berlin", vctz.toID()); // First run
    assertEquals("Europe/Berlin", vctz.toID()); // Second run (cached)
  }