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.ByWeekNumber; import jfxtras.icalendarfx.utilities.DateTimeUtilities; public class ByWeekNumberTest { @Test public void canParseByWeekNumber() { ByWeekNumber element = new ByWeekNumber(4,5); assertEquals(Arrays.asList(4,5), element.getValue()); assertEquals("BYWEEKNO=4,5", element.toString()); } /* DTSTART:19970512T100000 RRULE:FREQ=YEARLY;BYWEEKNO=20 */ @Test public void canStreamByWeekNumber() { ByWeekNumber element = new ByWeekNumber(20); LocalDateTime dateTimeStart = LocalDateTime.of(1997, 5, 12, 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(1997, 5, 12, 10, 0) , LocalDateTime.of(1997, 5, 13, 10, 0) , LocalDateTime.of(1997, 5, 14, 10, 0) , LocalDateTime.of(1997, 5, 15, 10, 0) , LocalDateTime.of(1997, 5, 16, 10, 0) , LocalDateTime.of(1997, 5, 17, 10, 0) , LocalDateTime.of(1997, 5, 18, 10, 0) , LocalDateTime.of(1998, 5, 11, 10, 0) , LocalDateTime.of(1998, 5, 12, 10, 0) , LocalDateTime.of(1998, 5, 13, 10, 0) )); List<Temporal> madeRecurrences = recurrenceStream.limit(10).collect(Collectors.toList()); assertEquals(expectedRecurrences, madeRecurrences); } /* DTSTART:19970512T100000 RRULE:FREQ=YEARLY;BYWEEKNO=53 */ @Test public void canStreamByWeekNumber2() { ByWeekNumber element = new ByWeekNumber(53); LocalDateTime dateTimeStart = LocalDateTime.of(1997, 12, 29, 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(1997, 12, 29, 10, 0) , LocalDateTime.of(1997, 12, 30, 10, 0) , LocalDateTime.of(1997, 12, 31, 10, 0) , LocalDateTime.of(1998, 12, 28, 10, 0) , LocalDateTime.of(1998, 12, 29, 10, 0) , LocalDateTime.of(1998, 12, 30, 10, 0) , LocalDateTime.of(1998, 12, 31, 10, 0) , LocalDateTime.of(2001, 12, 31, 10, 0) , LocalDateTime.of(2002, 12, 30, 10, 0) , LocalDateTime.of(2002, 12, 31, 10, 0) )); List<Temporal> madeRecurrences = recurrenceStream .limit(10) .collect(Collectors.toList()); assertEquals(expectedRecurrences, madeRecurrences); } /* DTSTART:19970512T100000 RRULE:FREQ=YEARLY;BYWEEKNO=-53 */ @Test public void canStreamByWeekNumber3() { ByWeekNumber element = new ByWeekNumber(-53); LocalDateTime dateTimeStart = LocalDateTime.of(1997, 1, 29, 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(1998, 1, 1, 10, 0) , LocalDateTime.of(1998, 1, 2, 10, 0) , LocalDateTime.of(1998, 1, 3, 10, 0) , LocalDateTime.of(1998, 1, 4, 10, 0) , LocalDateTime.of(1999, 1, 1, 10, 0) , LocalDateTime.of(1999, 1, 2, 10, 0) , LocalDateTime.of(1999, 1, 3, 10, 0) , LocalDateTime.of(2000, 1, 1, 10, 0) , LocalDateTime.of(2000, 1, 2, 10, 0) , LocalDateTime.of(2004, 1, 1, 10, 0) )); List<Temporal> madeRecurrences = recurrenceStream .limit(10) .collect(Collectors.toList()); assertEquals(expectedRecurrences, madeRecurrences); } /* DTSTART:19970512T100000 RRULE:FREQ=YEARLY;BYWEEKNO=-1 */ @Test public void canStreamByWeekNumber4() { ByWeekNumber element = new ByWeekNumber(-1); LocalDateTime dateTimeStart = LocalDateTime.of(1998, 12, 28, 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(1998, 12, 28, 10, 0) , LocalDateTime.of(1998, 12, 29, 10, 0) , LocalDateTime.of(1998, 12, 30, 10, 0) , LocalDateTime.of(1998, 12, 31, 10, 0) , LocalDateTime.of(1999, 12, 27, 10, 0) , LocalDateTime.of(1999, 12, 28, 10, 0) , LocalDateTime.of(1999, 12, 29, 10, 0) , LocalDateTime.of(1999, 12, 30, 10, 0) , LocalDateTime.of(1999, 12, 31, 10, 0) , LocalDateTime.of(2000, 12, 25, 10, 0) )); List<Temporal> madeRecurrences = recurrenceStream .filter(r -> ! DateTimeUtilities.isBefore(r, dateTimeStart)) // filter is normally done in streamRecurrences in RecurrenceRule2 .limit(10) .collect(Collectors.toList()); assertEquals(expectedRecurrences, madeRecurrences); } @Test public void canCatchInvalidByWeekNumber() { ByWeekNumber element = new ByWeekNumber(); element.getValue().add(999); // invalid element assertEquals(1, element.errors().size()); String expected = "Out of range BYWEEKNO value: 999"; assertEquals(expected, element.errors().get(0)); } }