package jfxtras.icalendarfx.itip;
import static org.junit.Assert.assertEquals;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import jfxtras.icalendarfx.ICalendarStaticComponents;
import jfxtras.icalendarfx.VCalendar;
import jfxtras.icalendarfx.components.VEvent;
import jfxtras.icalendarfx.properties.calendar.Version;
public class SimpleCancelTest
{
@Test // new DTSTART and SUMMARY
public void canProcessCancelIndividual()
{
String mainContent =
"BEGIN:VCALENDAR" + System.lineSeparator() +
"VERSION:2.0" + System.lineSeparator() +
"PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() +
"BEGIN:VEVENT" + System.lineSeparator() +
"ORGANIZER:mailto:a@example.com" + System.lineSeparator() +
"DTSTART:19970705T200000Z" + System.lineSeparator() +
"DTSTAMP:19970611T190000Z" + System.lineSeparator() +
"SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES" + System.lineSeparator() +
"UID:0981234-1234234-23@example.com" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
VCalendar main = VCalendar.parse(mainContent);
String publish =
"BEGIN:VCALENDAR" + System.lineSeparator() +
"METHOD:CANCEL" + System.lineSeparator() +
"PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() +
"VERSION:2.0" + System.lineSeparator() +
"BEGIN:VEVENT" + System.lineSeparator() +
"ORGANIZER:mailto:a@example.com" + System.lineSeparator() +
"COMMENT:DUKES forfeit the game" + System.lineSeparator() +
"SEQUENCE:2" + System.lineSeparator() +
"UID:0981234-1234234-23@example.com" + System.lineSeparator() +
"DTSTAMP:19970611T190000Z" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
VCalendar inputVCalendar = VCalendar.parse(publish);
List<String> log = main.processITIPMessage(inputVCalendar);
String expectedContent =
"BEGIN:VCALENDAR" + System.lineSeparator() +
"VERSION:2.0" + System.lineSeparator() +
"PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() +
"END:VCALENDAR";
assertEquals(expectedContent, main.toString());
}
@Test // use CANCEL for recurrence instance
public void canDeleteOneInstance()
{
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:CANCEL" + System.lineSeparator() +
"PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() +
"VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() +
"BEGIN:VEVENT" + System.lineSeparator() +
"CATEGORIES:group05" + System.lineSeparator() +
"DESCRIPTION:Daily1 Description" + System.lineSeparator() +
"SUMMARY:Daily1 Summary" + System.lineSeparator() +
"DTSTAMP:20150110T080000Z" + System.lineSeparator() +
"UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() +
"ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() +
"STATUS:CANCELLED" + System.lineSeparator() +
"RECURRENCE-ID:20160516T100000" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
mainVCalendar.processITIPMessage(iTIPMessage);
VEvent vComponentExpected = ICalendarStaticComponents.getDaily1()
.withExceptionDates(LocalDateTime.of(2016, 5, 16, 10, 0))
.withSequence(1);
assertEquals(1, vComponents.size());
assertEquals(vComponentExpected, vComponents.get(0));
}
@Test (expected = RuntimeException.class)
public void canDetectTooLowSequence()
{
VCalendar mainVCalendar = new VCalendar();
final List<VEvent> vComponents = mainVCalendar.getVEvents();
VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1()
.withSequence(2);
vComponents.add(vComponentOriginal);
String iTIPMessage =
"BEGIN:VCALENDAR" + System.lineSeparator() +
"METHOD:CANCEL" + System.lineSeparator() +
"PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() +
"VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() +
"BEGIN:VEVENT" + System.lineSeparator() +
"CATEGORIES:group05" + System.lineSeparator() +
"DESCRIPTION:Daily1 Description" + System.lineSeparator() +
"SUMMARY:Daily1 Summary" + System.lineSeparator() +
"DTSTAMP:20150110T080000Z" + System.lineSeparator() +
"UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() +
"ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() +
"SEQUENCE:1" + System.lineSeparator() +
"STATUS:CANCELLED" + System.lineSeparator() +
"RECURRENCE-ID:20160516T100000" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
mainVCalendar.processITIPMessage(iTIPMessage); // throws exception
}
@Test // use REQUEST with new EXDATE
public void canDeleteOneInstance2()
{
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:REQUEST" + 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: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" + System.lineSeparator() +
"ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() +
"EXDATE:20160516T100000" + System.lineSeparator() +
"SEQUENCE:1" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
mainVCalendar.processITIPMessage(iTIPMessage);
VEvent vComponentExpected = ICalendarStaticComponents.getDaily1()
.withExceptionDates(LocalDateTime.of(2016, 5, 16, 10, 0))
.withSequence(1);
assertEquals(1, vComponents.size());
assertEquals(vComponentExpected, vComponents.get(0));
}
@Test // use CANCEL to delete a second recurrence
public void canDeleteAnotherInstance()
{
VCalendar mainVCalendar = new VCalendar();
VEvent vComponentOriginal = ICalendarStaticComponents.getDaily1()
.withExceptionDates(LocalDateTime.of(2016, 5, 16, 10, 0))
.withSequence(1);
final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal));
mainVCalendar.setVEvents(vComponents);
String iTIPMessage =
"BEGIN:VCALENDAR" + System.lineSeparator() +
"METHOD:CANCEL" + System.lineSeparator() +
"PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() +
"VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() +
"BEGIN:VEVENT" + System.lineSeparator() +
"CATEGORIES:group05" + System.lineSeparator() +
"DESCRIPTION:Daily1 Description" + System.lineSeparator() +
"SUMMARY:Daily1 Summary" + System.lineSeparator() +
"DTSTAMP:20150110T080000Z" + System.lineSeparator() +
"UID:20150110T080000-004@jfxtras.org" + System.lineSeparator() +
"ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() +
"STATUS:CANCELLED" + System.lineSeparator() +
"RECURRENCE-ID:20160515T100000" + System.lineSeparator() +
"SEQUENCE:1" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
mainVCalendar.processITIPMessage(iTIPMessage);
VEvent vComponentExpected = ICalendarStaticComponents.getDaily1()
.withExceptionDates(LocalDateTime.of(2016, 5, 15, 10, 0), LocalDateTime.of(2016, 5, 16, 10, 0))
.withSequence(2);
assertEquals(1, vComponents.size());
assertEquals(vComponentExpected, vComponents.get(0));
}
@Test
public void canDeleteRepeatableAll()
{
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:CANCEL" + 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: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" + System.lineSeparator() +
"ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() +
"STATUS:CANCELLED" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
mainVCalendar.processITIPMessage(iTIPMessage);
assertEquals(0, vComponents.size());
}
@Test
public void canDeleteThisAndFuture()
{
VCalendar mainVCalendar = new VCalendar();
VEvent vComponentOriginal = ICalendarStaticComponents.getWeeklyZoned();
final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal));
mainVCalendar.setVEvents(vComponents);
String iTIPMessage =
"BEGIN:VCALENDAR" + System.lineSeparator() +
"METHOD:CANCEL" + System.lineSeparator() +
"PRODID:-//Example/ExampleCalendarClient//EN" + System.lineSeparator() +
"VERSION:" + Version.DEFAULT_ICALENDAR_SPECIFICATION_VERSION + System.lineSeparator() +
"BEGIN:VEVENT" + System.lineSeparator() +
"DTSTAMP:20151110T080000Z" + System.lineSeparator() +
"DESCRIPTION:WeeklyZoned Description" + System.lineSeparator() +
"SUMMARY:WeeklyZoned Summary" + System.lineSeparator() +
"ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() +
"UID:20150110T080000-003@jfxtras.org" + System.lineSeparator() +
"STATUS:CANCELLED" + System.lineSeparator() +
"RECURRENCE-ID;TZID=America/Los_Angeles;RANGE=THISANDFUTURE:20160516T100000" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
mainVCalendar.processITIPMessage(iTIPMessage);
VEvent vComponentExpected = ICalendarStaticComponents.getWeeklyZoned()
.withSequence(1);
vComponentExpected.getRecurrenceRule().getValue().setUntil("20160513T170000Z");
assertEquals(vComponentExpected, vComponents.get(0));
assertEquals(1, vComponents.size());
}
@Test // use request message
public void canDeleteThisAndFuture2()
{
VCalendar mainVCalendar = new VCalendar();
VEvent vComponentOriginal = ICalendarStaticComponents.getWeeklyZoned();
final List<VEvent> vComponents = new ArrayList<>(Arrays.asList(vComponentOriginal));
mainVCalendar.setVEvents(vComponents);
assertEquals(1, vComponents.size());
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() +
"DTEND;TZID=America/Los_Angeles:20151109T104500" + System.lineSeparator() +
"DTSTAMP:20151110T080000Z" + System.lineSeparator() +
"DTSTART;TZID=America/Los_Angeles:20151109T100000" + System.lineSeparator() +
"DESCRIPTION:WeeklyZoned Description" + System.lineSeparator() +
"RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20160513T170000Z" + System.lineSeparator() +
"SUMMARY:WeeklyZoned Summary" + System.lineSeparator() +
"ORGANIZER;CN=Papa Smurf:mailto:papa@smurf.org" + System.lineSeparator() +
"UID:20150110T080000-003@jfxtras.org" + System.lineSeparator() +
"SEQUENCE:1" + System.lineSeparator() +
"END:VEVENT" + System.lineSeparator() +
"END:VCALENDAR";
mainVCalendar.processITIPMessage(iTIPMessage);
VEvent vComponentExpected = ICalendarStaticComponents.getWeeklyZoned()
.withSequence(1);
vComponentExpected.getRecurrenceRule().getValue().setUntil("20160513T170000Z");
assertEquals(vComponentExpected, vComponents.get(0));
assertEquals(1, vComponents.size());
}
}