package jfxtras.icalendarfx.parameter.rrule; import static org.junit.Assert.assertEquals; 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.ByYearDay; public class ByYearDayTest { @Test public void canParseByYearDay() { ByYearDay element = new ByYearDay(100,200,300); assertEquals(Arrays.asList(100,200,300), element.getValue()); assertEquals("BYYEARDAY=100,200,300", element.toString()); } /* DTSTART:20160104T000000 RRULE:FREQ=HOURLY;BYYEARDAY=-2,4 */ @Test public void canStreamByYearDay() { ByYearDay element = new ByYearDay(4,-2); LocalDateTime dateTimeStart = LocalDateTime.of(2016, 1, 4, 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, 1, 4, 0, 0) , LocalDateTime.of(2016, 1, 4, 8, 0) , LocalDateTime.of(2016, 1, 4, 16, 0) , LocalDateTime.of(2016, 12, 30, 0, 0) , LocalDateTime.of(2016, 12, 30, 8, 0) , LocalDateTime.of(2016, 12, 30, 16, 0) , LocalDateTime.of(2017, 1, 4, 0, 0) , LocalDateTime.of(2017, 1, 4, 8, 0) )); List<Temporal> madeRecurrences = recurrenceStream.limit(8).collect(Collectors.toList()); assertEquals(expectedRecurrences, madeRecurrences); } /* DTSTART:20160505T100000 RRULE:FREQ=YEARLY;BYYEARDAY=-366 */ @Test public void canStreamByYearDay2() { ByYearDay element = new ByYearDay(-366); LocalDateTime dateTimeStart = LocalDateTime.of(2016, 1, 1, 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, 1, 1, 10, 0) , LocalDateTime.of(2020, 1, 1, 10, 0) , LocalDateTime.of(2024, 1, 1, 10, 0) , LocalDateTime.of(2028, 1, 1, 10, 0) , LocalDateTime.of(2032, 1, 1, 10, 0) )); List<Temporal> madeRecurrences = recurrenceStream.limit(5).collect(Collectors.toList()); assertEquals(expectedRecurrences, madeRecurrences); } /* DTSTART:20160505T100000 RRULE:FREQ=YEARLY;BYYEARDAY=366 */ @Test public void canStreamByYearDay3() { ByYearDay element = new ByYearDay(366); LocalDateTime dateTimeStart = LocalDateTime.of(2016, 12, 31, 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, 12, 31, 10, 0) , LocalDateTime.of(2020, 12, 31, 10, 0) , LocalDateTime.of(2024, 12, 31, 10, 0) , LocalDateTime.of(2028, 12, 31, 10, 0) , LocalDateTime.of(2032, 12, 31, 10, 0) )); List<Temporal> madeRecurrences = recurrenceStream.limit(5).collect(Collectors.toList()); assertEquals(expectedRecurrences, madeRecurrences); } @Test (expected = IllegalArgumentException.class) public void canCatchOutOfRangeByYearDay() { new ByYearDay(1100,200,300); } }