package jfxtras.icalendarfx.component;
import static org.junit.Assert.assertEquals;
import java.time.Duration;
import org.junit.Test;
import jfxtras.icalendarfx.ICalendarTestAbstract;
import jfxtras.icalendarfx.components.VAlarm;
import jfxtras.icalendarfx.components.VComponent;
import jfxtras.icalendarfx.components.VEvent;
import jfxtras.icalendarfx.parameters.AlarmTriggerRelationship;
import jfxtras.icalendarfx.parameters.AlarmTriggerRelationship.AlarmTriggerRelationshipType;
import jfxtras.icalendarfx.properties.component.alarm.Trigger;
import jfxtras.icalendarfx.properties.component.alarm.Action.ActionType;
public class ParseComponentTest extends ICalendarTestAbstract
{
/** Tests FREQ=YEARLY */
@Test
public void canParseYearly1()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "CATEGORIES:group13" + System.lineSeparator()
+ "CREATED:20151109T082900Z" + System.lineSeparator()
+ "DESCRIPTION:Yearly1 Description" + System.lineSeparator()
+ "DTSTAMP:20151109T083000Z" + System.lineSeparator()
+ "DTSTART:20151109T100000" + System.lineSeparator()
+ "DURATION:PT1H" + System.lineSeparator()
+ "LAST-MODIFIED:20151110T183000Z" + System.lineSeparator()
+ "RRULE:FREQ=YEARLY" + System.lineSeparator()
+ "SUMMARY:Yearly1 Summary" + System.lineSeparator()
+ "UID:20151109T082900-0@jfxtras.org" + System.lineSeparator()
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getYearly1();
assertEquals(expectedVEvent, vEvent);
assertEquals(vEventString, expectedVEvent.toString());
}
@Test
public void canParseDaily3()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTEND:20151109T110000" + System.lineSeparator()
+ "DTSTAMP:20150110T080000Z" + System.lineSeparator()
+ "DTSTART:20151109T100000" + System.lineSeparator()
+ "RRULE:FREQ=DAILY;INTERVAL=3;COUNT=10;BYMONTHDAY=9,10,11,12,13,14" + System.lineSeparator()
+ "UID:20150110T080000-0@jfxtras.org" + System.lineSeparator()
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getDaily3();
assertEquals(expectedVEvent, vEvent);
assertEquals(vEventString, expectedVEvent.toString());
}
@Test
public void canIgnoreBlankLines()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTEND:20151109T110000" + System.lineSeparator()
+ "DTSTAMP:20150110T080000Z" + System.lineSeparator()
+ System.lineSeparator()
+ "DTSTART:20151109T100000" + System.lineSeparator()
+ "RRULE:FREQ=DAILY;INTERVAL=3;COUNT=10;BYMONTHDAY=9,10,11,12,13,14" + System.lineSeparator()
+ System.lineSeparator()
+ System.lineSeparator()
+ "UID:20150110T080000-0@jfxtras.org" + System.lineSeparator()
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getDaily3();
assertEquals(expectedVEvent, vEvent);
String vEventString2 = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTEND:20151109T110000" + System.lineSeparator()
+ "DTSTAMP:20150110T080000Z" + System.lineSeparator()
+ "DTSTART:20151109T100000" + System.lineSeparator()
+ "RRULE:FREQ=DAILY;INTERVAL=3;COUNT=10;BYMONTHDAY=9,10,11,12,13,14" + System.lineSeparator()
+ "UID:20150110T080000-0@jfxtras.org" + System.lineSeparator()
+ "END:VEVENT";
assertEquals(vEventString2, expectedVEvent.toString());
}
@Test
public void canParseDailyUTC()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTSTART:20151109T100000Z" + System.lineSeparator()
+ "DTEND:20151109T110000Z" + System.lineSeparator()
+ "DTSTAMP:20150110T080000Z" + System.lineSeparator()
+ "CATEGORIES:group03" + System.lineSeparator()
+ "DESCRIPTION:DailyUTC Description" + System.lineSeparator()
+ "SUMMARY:DailyUTC Summary" + System.lineSeparator()
+ "UID:20150110T080000-0@jfxtras.org" + System.lineSeparator()
+ "RRULE:FREQ=DAILY;INTERVAL=2;UNTIL=20151201T100000Z" + System.lineSeparator()
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getDailyUTC();
assertEquals(expectedVEvent, vEvent);
assertEquals(vEventString, expectedVEvent.toString());
}
/** Tests FREQ=YEARLY */
@Test
public void canParseDailyWithException1()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTSTART:20151109T100000" + System.lineSeparator()
+ "DURATION:PT1H30M" + System.lineSeparator()
+ "DTSTAMP:20150110T080000Z" + System.lineSeparator()
+ "CATEGORIES:group03" + System.lineSeparator()
+ "DESCRIPTION:Daily2 Description" + System.lineSeparator()
+ "SUMMARY:Daily2 Summary" + System.lineSeparator()
+ "UID:20150110T080000-0@jfxtras.org" + System.lineSeparator()
+ "RRULE:FREQ=DAILY;INTERVAL=3;COUNT=6" + System.lineSeparator()
+ "EXDATE:20151112T100000,20151115T100000" + System.lineSeparator()
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getDailyWithException1();
assertEquals(expectedVEvent, vEvent);
assertEquals(vEventString, expectedVEvent.toString());
}
@Test
public void canParseWholeDay1()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTSTART;VALUE=DATE:20151109" + System.lineSeparator()
+ "DTEND;VALUE=DATE:20151112" + System.lineSeparator()
+ "DTSTAMP:20150110T080000Z" + System.lineSeparator()
+ "UID:20150110T080000-0@jfxtras.org" + System.lineSeparator()
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getWholeDayDaily1();
assertEquals(expectedVEvent, vEvent);
}
@Test
public void canParseGoogleIndividual()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTSTART:20160214T123000Z" + System.lineSeparator()
+ "DTEND:20160214T150000Z" + System.lineSeparator()
+ "DTSTAMP:20160214T022532Z" + System.lineSeparator()
+ "UID:vpqej26mlpg3adcncqqs7t7a34@google.com" + System.lineSeparator()
+ "CREATED:20160214T022513Z" + System.lineSeparator()
+ "DESCRIPTION:" + System.lineSeparator()
+ "LAST-MODIFIED:20160214T022513Z" + System.lineSeparator()
+ "LOCATION:" + System.lineSeparator()
+ "SEQUENCE:0" + System.lineSeparator()
+ "STATUS:CONFIRMED" + System.lineSeparator() // currently not supported
+ "SUMMARY:test1" + System.lineSeparator()
+ "TRANSP:OPAQUE" + System.lineSeparator() // currently not supported
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getGoogleIndividual();
vEvent.equals(expectedVEvent);
assertEquals(expectedVEvent, vEvent);
assertEquals(vEventString, vEvent.toString());
}
@Test
public void canParseGoogleRepeat()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTSTART;TZID=America/Los_Angeles:20160214T080000" + System.lineSeparator()
+ "DTEND;TZID=America/Los_Angeles:20160214T110000" + System.lineSeparator()
+ "RRULE:FREQ=WEEKLY;BYDAY=SU,TU,FR" + System.lineSeparator()
+ "DTSTAMP:20160214T022532Z" + System.lineSeparator()
+ "UID:im8hmpakeigu3d85j3vq9q8bcc@google.com" + System.lineSeparator()
+ "CREATED:20160214T022525Z" + System.lineSeparator()
+ "DESCRIPTION:" + System.lineSeparator()
+ "LAST-MODIFIED:20160214T022525Z" + System.lineSeparator()
+ "LOCATION:" + System.lineSeparator()
+ "SEQUENCE:0" + System.lineSeparator()
+ "STATUS:CONFIRMED" + System.lineSeparator() // currently not supported
+ "SUMMARY:test2" + System.lineSeparator()
+ "TRANSP:OPAQUE" + System.lineSeparator() // currently not supported
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getGoogleRepeatable();
assertEquals(expectedVEvent, vEvent);
}
@Test
public void canParseGoogleRepeatWithExDates()
{
String content = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTSTART;TZID=America/Los_Angeles:20160207T123000" + System.lineSeparator()
+ "DTEND;TZID=America/Los_Angeles:20160207T153000" + System.lineSeparator()
+ "RRULE:FREQ=DAILY;UNTIL=20160512T193000Z" + System.lineSeparator()
+ "EXDATE;TZID=America/Los_Angeles:20160210T123000" + System.lineSeparator()
+ "EXDATE;TZID=America/Los_Angeles:20160212T123000" + System.lineSeparator()
+ "EXDATE;TZID=America/Los_Angeles:20160209T123000" + System.lineSeparator()
+ "DTSTAMP:20160214T072231Z" + System.lineSeparator()
+ "UID:86801l7316n97h75cefk1ruc00@google.com" + System.lineSeparator()
+ "CREATED:20160214T022525Z" + System.lineSeparator()
+ "DESCRIPTION:" + System.lineSeparator()
+ "LAST-MODIFIED:20160214T022525Z" + System.lineSeparator()
+ "LOCATION:" + System.lineSeparator()
+ "SEQUENCE:0" + System.lineSeparator()
+ "STATUS:CONFIRMED" + System.lineSeparator() // currently not supported
+ "SUMMARY:test3" + System.lineSeparator()
+ "TRANSP:OPAQUE" + System.lineSeparator() // currently not supported
+ "END:VEVENT";
VEvent vEvent = VEvent.parse(content);
VEvent expectedVEvent = getGoogleWithExceptions();
assertEquals(expectedVEvent, vEvent);
}
@Test
public void canParseEmptyVevent()
{
String expectedContent = "BEGIN:VEVENT" + System.lineSeparator() +
"END:VEVENT";
VComponent vEvent = VEvent.parse(expectedContent);
VComponent vExpected = new VEvent();
assertEquals(vExpected, vEvent);
assertEquals(expectedContent, vEvent.toString());
}
@Test
public void canParseWithFoldedLines()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTSTART;VALUE=DATE:20151109" + System.lineSeparator()
+ "DTEND;VALUE=DATE:20151112" + System.lineSeparator()
+ "DTSTAMP:20150110T080000Z" + System.lineSeparator()
+ "UID:20150110T080000-0@jfxtras.org" + System.lineSeparator()
+ "COMMENT:This is a multiline " + System.lineSeparator()
+ " comment." + System.lineSeparator()
+ "DESCRIPTION:A dog ran " + System.lineSeparator()
+ "" + System.lineSeparator() // ignore blank line
+ " far away." + System.lineSeparator()
+ "END:VEVENT";
VComponent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getWholeDayDaily1()
.withComments("This is a multiline comment.")
.withDescription("A dog ran far away.");
assertEquals(expectedVEvent, vEvent);
}
@Test
public void canParseWithSubComponent()
{
String vEventString = "BEGIN:VEVENT" + System.lineSeparator()
+ "DTSTART;VALUE=DATE:20151109" + System.lineSeparator()
+ "DTEND;VALUE=DATE:20151112" + System.lineSeparator()
+ "DTSTAMP:20150110T080000Z" + System.lineSeparator()
+ "UID:20150110T080000-0@jfxtras.org" + System.lineSeparator()
+ "COMMENT:This is a multiline " + System.lineSeparator()
+ " comment." + System.lineSeparator()
+ "BEGIN:VALARM" + System.lineSeparator()
+ "ACTION:DISPLAY" + System.lineSeparator()
+ "DESCRIPTION:This is a multiline " + System.lineSeparator()
+ " description." + System.lineSeparator()
+ "TRIGGER;RELATED=START:-PT30M" + System.lineSeparator()
+ "END:VALARM" + System.lineSeparator()
+ "END:VEVENT";
VComponent vEvent = VEvent.parse(vEventString);
VEvent expectedVEvent = getWholeDayDaily1()
.withComments("This is a multiline comment.")
.withVAlarms(new VAlarm()
.withAction(ActionType.DISPLAY)
.withDescription("This is a multiline description.")
.withTrigger(new Trigger<Duration>(Duration.ofMinutes(-30))
.withAlarmTrigger(new AlarmTriggerRelationship(AlarmTriggerRelationshipType.START))));
assertEquals(expectedVEvent, vEvent);
}
}