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.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 ReviseOneTest
{
@Test
public void canEditOneRecurrence()
{
VCalendar mainVCalendar = new VCalendar();
VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1();
mainVCalendar.addChild(vComponentOriginal);
final List<VEvent> vComponents = mainVCalendar.getVEvents();
VEvent vComponentEdited = new VEvent(vComponentOriginal);
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.ONE)
.withEndRecurrence(endRecurrence)
.withStartOriginalRecurrence(startOriginalRecurrence)
.withStartRecurrence(startRecurrence)
.withVComponentCopyEdited(vComponentEdited)
.withVComponentOriginal(vComponentOriginal);
List<VCalendar> iTIPMessages = reviser.revise();
iTIPMessages.forEach(inputVCalendar -> mainVCalendar.processITIPMessage(inputVCalendar));
Collections.sort(vComponents, VPrimary.DTSTART_COMPARATOR);
// System.out.println("vComponents:" + vComponents.size());
// vComponents.forEach(System.out::println);
VEvent myComponentIndividual = vComponents.get(1);
String expectediTIPMessage =
"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() +
myComponentIndividual.getDateTimeStamp().toString() + 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";
String iTIPMessage = iTIPMessages.stream()
.map(v -> v.toString())
.collect(Collectors.joining(System.lineSeparator()));
assertEquals(expectediTIPMessage, iTIPMessage);
assertEquals(2, mainVCalendar.getVEvents().size());
// 2nd edit - edit component with RecurrenceID (individual)
VEvent vComponentEditedIndividual = new VEvent(myComponentIndividual);
VEvent vComponentIndividualCopy = new VEvent(myComponentIndividual);
vComponentEditedIndividual.setSummary("new summary");
Temporal startOriginalRecurrence2 = LocalDateTime.of(2016, 5, 16, 9, 0);
Temporal startRecurrence2 = LocalDateTime.of(2016, 5, 16, 12, 0);
Temporal endRecurrence2 = LocalDateTime.of(2016, 5, 16, 13, 0);
ReviserVEvent reviser2 = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentIndividualCopy))
.withDialogCallback((m) -> null) // no dialog required
.withEndRecurrence(endRecurrence2)
.withStartOriginalRecurrence(startOriginalRecurrence2)
.withStartRecurrence(startRecurrence2)
.withVComponentCopyEdited(vComponentEditedIndividual)
.withVComponentOriginal(vComponentIndividualCopy);
iTIPMessages = reviser2.revise();
iTIPMessages.forEach(inputVCalendar -> mainVCalendar.processITIPMessage(inputVCalendar));
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:20160516T120000" + System.lineSeparator() +
"DTEND:20160516T130000" + System.lineSeparator() +
"DESCRIPTION:Daily1 Description" + System.lineSeparator() +
"SUMMARY:new summary" + System.lineSeparator() +
vComponentEditedIndividual.getDateTimeStamp().toString() + 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:2" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
iTIPMessage = iTIPMessages.stream()
.map(v -> v.toString())
.collect(Collectors.joining(System.lineSeparator()));
assertEquals(expectediTIPMessage, iTIPMessage);
}
@Test
public void canChangeTimeBasedToWholeDayOne()
{
VCalendar mainVCalendar = new VCalendar();
VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1();
mainVCalendar.addChild(vComponentOriginal);
final List<VEvent> vComponents = mainVCalendar.getVEvents();
VEvent vComponentEdited = new VEvent(vComponentOriginal);
vComponentEdited.setSummary("Edited summary");
Temporal startOriginalRecurrence = LocalDateTime.of(2016, 5, 16, 10, 0);
Temporal startRecurrence = LocalDate.of(2016, 5, 16);
Temporal endRecurrence = LocalDate.of(2016, 5, 17);
ReviserVEvent reviser = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentOriginal))
.withDialogCallback((m) -> ChangeDialogOption.ONE)
.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 individualComponent = vComponents.get(1);
String expectediTIPMessage =
"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;VALUE=DATE:20160516" + System.lineSeparator() +
"DTEND;VALUE=DATE:20160517" + System.lineSeparator() +
"DESCRIPTION:Daily1 Description" + System.lineSeparator() +
"SUMMARY:Edited summary" + System.lineSeparator() +
individualComponent.getDateTimeStamp().toString() + 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";
String iTIPMessage = iTIPMessages.stream()
.map(v -> v.toString())
.collect(Collectors.joining(System.lineSeparator()));
assertEquals(expectediTIPMessage, iTIPMessage);
// check DTSTAMP
String dtstamp = iTIPMessage.split(System.lineSeparator())[10];
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
public void canChangeWholeDayToTimeBasedOne()
{
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, 10, 0);
Temporal endRecurrence = LocalDateTime.of(2016, 5, 16, 11, 0);
ReviserVEvent reviser = ((ReviserVEvent) SimpleRevisorFactory.newReviser(vComponentOriginal))
.withDialogCallback((m) -> ChangeDialogOption.ONE)
.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 individualComponent = vComponents.get(1);
String expectediTIPMessage =
"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() +
individualComponent.getDateTimeStamp().toString() + System.lineSeparator() +
"UID:20150110T080000-010@jfxtras.org" + System.lineSeparator() +
"DTSTART:20160516T100000" + System.lineSeparator() +
"ORGANIZER;CN=Issac Newton:mailto:isaac@greatscientists.org" + System.lineSeparator() +
"DTEND:20160516T110000" + System.lineSeparator() +
"SUMMARY:Edited summary" + System.lineSeparator() +
"RECURRENCE-ID;VALUE=DATE:20160516" + System.lineSeparator() +
"SEQUENCE:1" + 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())[6];
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
}
}