package net.time4j.range; import net.time4j.CalendarUnit; import net.time4j.ClockUnit; import net.time4j.Duration; import net.time4j.IsoUnit; import net.time4j.PlainTimestamp; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import java.time.LocalDateTime; import java.util.ArrayList; 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 BasicTimestampRangeTest { @Test public void containsTemporalInside() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval .between(start, end) .contains(PlainTimestamp.of(2014, 3, 1, 14, 45)), is(true)); } @Test public void containsTemporalLeftEdgeClosed() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval .between(start, end) .contains(start), is(true)); } @Test public void containsTemporalRightEdgeClosed() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval.between(start, end).withClosedEnd().contains(end), is(true)); } @Test public void containsTemporalRightEdgeOpen() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval.between(start, end).contains(end), is(false)); } @Test public void containsTemporalOutside() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval .between(start, end) .contains(PlainTimestamp.of(2014, 5, 14, 0, 0, 1)), is(false)); } @Test public void containsTemporalInfinitePastOutside() { assertThat( TimestampInterval .until(PlainTimestamp.of(2014, 5, 14, 0, 0)) .contains(PlainTimestamp.of(2015, 3, 1, 0, 0)), is(false)); } @Test public void containsTemporalInfinitePastInside() { assertThat( TimestampInterval .until(PlainTimestamp.of(2014, 5, 14, 0, 0)) .contains(PlainTimestamp.axis().getMinimum()), is(true)); } @Test public void containsTemporalInfiniteFutureOutside() { assertThat( TimestampInterval .since(PlainTimestamp.of(2014, 5, 14, 0, 0)) .contains(PlainTimestamp.of(2012, 3, 1, 0, 0)), is(false)); } @Test public void containsTemporalInfiniteFutureInside() { assertThat( TimestampInterval .since(PlainTimestamp.of(2014, 5, 14, 0, 0)) .contains(PlainTimestamp.axis().getMaximum()), is(true)); } @Test public void isEmptyInfinitePast() { assertThat( TimestampInterval .until(PlainTimestamp.of(2014, 5, 14, 0, 0)) .isEmpty(), is(false)); } @Test public void isEmptyInfiniteFuture() { assertThat( TimestampInterval .since(PlainTimestamp.of(2014, 5, 14, 0, 0)) .isEmpty(), is(false)); } @Test public void isEmptyAtomicClosed() { PlainTimestamp tsp = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval.between(tsp, tsp).withClosedEnd().isEmpty(), is(false)); } @Test public void isEmptyAtomicOpen() { PlainTimestamp tsp = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval.between(tsp, tsp).isEmpty(), is(true)); } @Test public void isFiniteInfinitePast() { assertThat( TimestampInterval .until(PlainTimestamp.of(2014, 5, 14, 0, 0)) .isFinite(), is(false)); } @Test public void isFiniteInfiniteFuture() { assertThat( TimestampInterval .since(PlainTimestamp.of(2014, 5, 14, 0, 0)) .isFinite(), is(false)); } @Test public void isFiniteEmpty() { PlainTimestamp tsp = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval.between(tsp, tsp).isFinite(), // empty is(true)); } @Test public void isFinite() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval.between(start, end).isFinite(), is(true)); } @Test public void getStart() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval.between(start, end).getStart(), is(Boundary.of(IntervalEdge.CLOSED, start))); } @Test public void getEnd() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 0, 0); assertThat( TimestampInterval.between(start, end).getEnd(), is(Boundary.of(IntervalEdge.OPEN, end))); } @Test public void getStartAsLocalDateTime() { LocalDateTime start = LocalDateTime.parse("2014-02-27T10:03:15"); assertThat( TimestampInterval.since(start).getStartAsLocalDateTime(), is(start)); assertThat( TimestampInterval.since(start).getEndAsLocalDateTime(), nullValue()); } @Test public void getEndAsLocalDateTime() { LocalDateTime end = LocalDateTime.parse("2014-05-14T17:45:30"); assertThat( TimestampInterval.until(end).getEndAsLocalDateTime(), is(end)); assertThat( TimestampInterval.until(end).getStartAsLocalDateTime(), nullValue()); } @Test public void testEquals() { PlainTimestamp start1 = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end1 = PlainTimestamp.of(2014, 5, 14, 0, 0); PlainTimestamp start2 = start1; PlainTimestamp end2 = PlainTimestamp.axis().stepBackwards(end1); assertThat( TimestampInterval.between(start1, end1) .equals( TimestampInterval.between(start2, end2)), is(false)); assertThat( TimestampInterval.between(start1, end1) .equals( TimestampInterval.between(start2, end2).withClosedEnd()), is(false)); assertThat( TimestampInterval.between(start1, end1) .equals(TimestampInterval.between(start1, end1)), is(true)); } @Test public void testHashCode() { PlainTimestamp start1 = PlainTimestamp.of(2014, 2, 27, 0, 0); PlainTimestamp end1 = PlainTimestamp.of(2014, 5, 14, 0, 0); PlainTimestamp start2 = start1; PlainTimestamp end2 = PlainTimestamp.axis().stepBackwards(end1); assertThat( TimestampInterval.between(start1, end1).hashCode(), not(TimestampInterval.between(start2, end2).hashCode())); assertThat( TimestampInterval.between(start1, end1).hashCode(), not( TimestampInterval.between(start2, end2) .withClosedEnd().hashCode())); assertThat( TimestampInterval.between(start1, end1).hashCode(), is(TimestampInterval.between(start1, end1).hashCode())); } @Test public void testToStringInfinitePast() { assertThat( TimestampInterval .until(PlainTimestamp.of(2014, 5, 14, 14, 45)) .toString(), is("(-∞/2014-05-14T14:45)")); } @Test public void testToStringInfiniteFuture() { assertThat( TimestampInterval .since(PlainTimestamp.of(2014, 5, 14, 14, 45)) .toString(), is("[2014-05-14T14:45/+∞)")); } @Test public void testToStringFiniteClosed() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 14, 45); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 9, 30); assertThat( TimestampInterval.between(start, end).withClosedEnd().toString(), is("[2014-02-27T14:45/2014-05-14T09:30]")); } @Test public void testToStringFiniteHalfOpen() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 14, 45); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 9, 30); assertThat( TimestampInterval .between(start, end) .toString(), is("[2014-02-27T14:45/2014-05-14T09:30)")); } @Test public void withClosedEndNormal() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 14, 45); PlainTimestamp end = PlainTimestamp.of(2014, 5, 14, 9, 30); TimestampInterval interval = TimestampInterval.between(start, end); assertThat( interval.withClosedEnd().getEnd().isClosed(), is(true)); } @Test(expected=IllegalStateException.class) public void withClosedEndInfinite() { PlainTimestamp start = PlainTimestamp.of(2014, 2, 27, 14, 45); TimestampInterval.since(start).withClosedEnd(); } @Test public void move() { PlainTimestamp start1 = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end1 = PlainTimestamp.of(2014, 5, 2, 16, 0); TimestampInterval interval = TimestampInterval.between(start1, end1); PlainTimestamp start2 = PlainTimestamp.of(2014, 5, 2, 11, 0); PlainTimestamp end2 = PlainTimestamp.of(2014, 5, 3, 4, 0); TimestampInterval expected = TimestampInterval.between(start2, end2); assertThat( interval.move(12, ClockUnit.HOURS), is(expected)); } @Test public void stream1() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end = PlainTimestamp.of(2014, 6, 2, 16, 0); TimestampInterval interval = TimestampInterval.between(start, end); Duration<?> duration = Duration.of(1, (IsoUnit) CalendarUnit.MONTHS).plus(4, ClockUnit.HOURS); List<PlainTimestamp> expected = new ArrayList<>(); expected.add(start); expected.add(PlainTimestamp.of(2014, 6, 2, 3, 0)); List<PlainTimestamp> result = interval.stream(duration).collect(Collectors.toList()); assertThat(result, is(expected)); } @Test public void stream2() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end = PlainTimestamp.of(2014, 6, 2, 16, 0).plus(1, ClockUnit.NANOS); TimestampInterval interval = TimestampInterval.between(start, end); Duration<?> duration = Duration.of(1, (IsoUnit) CalendarUnit.MONTHS).plus(17, ClockUnit.HOURS); List<PlainTimestamp> expected = new ArrayList<>(); expected.add(start); expected.add(PlainTimestamp.of(2014, 6, 2, 16, 0)); List<PlainTimestamp> result = interval.stream(duration).parallel().collect(Collectors.toList()); assertThat(result, is(expected)); } @Test public void stream3() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end = PlainTimestamp.of(2014, 6, 2, 16, 0); TimestampInterval interval = TimestampInterval.between(start, end); Duration<?> duration = Duration.of(1, (IsoUnit) CalendarUnit.MONTHS).plus(17, ClockUnit.HOURS); List<PlainTimestamp> result = interval.stream(duration).parallel().collect(Collectors.toList()); assertThat(result, is(Collections.singletonList(start))); } @Test public void stream4() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end = start.plus(2, ClockUnit.NANOS); TimestampInterval interval = TimestampInterval.between(start, end); Duration<?> duration = Duration.of(1, ClockUnit.NANOS); List<PlainTimestamp> expected = new ArrayList<>(); expected.add(start); expected.add(start.plus(1, ClockUnit.NANOS)); List<PlainTimestamp> result = interval.stream(duration).parallel().collect(Collectors.toList()); assertThat(result, is(expected)); } @Test public void stream5() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end = start.plus(1, ClockUnit.NANOS); TimestampInterval interval = TimestampInterval.between(start, end); Duration<?> duration = Duration.of(1, ClockUnit.NANOS); List<PlainTimestamp> result = interval.stream(duration).parallel().collect(Collectors.toList()); assertThat(result, is(Collections.singletonList(start))); } @Test public void stream6() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); TimestampInterval interval = TimestampInterval.between(start, start); Duration<?> duration = Duration.of(1, ClockUnit.NANOS); List<PlainTimestamp> result = interval.stream(duration).parallel().collect(Collectors.toList()); assertThat(result, is(Collections.emptyList())); } @Test(expected=IllegalArgumentException.class) public void streamWithEmptyDuration() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end = PlainTimestamp.of(2014, 6, 2, 16, 0); TimestampInterval interval = TimestampInterval.between(start, end); Duration<?> duration = Duration.ofZero(); interval.stream(duration); } @Test(expected=IllegalArgumentException.class) public void streamWithNegativeDuration() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end = PlainTimestamp.of(2014, 6, 2, 16, 0); TimestampInterval interval = TimestampInterval.between(start, end); Duration<?> duration = Duration.of(1, CalendarUnit.MONTHS).inverse(); interval.stream(duration); } @Test(expected=IllegalArgumentException.class) public void streamWithStartAfterEnd() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 1, 16, 0); TimestampInterval.stream(Duration.of(1, CalendarUnit.DAYS), start, end); } @Test(expected=IllegalStateException.class) public void streamInfinite() { PlainTimestamp tsp = PlainTimestamp.of(2016, 1, 1, 0, 0); TimestampInterval.since(tsp).stream(Duration.of(1, CalendarUnit.DAYS)); } @Test public void streamSizeLimit() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0, 0); PlainTimestamp end = start.plus(Integer.MAX_VALUE - 1, ClockUnit.NANOS); TimestampInterval interval = TimestampInterval.between(start, end); assertThat( (int) interval.stream(Duration.of(1, ClockUnit.NANOS)).spliterator().getExactSizeIfKnown(), is(Integer.MAX_VALUE - 1)); } @Test(expected=ArithmeticException.class) public void streamOverflow() { PlainTimestamp start = PlainTimestamp.of(2014, 5, 1, 23, 0, 0); PlainTimestamp end = PlainTimestamp.of(2014, 5, 1, 23, 0, 3); TimestampInterval interval = TimestampInterval.between(start, end); interval.stream(Duration.of(1, ClockUnit.NANOS)); } }