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);
}
}