package jfxtras.scene.control.agenda.icalendar.editors.revisor; import static org.junit.Assert.assertEquals; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.temporal.Temporal; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import org.junit.Test; 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.rrule.RecurrenceRuleValue; import jfxtras.scene.control.agenda.icalendar.ICalendarAgenda; import jfxtras.scene.control.agenda.icalendar.ICalendarStaticComponents; import jfxtras.scene.control.agenda.icalendar.editors.ChangeDialogOption; import jfxtras.scene.control.agenda.icalendar.editors.revisors.ReviserVEvent; import jfxtras.scene.control.agenda.icalendar.editors.revisors.SimpleRevisorFactory; public class ReviseThisAndFutureTest { @Test // change date and time public void canEditThisAndFuture() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); mainVCalendar.addChild(vComponentOriginal); final List<VEvent> vComponents = mainVCalendar.getVEvents(); VEvent vComponentEdited = new VEvent(vComponentOriginal); // make changes vComponentEdited.setSummary("Edited summary"); Temporal startOriginalRecurrence = LocalDateTime.of(2016, 5, 16, 10, 0); Temporal startRecurrence = LocalDateTime.of(2016, 5, 16, 9, 0); Temporal endRecurrence = LocalDateTime.of(2016, 5, 16, 10, 30); ReviserVEvent reviser = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentEdited)) .withDialogCallback((m) -> ChangeDialogOption.THIS_AND_FUTURE) .withEndRecurrence(endRecurrence) .withStartOriginalRecurrence(startOriginalRecurrence) .withStartRecurrence(startRecurrence) .withVComponentCopyEdited(vComponentEdited) .withVComponentOriginal(vComponentOriginal); List<VCalendar> iTIPMessages = reviser.revise(); iTIPMessages.forEach(message -> mainVCalendar.processITIPMessage(message)); Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR); VEvent myComponentFuture = vComponents.get(1); String expectediTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20151109T100000" + System.lineSeparator() + "DTEND:20151109T110000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY;UNTIL=20160515T170000Z" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR" + System.lineSeparator() + "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20160516T090000" + System.lineSeparator() + "DTEND:20160516T103000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Edited summary" + System.lineSeparator() + myComponentFuture.getDateTimeStamp().toString() + System.lineSeparator() + myComponentFuture.getUniqueIdentifier().toString() + System.lineSeparator() + "RRULE:FREQ=DAILY" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "RELATED-TO:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; String iTIPMessage = iTIPMessages.stream() .map(v -> v.toString()) .collect(Collectors.joining(System.lineSeparator())); assertEquals(expectediTIPMessage, iTIPMessage); // check DTSTAMP String dtstamp = iTIPMessage.split(System.lineSeparator())[27]; String expectedDTStamp = new DateTimeStamp(ZonedDateTime.now().withZoneSameInstant(ZoneId.of("Z"))).toString(); assertEquals(expectedDTStamp.substring(0, 16), dtstamp.substring(0, 16)); // check date, month and time } @Test // with a recurrence in between new date range - remove special recurrence, replaces with normal recurrence public void canEditThisAndFutureWithRecurrence() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); mainVCalendar.addChild(vComponentOriginal); final List<VEvent> vComponents = mainVCalendar.getVEvents(); VEvent vComponentEdited = new VEvent(vComponentOriginal); // make recurrence VEvent vComponentRecurrence = ICalendarStaticComponents.getDaily1() .withRecurrenceRule((RecurrenceRuleValue) null) .withRecurrenceId(LocalDateTime.of(2016, 5, 17, 10, 0)) .withSummary("recurrence summary") .withDateTimeStart(LocalDateTime.of(2016, 5, 17, 8, 30)) .withDateTimeEnd(LocalDateTime.of(2016, 5, 17, 9, 30)); vComponents.add(vComponentRecurrence); // make changes vComponentEdited.setSummary("Edited summary"); Temporal startOriginalRecurrence = LocalDateTime.of(2016, 5, 16, 10, 0); Temporal startRecurrence = LocalDateTime.of(2016, 5, 16, 9, 0); Temporal endRecurrence = LocalDateTime.of(2016, 5, 16, 10, 30); ReviserVEvent reviser = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentEdited)) .withDialogCallback((m) -> ChangeDialogOption.THIS_AND_FUTURE) .withEndRecurrence(endRecurrence) .withStartOriginalRecurrence(startOriginalRecurrence) .withStartRecurrence(startRecurrence) .withVComponentCopyEdited(vComponentEdited) .withVComponentOriginal(vComponentOriginal); List<VCalendar> iTIPMessages = reviser.revise(); String iTIPMessage = iTIPMessages.stream() .map(v -> v.toString()) .collect(Collectors.joining(System.lineSeparator())); iTIPMessages.forEach(inputVCalendar -> mainVCalendar.processITIPMessage(inputVCalendar)); Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR); VEvent newVComponentFuture = vComponents.get(1); String expectediTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20151109T100000" + System.lineSeparator() + "DTEND:20151109T110000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY;UNTIL=20160515T170000Z" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR" + System.lineSeparator() + "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20160516T090000" + System.lineSeparator() + "DTEND:20160516T103000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Edited summary" + System.lineSeparator() + newVComponentFuture.getDateTimeStamp().toString() + System.lineSeparator() + newVComponentFuture.getUniqueIdentifier().toString() + System.lineSeparator() + "RRULE:FREQ=DAILY" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "RELATED-TO:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; assertEquals(expectediTIPMessage, iTIPMessage); // check DTSTAMP String dtstamp = iTIPMessage.split(System.lineSeparator())[27]; String expectedDTStamp = new DateTimeStamp(ZonedDateTime.now().withZoneSameInstant(ZoneId.of("Z"))).toString(); assertEquals(expectedDTStamp.substring(0, 16), dtstamp.substring(0, 16)); // check date, month and time } @Test // with a recurrence in between new date range - special recurrence stays unmodified. // @Ignore // TestFX4 public void canEditThisAndFutureAllIgnoreRecurrence() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); mainVCalendar.addChild(vComponentOriginal); final List<VEvent> vComponents = mainVCalendar.getVEvents(); VEvent vComponentEdited = new VEvent(vComponentOriginal); // make recurrence before VEvent vComponentRecurrenceBefore = ICalendarStaticComponents.getDaily1() .withRecurrenceRule((RecurrenceRuleValue) null) .withRecurrenceId(LocalDateTime.of(2015, 12, 25, 10, 0)) .withSummary("recurrence summary before") .withDateTimeStart(LocalDateTime.of(2015, 12, 26, 0, 30)) .withDateTimeEnd(LocalDateTime.of(2015, 12, 26, 2, 30)); vComponents.add(vComponentRecurrenceBefore); // make recurrence after VEvent vComponentRecurrenceAfter = ICalendarStaticComponents.getDaily1() .withRecurrenceRule((RecurrenceRuleValue) null) .withRecurrenceId(LocalDateTime.of(2016, 5, 17, 10, 0)) .withSummary("recurrence summary after") .withDateTimeStart(LocalDateTime.of(2016, 5, 17, 8, 30)) .withDateTimeEnd(LocalDateTime.of(2016, 5, 17, 9, 30)); vComponents.add(vComponentRecurrenceAfter); // make changes vComponentEdited.setSummary("Edited summary"); Temporal startOriginalRecurrence = LocalDateTime.of(2016, 5, 16, 10, 0); Temporal startRecurrence = LocalDateTime.of(2016, 5, 16, 9, 0); Temporal endRecurrence = LocalDateTime.of(2016, 5, 16, 10, 30); ReviserVEvent reviser = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentEdited)) .withDialogCallback((m) -> ChangeDialogOption.THIS_AND_FUTURE_IGNORE_RECURRENCES) .withEndRecurrence(endRecurrence) .withStartOriginalRecurrence(startOriginalRecurrence) .withStartRecurrence(startRecurrence) .withVComponentCopyEdited(vComponentEdited) .withVComponentOriginal(vComponentOriginal); List<VCalendar> iTIPMessages = reviser.revise(); String iTIPMessage = iTIPMessages.stream() .map(v -> v.toString()) .collect(Collectors.joining(System.lineSeparator())); iTIPMessages.forEach(inputVCalendar -> mainVCalendar.processITIPMessage(inputVCalendar)); Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR); VEvent newVComponentFuture = vComponents.get(2); String expectediTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20151109T100000" + System.lineSeparator() + "DTEND:20151109T110000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY;UNTIL=20160515T170000Z" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR" + System.lineSeparator() + "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20160516T090000" + System.lineSeparator() + "DTEND:20160516T103000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Edited summary" + System.lineSeparator() + newVComponentFuture.getDateTimeStamp().toString() + System.lineSeparator() + newVComponentFuture.getUniqueIdentifier().toString() + System.lineSeparator() + "RRULE:FREQ=DAILY" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "RELATED-TO:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20160517T083000" + System.lineSeparator() + "DTEND:20160517T093000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:recurrence summary after" + System.lineSeparator() + newVComponentFuture.getDateTimeStamp().toString() + System.lineSeparator() + newVComponentFuture.getUniqueIdentifier().toString() + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "RECURRENCE-ID:20160517T090000" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; assertEquals(expectediTIPMessage, iTIPMessage); // check DTSTAMP String dtstamp = iTIPMessage.split(System.lineSeparator())[27]; String dtstamp2 = iTIPMessage.split(System.lineSeparator())[39]; String expectedDTStamp = new DateTimeStamp(ZonedDateTime.now().withZoneSameInstant(ZoneId.of("Z"))).toString(); assertEquals(expectedDTStamp.substring(0, 16), dtstamp.substring(0, 16)); // check date, month and time assertEquals(expectedDTStamp.substring(0, 16), dtstamp2.substring(0, 16)); // check date, month and time } @Test public void canChangeWholeDayToTimeBasedThisAndFuture() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getWholeDayDaily1(); mainVCalendar.addChild(vComponentOriginal); final List<VEvent> vComponents = mainVCalendar.getVEvents(); VEvent vComponentEdited = new VEvent(vComponentOriginal); vComponentEdited.setSummary("Edited summary"); Temporal startOriginalRecurrence = LocalDate.of(2016, 5, 16); Temporal startRecurrence = LocalDateTime.of(2016, 5, 16, 9, 0); Temporal endRecurrence = LocalDateTime.of(2016, 5, 16, 10, 0); ReviserVEvent reviser = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentOriginal)) .withDialogCallback((m) -> ChangeDialogOption.THIS_AND_FUTURE) .withEndRecurrence(endRecurrence) .withStartOriginalRecurrence(startOriginalRecurrence) .withStartRecurrence(startRecurrence) .withVComponentCopyEdited(vComponentEdited) .withVComponentOriginal(vComponentOriginal); List<VCalendar> iTIPMessages = reviser.revise(); iTIPMessages.forEach(inputVCalendar -> mainVCalendar.processITIPMessage(inputVCalendar)); assertEquals(2, vComponents.size()); Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR); VEvent newVComponentFuture = vComponents.get(1); String expectediTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + 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=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() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR" + System.lineSeparator() + "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group06" + System.lineSeparator() + newVComponentFuture.getDateTimeStamp().toString() + System.lineSeparator() + newVComponentFuture.getUniqueIdentifier().toString() + 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() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR"; String iTIPMessage = iTIPMessages.stream() .map(v -> v.toString()) .collect(Collectors.joining(System.lineSeparator())); assertEquals(expectediTIPMessage, iTIPMessage); // check DTSTAMP String dtstamp = iTIPMessage.split(System.lineSeparator())[21]; String expectedDTStamp = new DateTimeStamp(ZonedDateTime.now().withZoneSameInstant(ZoneId.of("Z"))).toString(); assertEquals(expectedDTStamp.substring(0, 16), dtstamp.substring(0, 16)); // check date, month and time } @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(); mainVCalendar.addChild(vComponentOriginal); final List<VEvent> vComponents = mainVCalendar.getVEvents(); 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"))); vComponents.add(vComponentRecurrence); // make changes vComponentEdited.setSummary("Edited summary"); Temporal startOriginalRecurrence = LocalDate.of(2016, 5, 15); Temporal startRecurrence = ZonedDateTime.of(LocalDateTime.of(2016, 5, 15, 9, 0), ZoneId.of("Europe/London")); Temporal endRecurrence = ZonedDateTime.of(LocalDateTime.of(2016, 5, 15, 10, 30), ZoneId.of("Europe/London")); ReviserVEvent reviser = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentEdited)) .withDialogCallback((m) -> ChangeDialogOption.THIS_AND_FUTURE_IGNORE_RECURRENCES) .withEndRecurrence(endRecurrence) .withStartOriginalRecurrence(startOriginalRecurrence) .withStartRecurrence(startRecurrence) .withVComponentCopyEdited(vComponentEdited) .withVComponentOriginal(vComponentOriginal); List<VCalendar> iTIPMessages = reviser.revise(); String iTIPMessage = iTIPMessages.stream() .map(v -> v.toString()) .collect(Collectors.joining(System.lineSeparator())); mainVCalendar.processITIPMessage(iTIPMessage); assertEquals(3, vComponents.size()); Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR); VEvent newVComponentFuture = vComponents.get(1); VEvent newVComponentRecurrence = vComponents.get(2); String expectediTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + 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:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group06" + System.lineSeparator() + newVComponentFuture.getDateTimeStamp().toString() + System.lineSeparator() + newVComponentFuture.getUniqueIdentifier().toString() + 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() + newVComponentRecurrence.getDateTimeStamp().toString() + System.lineSeparator() + newVComponentRecurrence.getUniqueIdentifier().toString() + 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"; assertEquals(expectediTIPMessage, iTIPMessage); // check DTSTAMP String dtstamp = iTIPMessage.split(System.lineSeparator())[21]; String dtstamp2 = iTIPMessage.split(System.lineSeparator())[32]; String expectedDTStamp = new DateTimeStamp(ZonedDateTime.now().withZoneSameInstant(ZoneId.of("Z"))).toString(); assertEquals(expectedDTStamp.substring(0, 16), dtstamp.substring(0, 16)); // check date, month and time assertEquals(expectedDTStamp.substring(0, 16), dtstamp2.substring(0, 16)); // check date, month and time } @Test // change INTERVAL // @Ignore // TestFX4 public void canEditThisAndFuture2() { VCalendar mainVCalendar = new VCalendar(); VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1(); mainVCalendar.addChild(vComponentOriginal); final List<VEvent> vComponents = mainVCalendar.getVEvents(); VEvent vComponentEdited = new VEvent(vComponentOriginal); // make changes vComponentEdited.setSummary("Edited summary"); vComponentEdited.getRecurrenceRule().getValue().setInterval(2); Temporal startOriginalRecurrence = LocalDateTime.of(2016, 5, 16, 10, 0); Temporal startRecurrence = LocalDateTime.of(2016, 5, 16, 9, 0); Temporal endRecurrence = LocalDateTime.of(2016, 5, 16, 10, 30); ReviserVEvent reviser = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentEdited)) .withDialogCallback((m) -> ChangeDialogOption.THIS_AND_FUTURE) .withEndRecurrence(endRecurrence) .withStartOriginalRecurrence(startOriginalRecurrence) .withStartRecurrence(startRecurrence) .withVComponentCopyEdited(vComponentEdited) .withVComponentOriginal(vComponentOriginal); List<VCalendar> iTIPMessages = reviser.revise(); iTIPMessages.forEach(message -> mainVCalendar.processITIPMessage(message)); Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR); VEvent myComponentFuture = vComponents.get(1); String iTIPMessage = iTIPMessages.stream() .map(v -> v.toString()) .collect(Collectors.joining(System.lineSeparator())); String expectediTIPMessage = "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:REQUEST" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20151109T100000" + System.lineSeparator() + "DTEND:20151109T110000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Daily1 Summary" + System.lineSeparator() + "DTSTAMP:20150110T080000Z" + System.lineSeparator() + "UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "RRULE:FREQ=DAILY;UNTIL=20160515T170000Z" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "SEQUENCE:1" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR" + System.lineSeparator() + "BEGIN:VCALENDAR" + System.lineSeparator() + "METHOD:PUBLISH" + System.lineSeparator() + "PRODID:" + ICalendarAgenda.DEFAULT_PRODUCT_IDENTIFIER + System.lineSeparator() + "VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() + "BEGIN:VEVENT" + System.lineSeparator() + "CATEGORIES:group05" + System.lineSeparator() + "DTSTART:20160516T090000" + System.lineSeparator() + "DTEND:20160516T103000" + System.lineSeparator() + "DESCRIPTION:Daily1 Description" + System.lineSeparator() + "SUMMARY:Edited summary" + System.lineSeparator() + myComponentFuture.getDateTimeStamp().toString() + System.lineSeparator() + myComponentFuture.getUniqueIdentifier().toString() + System.lineSeparator() + "RRULE:FREQ=DAILY;INTERVAL=2" + System.lineSeparator() + "ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() + "RELATED-TO:20150110T080000-004@jfxtras.org" + System.lineSeparator() + "END:VEVENT" + System.lineSeparator() + "END:VCALENDAR" ; assertEquals(expectediTIPMessage, iTIPMessage); } }