package jfxtras.icalendarfx.property.component;
import static org.junit.Assert.assertEquals;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.Temporal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.junit.Test;
import jfxtras.icalendarfx.components.VEvent;
import jfxtras.icalendarfx.properties.component.recurrence.RecurrenceDates;
import jfxtras.icalendarfx.utilities.ICalendarUtilities;
import jfxtras.icalendarfx.utilities.Pair;
public class RecurrencesTest
{
@Test
public void canParseRDate1()
{
String contentLine = "RDATE;VALUE=DATE:19970304,19970504,19970704,19970904";
List<Pair<String, String>> valueList = ICalendarUtilities.parseInlineElementsToListPair(contentLine);
List<Pair<String, String>> expectedList = new ArrayList<>();
expectedList.add(new Pair<>("VALUE", "DATE"));
expectedList.add(new Pair<>(ICalendarUtilities.PROPERTY_VALUE_KEY, "19970304,19970504,19970704,19970904"));
assertEquals(expectedList, valueList);
}
@Test
public void canParseRDate2()
{
String contentLine = "RDATE;TZID=America/New_York:19970714T083000";
List<Pair<String, String>> valueList = ICalendarUtilities.parseInlineElementsToListPair(contentLine);
List<Pair<String, String>> expectedList = new ArrayList<>();
expectedList.add(new Pair<>("TZID", "America/New_York"));
expectedList.add(new Pair<>(ICalendarUtilities.PROPERTY_VALUE_KEY, "19970714T083000"));
assertEquals(expectedList, valueList);
}
// Can parsing period, but period not currently supported in streaming dates
@Test
public void canParseRDate3()
{
String contentLine = "RDATE;VALUE=PERIOD:19960403T020000Z/19960403T040000Z,19960404T010000Z/PT3H";
List<Pair<String, String>> valueList = ICalendarUtilities.parseInlineElementsToListPair(contentLine);
List<Pair<String, String>> expectedList = new ArrayList<>();
expectedList.add(new Pair<>("VALUE", "PERIOD"));
expectedList.add(new Pair<>(ICalendarUtilities.PROPERTY_VALUE_KEY, "19960403T020000Z/19960403T040000Z,19960404T010000Z/PT3H"));
assertEquals(expectedList, valueList);
}
@Test
public void canMakeRecurrences1()
{
RecurrenceDates property = new RecurrenceDates(
LocalDateTime.of(2015, 11, 12, 10, 0)
, LocalDateTime.of(2015, 11, 14, 12, 0));
Set<LocalDateTime> expectedDates = new LinkedHashSet<>(Arrays.asList(
LocalDateTime.of(2015, 11, 12, 10, 0)
, LocalDateTime.of(2015, 11, 14, 12, 0) ));
assertEquals(expectedDates, property.getValue());
assertEquals("RDATE:20151112T100000,20151114T120000", property.toString());
}
@Test
public void canParseRecurrences2()
{
String content = "RDATE;TZID=America/Los_Angeles:19960402T010000";
RecurrenceDates madeProperty = RecurrenceDates.parse(ZonedDateTime.class, content);
madeProperty.getValue().add(ZonedDateTime.of(LocalDateTime.of(1996, 4, 3, 1, 0), ZoneId.of("America/Los_Angeles")));
madeProperty.getValue().add(ZonedDateTime.of(LocalDateTime.of(1996, 4, 4, 1, 0), ZoneId.of("America/Los_Angeles")));
String foldedContent = ICalendarUtilities.foldLine(content + ",19960403T010000,19960404T010000").toString();
assertEquals(foldedContent, madeProperty.toString());
RecurrenceDates expectedProperty = new RecurrenceDates(new HashSet<>(Arrays.asList(
ZonedDateTime.of(LocalDateTime.of(1996, 4, 2, 1, 0), ZoneId.of("America/Los_Angeles")),
ZonedDateTime.of(LocalDateTime.of(1996, 4, 3, 1, 0), ZoneId.of("America/Los_Angeles")),
ZonedDateTime.of(LocalDateTime.of(1996, 4, 4, 1, 0), ZoneId.of("America/Los_Angeles")) )));
assertEquals(expectedProperty, madeProperty);
Set<ZonedDateTime> expectedValues = new HashSet<>(Arrays.asList(
ZonedDateTime.of(LocalDateTime.of(1996, 4, 2, 1, 0), ZoneId.of("America/Los_Angeles")),
ZonedDateTime.of(LocalDateTime.of(1996, 4, 3, 1, 0), ZoneId.of("America/Los_Angeles")),
ZonedDateTime.of(LocalDateTime.of(1996, 4, 4, 1, 0), ZoneId.of("America/Los_Angeles")) ));
assertEquals(expectedValues, madeProperty.getValue());
}
@Test
public void canParseRecurrences3()
{
String content = "RDATE;VALUE=DATE:19970304,19970504,19970704,19970904";
RecurrenceDates madeProperty = new RecurrenceDates(
LocalDate.of(1997, 3, 4),
LocalDate.of(1997, 5, 4),
LocalDate.of(1997, 7, 4),
LocalDate.of(1997, 9, 4)
);
assertEquals(content, madeProperty.toString());
}
/** Tests VEvent with RDATE VEvent */
@Test
public void canStreamRDate()
{
VEvent e = new VEvent()
.withDateTimeStart(LocalDateTime.of(2015, 11, 9, 10, 0))
.withDuration(Duration.ofMinutes(60))
.withRecurrenceDates(new RecurrenceDates(LocalDateTime.of(2015, 11, 12, 10, 0)
, LocalDateTime.of(2015, 11, 14, 12, 0)));
List<Temporal> madeDates = e
.streamRecurrences()
.collect(Collectors.toList());
List<LocalDateTime> expectedDates = new ArrayList<LocalDateTime>(Arrays.asList(
LocalDateTime.of(2015, 11, 9, 10, 0)
, LocalDateTime.of(2015, 11, 12, 10, 0)
, LocalDateTime.of(2015, 11, 14, 12, 0)
));
assertEquals(expectedDates, madeDates);
}
}