package jfxtras.icalendarfx.parameter.rrule;
import static org.junit.Assert.assertEquals;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.junit.Test;
import jfxtras.icalendarfx.properties.component.recurrence.rrule.byxxx.ByDay;
import jfxtras.icalendarfx.properties.component.recurrence.rrule.byxxx.ByDay.ByDayPair;
import jfxtras.icalendarfx.utilities.DateTimeUtilities;
public class ByDayTest
{
@Test
public void canParseByDay()
{
ByDay element = ByDay.parse("-1SU");
ByDayPair byDayPair = new ByDayPair()
.withDayOfWeek(DayOfWeek.SUNDAY)
.withOrdinal(-1);
assertEquals(byDayPair, element.getValue().get(0));
assertEquals("BYDAY=-1SU", element.toString());
}
@Test
public void canParseByDay2()
{
ByDay element = ByDay.parse("BYDAY=SU");
ByDayPair byDayPair = new ByDayPair()
.withDayOfWeek(DayOfWeek.SUNDAY);
assertEquals(byDayPair, element.getValue().get(0));
assertEquals("BYDAY=SU", element.toString());
}
/*
DTSTART:20160503T100000
RRULE:FREQ=YEARLY;BYDAY=-1SU,2MO
*/
@Test
public void canStreamByDay()
{
ByDay element = ByDay.parse("-1SU,2MO");
LocalDateTime dateTimeStart = LocalDateTime.of(2015, 12, 27, 10, 0);
ChronoUnit frequency = ChronoUnit.YEARS;
TemporalAdjuster adjuster = (temporal) -> temporal.plus(1, frequency);
Stream<Temporal> inStream = Stream.iterate(dateTimeStart, a -> a.with(adjuster));
Stream<Temporal> recurrenceStream = element.streamRecurrences(inStream, frequency, dateTimeStart);
List<LocalDateTime> expectedRecurrences = new ArrayList<>(Arrays.asList(
LocalDateTime.of(2015, 12, 27, 10, 0)
, LocalDateTime.of(2016, 1, 11, 10, 0)
, LocalDateTime.of(2016, 12, 25, 10, 0)
, LocalDateTime.of(2017, 1, 9, 10, 0)
, LocalDateTime.of(2017, 12, 31, 10, 0)
));
List<Temporal> madeRecurrences = recurrenceStream
.filter(r -> ! DateTimeUtilities.isBefore(r, dateTimeStart)) // filter is normally done in streamRecurrences in RecurrenceRule2
.limit(5)
.collect(Collectors.toList());
assertEquals(expectedRecurrences, madeRecurrences);
}
/*
DTSTART:20160503T100000
RRULE:FREQ=YEARLY;BYDAY=SU,MO
*/
@Test
public void canStreamByDay2()
{
ByDay element = ByDay.parse("SU,MO");
LocalDateTime dateTimeStart = LocalDateTime.of(2016, 5, 2, 10, 0);
ChronoUnit frequency = ChronoUnit.YEARS;
TemporalAdjuster adjuster = (temporal) -> temporal.plus(1, frequency);
Stream<Temporal> inStream = Stream.iterate(dateTimeStart, a -> a.with(adjuster));
Stream<Temporal> recurrenceStream = element.streamRecurrences(inStream, frequency, dateTimeStart);
List<LocalDateTime> expectedRecurrences = new ArrayList<>(Arrays.asList(
LocalDateTime.of(2016, 5, 2, 10, 0)
, LocalDateTime.of(2016, 5, 8, 10, 0)
, LocalDateTime.of(2016, 5, 9, 10, 0)
, LocalDateTime.of(2016, 5, 15, 10, 0)
, LocalDateTime.of(2016, 5, 16, 10, 0)
));
List<Temporal> madeRecurrences = recurrenceStream
.filter(r -> ! DateTimeUtilities.isBefore(r, dateTimeStart)) // filter is normally done in streamRecurrences in RecurrenceRule2
.limit(5)
.collect(Collectors.toList());
assertEquals(expectedRecurrences, madeRecurrences);
}
/*
DTSTART:20160615T100000
RRULE:FREQ=MONTHLY;BYDAY=3WE,2TU
*/
@Test
public void canStreamByDay3()
{
ByDay element = ByDay.parse("3WE,2TU");
LocalDateTime dateTimeStart = LocalDateTime.of(2016, 6, 15, 10, 0);
ChronoUnit frequency = ChronoUnit.MONTHS;
TemporalAdjuster adjuster = (temporal) -> temporal.plus(1, frequency);
Stream<Temporal> inStream = Stream.iterate(dateTimeStart, a -> a.with(adjuster));
Stream<Temporal> recurrenceStream = element.streamRecurrences(inStream, frequency, dateTimeStart);
List<LocalDateTime> expectedRecurrences = new ArrayList<>(Arrays.asList(
LocalDateTime.of(2016, 6, 15, 10, 0)
, LocalDateTime.of(2016, 7, 12, 10, 0)
, LocalDateTime.of(2016, 7, 20, 10, 0)
, LocalDateTime.of(2016, 8, 9, 10, 0)
, LocalDateTime.of(2016, 8, 17, 10, 0)
, LocalDateTime.of(2016, 9, 13, 10, 0)
, LocalDateTime.of(2016, 9, 21, 10, 0)
));
List<Temporal> madeRecurrences = recurrenceStream
.filter(r -> ! DateTimeUtilities.isBefore(r, dateTimeStart)) // filter is normally done in streamRecurrences in RecurrenceRule2
.limit(7)
.collect(Collectors.toList());
assertEquals(expectedRecurrences, madeRecurrences);
}
/*
DTSTART:20160508T100000
RRULE:FREQ=MONTHLY;BYDAY=SA,SU
*/
@Test
public void canStreamByDay4()
{
ByDay element = ByDay.parse("SA,SU");
LocalDateTime dateTimeStart = LocalDateTime.of(2016, 5, 8, 10, 0);
ChronoUnit frequency = ChronoUnit.MONTHS;
TemporalAdjuster adjuster = (temporal) -> temporal.plus(1, frequency);
Stream<Temporal> inStream = Stream.iterate(dateTimeStart, a -> a.with(adjuster));
Stream<Temporal> recurrenceStream = element.streamRecurrences(inStream, frequency, dateTimeStart);
List<LocalDateTime> expectedRecurrences = new ArrayList<>(Arrays.asList(
LocalDateTime.of(2016, 5, 8, 10, 0)
, LocalDateTime.of(2016, 5, 14, 10, 0)
, LocalDateTime.of(2016, 5, 15, 10, 0)
, LocalDateTime.of(2016, 5, 21, 10, 0)
, LocalDateTime.of(2016, 5, 22, 10, 0)
));
List<Temporal> madeRecurrences = recurrenceStream
.filter(r -> ! DateTimeUtilities.isBefore(r, dateTimeStart)) // filter is normally done in streamRecurrences in RecurrenceRule2
.limit(5)
.collect(Collectors.toList());
assertEquals(expectedRecurrences, madeRecurrences);
}
/*
DTSTART:20160509T100000
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR
*/
@Test
public void canStreamByDay5()
{
ByDay element = ByDay.parse("MO,WE,FR");
LocalDateTime dateTimeStart = LocalDateTime.of(2016, 5, 9, 10, 0);
ChronoUnit frequency = ChronoUnit.WEEKS;
TemporalAdjuster adjuster = (temporal) -> temporal.plus(1, frequency);
Stream<Temporal> inStream = Stream.iterate(dateTimeStart, a -> a.with(adjuster));
Stream<Temporal> recurrenceStream = element.streamRecurrences(inStream, frequency, dateTimeStart);
List<LocalDateTime> expectedRecurrences = new ArrayList<>(Arrays.asList(
LocalDateTime.of(2016, 5, 9, 10, 0)
, LocalDateTime.of(2016, 5, 11, 10, 0)
, LocalDateTime.of(2016, 5, 13, 10, 0)
, LocalDateTime.of(2016, 5, 16, 10, 0)
, LocalDateTime.of(2016, 5, 18, 10, 0)
));
List<Temporal> madeRecurrences = recurrenceStream.limit(5).collect(Collectors.toList());
assertEquals(expectedRecurrences, madeRecurrences);
}
/*
DTSTART:20160510T100000
RRULE:FREQ=HOURLY;INTERVAL=8;BYDAY=TU
*/
@Test
public void canStreamByDay7()
{
ByDay element = ByDay.parse("TU");
LocalDateTime dateTimeStart = LocalDateTime.of(2016, 5, 10, 0, 0);
ChronoUnit frequency = ChronoUnit.HOURS;
TemporalAdjuster adjuster = (temporal) -> temporal.plus(8, frequency);
Stream<Temporal> inStream = Stream.iterate(dateTimeStart, a -> a.with(adjuster));
Stream<Temporal> recurrenceStream = element.streamRecurrences(inStream, frequency, dateTimeStart);
List<LocalDateTime> expectedRecurrences = new ArrayList<>(Arrays.asList(
LocalDateTime.of(2016, 5, 10, 0, 0)
, LocalDateTime.of(2016, 5, 10, 8, 0)
, LocalDateTime.of(2016, 5, 10, 16, 0)
, LocalDateTime.of(2016, 5, 17, 0, 0)
, LocalDateTime.of(2016, 5, 17, 8, 0)
));
List<Temporal> madeRecurrences = recurrenceStream.limit(5).collect(Collectors.toList());
assertEquals(expectedRecurrences, madeRecurrences);
}
}