package jfxtras.icalendarfx.itip; import static org.junit.Assert.assertEquals; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Test; import jfxtras.icalendarfx.ICalendarStaticComponents; import jfxtras.icalendarfx.VCalendar; import jfxtras.icalendarfx.components.VEvent; import jfxtras.icalendarfx.components.VPrimary; import jfxtras.icalendarfx.properties.calendar.Version; import jfxtras.icalendarfx.properties.component.change.DateTimeStamp; import jfxtras.icalendarfx.properties.component.recurrence.RecurrenceRule; import jfxtras.icalendarfx.properties.component.recurrence.rrule.RecurrenceRuleValue; import jfxtras.icalendarfx.properties.component.relationship.RelatedTo; import jfxtras.icalendarfx.properties.component.relationship.UniqueIdentifier; public class WholeDayTest { @Test public void canChangeToWholeDayAll() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART;VALUE=DATE:20151108" + System.lineSeparator() + "DTEND;VALUE=DATE:20151109" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Edited summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); assertEquals(1, vComponents.size()); VEvent myComponent = vComponents.get(0); assertEquals(LocalDate.of(2015, 11, 8), myComponent.getDateTimeStart().getValue()); assertEquals(LocalDate.of(2015, 11, 9), myComponent.getDateTimeEnd().getValue()); assertEquals("Edited summary", myComponent.getSummary().getValue()); } @Test public void canChangOneWholeDayToTimeBased() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART;VALUE=DATE:20160516" + System.lineSeparator() + "DTEND;VALUE=DATE:20160517" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Edited summary" + System.lineSeparator() + "DTSTAMP:20160914T180627Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "RECURRENCE-ID:20160516T100000" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); assertEquals(2, vComponents.size()); // TODO - CHECK COMPONENTS } @Test public void canChangeWholeDayToTimeBasedThisAndFuture() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getWholeDayDaily1(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group06" + System.lineSeparator() + "DTSTAMP:20160914T200517Z" + System.lineSeparator() + "UID:20160914T130517-0jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY" + System.lineSeparator() + "DTSTART:20160516T090000" + System.lineSeparator() + "ORGANIZER;CN=Issac Newton:mailto:isaac@greatscientists.org" + System.lineSeparator() + "DTEND:20160516T100000" + System.lineSeparator() + "SUMMARY:Edited summary" + System.lineSeparator() + "RELATED-TO:20150110T080000-010@jfxtras.org" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group06" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-010@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY;UNTIL=20160515" + System.lineSeparator() + "DTSTART;VALUE=DATE:20151108" + System.lineSeparator() + "ORGANIZER;CN=Issac Newton:mailto:isaac@greatscientists.org" + System.lineSeparator() + "DTEND;VALUE=DATE:20151109" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); assertEquals(2, vComponents.size()); Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR); VEvent newVComponentOriginal = vComponents.get(0); VEvent newVComponentFuture = vComponents.get(1); VEvent expectedVComponentOriginal = ICalendarStaticComponents.getWholeDayDaily1(); RecurrenceRuleValue rrule = expectedVComponentOriginal.getRecurrenceRule().getValue(); rrule.setUntil(LocalDate.of(2016, 5, 15)); assertEquals(expectedVComponentOriginal, newVComponentOriginal); VEvent expectedVComponentFuture = ICalendarStaticComponents.getWholeDayDaily1(); expectedVComponentFuture.setDateTimeStart(LocalDateTime.of(2016, 5, 16, 9, 0)); expectedVComponentFuture.setDateTimeEnd(LocalDateTime.of(2016, 5, 16, 10, 0)); expectedVComponentFuture.setUniqueIdentifier(new UniqueIdentifier(newVComponentFuture.getUniqueIdentifier())); expectedVComponentFuture.setDateTimeStamp(new DateTimeStamp(newVComponentFuture.getDateTimeStamp())); expectedVComponentFuture.setSummary("Edited summary"); expectedVComponentFuture.withRelatedTo(vComponentOriginal.getUniqueIdentifier().getValue()); expectedVComponentFuture.setSequence(1); assertEquals(expectedVComponentFuture, newVComponentFuture); } @Test // with a recurrence in between new date range, from whole-day to time-based - special recurrence stays unmodified. public void canEditWholeDayToTimeBasedThisAndFutureIgnoreRecurrence() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getWholeDayDaily1(); final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal)); mainVCalendar.setVEvents(vComponents); VEvent vComponentEdited = new VEvent(vComponentOriginal); // make recurrence VEvent vComponentRecurrence = ICalendarStaticComponents.getWholeDayDaily1(); vComponentRecurrence.setRecurrenceRule((RecurrenceRuleValue) null); vComponentRecurrence.setRecurrenceId(LocalDate.of(2016, 5, 17)); vComponentRecurrence.setSummary("recurrence summary"); vComponentRecurrence.setDateTimeStart(ZonedDateTime.of(LocalDateTime.of(2016, 5, 17, 8, 30), ZoneId.of("Europe/London"))); vComponentRecurrence.setDateTimeEnd(ZonedDateTime.of(LocalDateTime.of(2016, 5, 17, 9, 30), ZoneId.of("Europe/London"))); mainVCalendar.addChild(vComponentRecurrence); String iTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group06" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-010@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY;UNTIL=20160514" + System.lineSeparator() + "DTSTART;VALUE=DATE:20151108" + System.lineSeparator() + "ORGANIZER;CN=Issac Newton:mailto:isaac@greatscientists.org" + System.lineSeparator() + "DTEND;VALUE=DATE:20151109" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR" + System.lineSeparator() + "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group06" + System.lineSeparator() + "DTSTAMP:20160914T200517Z" + System.lineSeparator() + "UID:20160914T130517-0jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY" + System.lineSeparator() + "DTSTART;TZID=Europe/London:20160515T090000" + System.lineSeparator() + "ORGANIZER;CN=Issac Newton:mailto:isaac@greatscientists.org" + System.lineSeparator() + "DTEND;TZID=Europe/London:20160515T103000" + System.lineSeparator() + "SUMMARY:Edited summary" + System.lineSeparator() + "RELATED-TO:20150110T080000-010@jfxtras.org" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group06" + System.lineSeparator() + "DTSTAMP:20160914T200517Z" + System.lineSeparator() + "UID:20160914T130517-0jfxtras.org" + System.lineSeparator() + "DTSTART;TZID=Europe/London:20160517T083000" + System.lineSeparator() + "ORGANIZER;CN=Issac Newton:mailto:isaac@greatscientists.org" + System.lineSeparator() + "DTEND;TZID=Europe/London:20160517T093000" + System.lineSeparator() + "RECURRENCE-ID;TZID=Europe/London:20160517T090000" + System.lineSeparator() + "SUMMARY:recurrence summary" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; mainVCalendar.processITIPMessage(iTIPMessage); assertEquals(3, vComponents.size()); Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR); VEvent myComponentOriginal = vComponents.get(0); VEvent newVComponentFuture = vComponents.get(1); VEvent myComponentRecurrence = vComponents.get(2); VEvent expectedOriginalEdited = ICalendarStaticComponents.getWholeDayDaily1() .withSequence(1); expectedOriginalEdited.getRecurrenceRule().getValue() .setUntil(LocalDate.of(2016, 5, 14)); assertEquals(expectedOriginalEdited, myComponentOriginal); RelatedTo relatedTo = RelatedTo.parse(vComponentEdited.getUniqueIdentifier().getValue()); VEvent expectedComponentFuture = ICalendarStaticComponents.getWholeDayDaily1() .withDateTimeStart(ZonedDateTime.of(LocalDateTime.of(2016, 5, 15, 9, 0), ZoneId.of("Europe/London"))) .withDateTimeEnd(ZonedDateTime.of(LocalDateTime.of(2016, 5, 15, 10, 30), ZoneId.of("Europe/London"))) .withSummary("Edited summary") .withRelatedTo(Arrays.asList(relatedTo)) .withUniqueIdentifier(new UniqueIdentifier(newVComponentFuture.getUniqueIdentifier())) .withDateTimeStamp(new DateTimeStamp(newVComponentFuture.getDateTimeStamp())); VEvent expectedvComponentRecurrence = ICalendarStaticComponents.getWholeDayDaily1() .withRecurrenceRule((RecurrenceRule) null) .withRecurrenceId(ZonedDateTime.of(LocalDateTime.of(2016, 5, 17, 9, 0), ZoneId.of("Europe/London"))) .withSummary("recurrence summary") .withDateTimeStart(ZonedDateTime.of(LocalDateTime.of(2016, 5, 17, 8, 30), ZoneId.of("Europe/London"))) .withDateTimeEnd(ZonedDateTime.of(LocalDateTime.of(2016, 5, 17, 9, 30), ZoneId.of("Europe/London"))) .withUniqueIdentifier(new UniqueIdentifier(expectedComponentFuture.getUniqueIdentifier())) .withDateTimeStamp(new DateTimeStamp(expectedComponentFuture.getDateTimeStamp())); assertEquals(expectedvComponentRecurrence, myComponentRecurrence); } }