package net.time4j.range;
import net.time4j.CalendarUnit;
import net.time4j.Duration;
import net.time4j.PlainDate;
import net.time4j.format.expert.Iso8601Format;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import java.text.ParseException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.assertThat;
@RunWith(JUnit4.class)
public class BasicDateRangeTest {
@Test
public void isAfterOtherInterval() {
DateInterval i1 = DateInterval.between(PlainDate.of(2014, 2, 27), PlainDate.of(2014, 5, 14));
DateInterval i2 = DateInterval.until(PlainDate.of(2014, 2, 26));
assertThat(
i1.isAfter(i2),
is(true));
assertThat(
i2.isBefore(i1),
is(true));
}
@Test(expected=NullPointerException.class)
public void containsNull() {
assertThat(
DateInterval
.between(PlainDate.of(2014, 2, 27), PlainDate.of(2014, 5, 14))
.contains((DateInterval) null),
is(false));
}
@Test
public void containsTemporalInside() {
assertThat(
DateInterval
.between(PlainDate.of(2014, 2, 27), PlainDate.of(2014, 5, 14))
.contains(PlainDate.of(2014, 3, 1)),
is(true));
}
@Test
public void containsTemporalLeftEdgeClosed() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval
.between(start, end)
.contains(start),
is(true));
}
@Test
public void containsTemporalRightEdgeClosed() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval
.between(start, end)
.contains(end),
is(true));
}
@Test
public void containsTemporalRightEdgeOpen() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval.between(start, end).withOpenEnd().contains(end),
is(false));
}
@Test
public void containsTemporalOutside() {
assertThat(
DateInterval
.between(PlainDate.of(2014, 2, 27), PlainDate.of(2014, 5, 14))
.contains(PlainDate.of(2012, 3, 1)),
is(false));
}
@Test
public void containsTemporalInfinitePastOutside() {
assertThat(
DateInterval
.until(PlainDate.of(2014, 5, 14))
.contains(PlainDate.of(2015, 3, 1)),
is(false));
}
@Test
public void containsTemporalInfinitePastInside() {
assertThat(
DateInterval
.until(PlainDate.of(2014, 5, 14))
.contains(PlainDate.axis().getMinimum()),
is(true));
}
@Test
public void containsTemporalInfiniteFutureOutside() {
assertThat(
DateInterval
.since(PlainDate.of(2014, 5, 14))
.contains(PlainDate.of(2012, 3, 1)),
is(false));
}
@Test
public void containsTemporalInfiniteFutureInside() {
assertThat(
DateInterval
.since(PlainDate.of(2014, 5, 14))
.contains(PlainDate.axis().getMaximum()),
is(true));
}
@Test
public void isEmptyInfinitePast() {
assertThat(
DateInterval
.until(PlainDate.of(2014, 5, 14))
.isEmpty(),
is(false));
}
@Test
public void isEmptyInfiniteFuture() {
assertThat(
DateInterval
.since(PlainDate.of(2014, 5, 14))
.isEmpty(),
is(false));
}
@Test
public void isEmptyAtomicClosed() {
assertThat(
DateInterval
.atomic(PlainDate.of(2014, 5, 14))
.isEmpty(),
is(false));
}
@Test
public void isEmptyAtomicOpen() {
PlainDate date = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval.atomic(date).withOpenEnd().isEmpty(),
is(true));
}
@Test
public void isEmptyReverseBoundaries() throws ParseException {
DateInterval interval =
DateInterval.parse(
"(2012-01-01/2012-01-01]",
Iso8601Format.EXTENDED_CALENDAR_DATE,
BracketPolicy.SHOW_ALWAYS);
assertThat(interval.isEmpty(), is(true));
}
@Test
public void isFiniteInfinitePast() {
assertThat(
DateInterval
.until(PlainDate.of(2014, 5, 14))
.isFinite(),
is(false));
}
@Test
public void isFiniteInfiniteFuture() {
assertThat(
DateInterval
.since(PlainDate.of(2014, 5, 14))
.isFinite(),
is(false));
}
@Test
public void isFiniteEmpty() {
PlainDate date = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval.atomic(date).withOpenEnd().isFinite(), // empty
is(true));
}
@Test
public void isFinite() {
assertThat(
DateInterval.atomic(PlainDate.of(2014, 5, 14)).isFinite(),
is(true));
}
@Test
public void getStart() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval.between(start, end).getStart(),
is(Boundary.of(IntervalEdge.CLOSED, start)));
}
@Test
public void getEnd() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval.between(start, end).getEnd(),
is(Boundary.of(IntervalEdge.CLOSED, end)));
}
@Test
public void getStartAsLocalDate() {
LocalDate start = LocalDate.parse("2014-02-27");
LocalDate end = LocalDate.parse("2015-05-09");
assertThat(
DateInterval.between(start, end).getStartAsLocalDate(),
is(start));
assertThat(
DateInterval.atomic(start).getStartAsLocalDate(),
is(start));
assertThat(
DateInterval.until(start).getStartAsLocalDate(),
nullValue());
}
@Test
public void getEndAsLocalDate() {
LocalDate start = LocalDate.parse("2014-02-27");
LocalDate end = LocalDate.parse("2015-05-09");
assertThat(
DateInterval.between(start, end).getEndAsLocalDate(),
is(end));
assertThat(
DateInterval.atomic(end).getEndAsLocalDate(),
is(end));
assertThat(
DateInterval.since(start).getEndAsLocalDate(),
nullValue());
}
@Test
public void testEquals() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end1 = PlainDate.of(2014, 5, 14);
PlainDate end2 = PlainDate.of(2014, 5, 15);
assertThat(
DateInterval.between(start, end1)
.equals(DateInterval.between(start, end2)),
is(false));
assertThat(
DateInterval.between(start, end1)
.equals(DateInterval.between(start, end2).withOpenEnd()),
is(false));
assertThat(
DateInterval.between(start, end1)
.equals(DateInterval.between(start, end1)),
is(true));
}
@Test
public void testHashCode() {
PlainDate start1 = PlainDate.of(2014, 2, 27);
PlainDate start2 = PlainDate.of(2014, 2, 26);
PlainDate end = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval.between(start1, end).hashCode(),
not(DateInterval.between(start2, end).hashCode()));
assertThat(
DateInterval.between(start1, end).hashCode(),
is(DateInterval.between(start1, end).hashCode()));
}
@Test
public void testToStringInfinitePast() {
assertThat(
DateInterval
.until(PlainDate.of(2014, 5, 14))
.toString(),
is("(-∞/2014-05-14]"));
}
@Test
public void testToStringInfiniteFuture() {
assertThat(
DateInterval
.since(PlainDate.of(2014, 5, 14))
.toString(),
is("[2014-05-14/+∞)"));
}
@Test
public void testToStringFiniteClosed() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval
.between(start, end)
.toString(),
is("[2014-02-27/2014-05-14]"));
}
@Test
public void testToStringFiniteHalfOpen() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
assertThat(
DateInterval.between(start, end).withOpenEnd().toString(),
is("[2014-02-27/2014-05-14)"));
}
@Test
public void withOpenStart() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
DateInterval interval = DateInterval.between(start, end);
assertThat(
interval.withOpenStart().getStart().isOpen(),
is(true));
assertThat(
interval.withOpenStart().getStart().getTemporal(),
is(start));
DateInterval infinite = DateInterval.until(end);
assertThat(
infinite.withOpenStart(),
is(infinite));
}
@Test
public void withOpenEnd() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
DateInterval interval = DateInterval.between(start, end);
assertThat(
interval.withOpenEnd().getEnd().isOpen(),
is(true));
assertThat(
interval.withOpenEnd().getEnd().getTemporal(),
is(end));
DateInterval infinite = DateInterval.since(start);
assertThat(
infinite.withOpenEnd(),
is(infinite));
}
@Test
public void withClosedStart() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
DateInterval interval = DateInterval.between(start, end);
assertThat(
interval.withClosedStart(),
is(interval));
}
@Test
public void withClosedEnd() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
DateInterval interval = DateInterval.between(start, end);
assertThat(
interval.withClosedEnd(),
is(interval));
}
@Test
public void withStart() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate mid = PlainDate.of(2014, 4, 20);
PlainDate end = PlainDate.of(2014, 5, 14);
DateInterval interval = DateInterval.between(mid, end);
assertThat(
interval.withStart(start),
is(DateInterval.between(start, end)));
}
@Test
public void withEnd() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate mid = PlainDate.of(2014, 4, 20);
PlainDate end = PlainDate.of(2014, 5, 14);
DateInterval interval = DateInterval.between(start, mid);
assertThat(
interval.withEnd(end),
is(DateInterval.between(start, end)));
}
@Test
public void withStartOperator() {
PlainDate start = PlainDate.of(2014, 2, 1);
PlainDate mid = PlainDate.of(2014, 2, 20);
PlainDate end = PlainDate.of(2014, 5, 31);
DateInterval interval = DateInterval.between(mid, end);
assertThat(
interval.withStart(PlainDate.DAY_OF_MONTH.minimized()),
is(DateInterval.between(start, end)));
}
@Test(expected=IllegalStateException.class)
public void withStartOperatorInfinite() {
DateInterval interval = DateInterval.until(PlainDate.of(2014, 2, 20));
interval.withStart(PlainDate.DAY_OF_MONTH.minimized());
}
@Test
public void withEndOperator() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate mid = PlainDate.of(2014, 5, 20);
PlainDate end = PlainDate.of(2014, 5, 31);
DateInterval interval = DateInterval.between(start, mid);
assertThat(
interval.withEnd(PlainDate.DAY_OF_MONTH.maximized()),
is(DateInterval.between(start, end)));
}
@Test(expected=IllegalStateException.class)
public void withEndOperatorInfinite() {
DateInterval interval = DateInterval.since(PlainDate.of(2014, 2, 20));
interval.withEnd(PlainDate.DAY_OF_MONTH.maximized());
}
@Test
public void collapseNormal() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
DateInterval interval = DateInterval.between(start, end);
assertThat(
interval.collapse().isEmpty(),
is(true));
assertThat(
interval.collapse().getEnd().getTemporal().equals(start),
is(true));
assertThat(
interval.collapse().getEnd().isOpen(),
is(true));
}
@Test(expected=IllegalStateException.class)
public void collapsePast() {
PlainDate end = PlainDate.of(2014, 2, 27);
DateInterval.until(end).collapse();
}
@Test
public void move() {
PlainDate start1 = PlainDate.of(2014, 2, 27);
PlainDate end1 = PlainDate.of(2014, 5, 14);
DateInterval interval = DateInterval.between(start1, end1);
PlainDate start2 = PlainDate.of(2014, 10, 27);
PlainDate end2 = PlainDate.of(2015, 1, 14);
DateInterval expected = DateInterval.between(start2, end2);
assertThat(
interval.move(8, CalendarUnit.MONTHS),
is(expected));
}
@Test
public void streamDaily() {
PlainDate start = PlainDate.of(2014, 2, 27);
PlainDate end = PlainDate.of(2014, 5, 14);
List<PlainDate> expected = new ArrayList<>();
PlainDate date = start;
while (!date.isAfter(end)) {
expected.add(date);
date = date.plus(1, CalendarUnit.DAYS);
}
List<PlainDate> dates;
dates = DateInterval.between(start, end).streamDaily().parallel().collect(Collectors.toList());
assertThat(dates, is(expected));
dates = DateInterval.between(start, end).streamDaily().parallel().sorted().collect(Collectors.toList());
assertThat(dates, is(expected));
dates = DateInterval.between(start, end).streamDaily().collect(Collectors.toList());
assertThat(dates, is(expected));
dates = DateInterval.between(start, end).streamDaily().sorted().collect(Collectors.toList());
assertThat(dates, is(expected));
}
@Test
public void streamDailyWithOnlyOneDate() {
PlainDate date = PlainDate.of(2014, 2, 27);
List<PlainDate> expected = Collections.singletonList(date);
assertThat(DateInterval.atomic(date).streamDaily().collect(Collectors.toList()), is(expected));
assertThat(DateInterval.streamDaily(date, date).collect(Collectors.toList()), is(expected));
}
@Test(expected=IllegalArgumentException.class)
public void streamDailyWithStartAfterEnd() {
PlainDate start = PlainDate.of(2014, 5, 15);
PlainDate end = PlainDate.of(2014, 5, 14);
DateInterval.streamDaily(start, end);
}
@Test(expected=IllegalStateException.class)
public void streamDailyWhenInfiniteSince() {
PlainDate date = PlainDate.of(2014, 5, 15);
DateInterval.since(date).streamDaily();
}
@Test(expected=IllegalStateException.class)
public void streamDailyWhenInfiniteUntil() {
PlainDate date = PlainDate.of(2014, 5, 15);
DateInterval.until(date).streamDaily();
}
@Test(expected=IllegalStateException.class)
public void streamDailyWhenNotCanonicalizable() {
PlainDate date = PlainDate.axis().getMinimum();
DateInterval.until(date).withOpenEnd().streamDaily();
}
@Test
public void streamDailyWhenEmpty() {
PlainDate date = PlainDate.of(2014, 5, 15);
assertThat(
DateInterval.atomic(date).withOpenEnd().streamDaily().collect(Collectors.toList()).size(),
is(0));
}
@Test
public void streamDuration1() {
PlainDate start = PlainDate.of(2013, 6, 28);
PlainDate end = PlainDate.of(2016, 10, 1);
Duration<CalendarUnit> duration = Duration.ofCalendarUnits(1, 2, 5);
List<PlainDate> expected = new ArrayList<>();
expected.add(start);
expected.add(start.plus(14, CalendarUnit.MONTHS).plus(5, CalendarUnit.DAYS));
expected.add(start.plus(28, CalendarUnit.MONTHS).plus(10, CalendarUnit.DAYS));
List<PlainDate> dates = DateInterval.stream(duration, start, end).parallel().collect(Collectors.toList());
assertThat(dates, is(expected));
dates = DateInterval.between(start, end).stream(duration).parallel().collect(Collectors.toList());
assertThat(dates, is(expected));
}
@Test
public void streamDuration2() {
PlainDate start = PlainDate.of(2013, 1, 31);
PlainDate end = PlainDate.of(2013, 5, 31);
Duration<CalendarUnit> duration = Duration.of(1, CalendarUnit.MONTHS);
List<PlainDate> expected = new ArrayList<>();
expected.add(start);
expected.add(PlainDate.of(2013, 2, 28));
expected.add(PlainDate.of(2013, 3, 31));
expected.add(PlainDate.of(2013, 4, 30));
expected.add(PlainDate.of(2013, 5, 31));
List<PlainDate> dates = DateInterval.stream(duration, start, end).sorted().collect(Collectors.toList());
assertThat(dates, is(expected));
dates = DateInterval.between(start, end).stream(duration).sorted().collect(Collectors.toList());
assertThat(dates, is(expected));
}
@Test
public void streamDuration3() {
PlainDate start = PlainDate.of(2013, 1, 31);
Duration<CalendarUnit> duration = Duration.of(1, CalendarUnit.MONTHS);
// some edge cases
assertThat(
DateInterval.stream(duration, start, start).collect(Collectors.toList()),
is(Collections.singletonList(start)));
assertThat(
DateInterval.between(start, start).stream(duration).collect(Collectors.toList()),
is(Collections.singletonList(start)));
assertThat(
DateInterval.between(start, start).withOpenEnd().stream(duration).collect(Collectors.toList()),
is(Collections.emptyList()));
assertThat(
DateInterval.stream(duration, start, start.plus(27, CalendarUnit.DAYS)).collect(Collectors.toList()),
is(Collections.singletonList(start)));
assertThat(
DateInterval.stream(duration, start, start.plus(28, CalendarUnit.DAYS)).collect(Collectors.toList()),
is(Arrays.asList(start, PlainDate.of(2013, 2, 28))));
}
@Test(expected=IllegalArgumentException.class)
public void streamDurationWithStartAfterEnd() {
PlainDate start = PlainDate.of(2014, 5, 15);
PlainDate end = PlainDate.of(2014, 5, 14);
Duration<CalendarUnit> duration = Duration.of(1, CalendarUnit.MONTHS);
DateInterval.stream(duration, start, end);
}
@Test
public void streamWeekBased() {
PlainDate start = PlainDate.of(2013, 1, 1); // Tuesday
PlainDate end = PlainDate.of(2017, 1, 1); // Sunday
List<PlainDate> expected = new ArrayList<>();
expected.add(start);
expected.add(PlainDate.of(2013, 12, 31).plus(17, CalendarUnit.DAYS));
expected.add(PlainDate.of(2014, 12, 30).plus(34, CalendarUnit.DAYS));
expected.add(PlainDate.of(2016, 1, 5).plus(51, CalendarUnit.DAYS));
List<PlainDate> dates =
DateInterval.between(start, end).streamWeekBased(1, 2, 3).parallel().collect(Collectors.toList());
assertThat(dates, is(expected));
}
}