Allow using Range with Comparator.

Remove Comparable requirement for general Range usage. Comparable is only required for the contains(…) check. Alternatively, accept a Comparator.

Closes #2571
This commit is contained in:
Mark Paluch
2022-03-07 09:51:42 +01:00
parent 0e5e869cbf
commit 21e4fd5ffb
2 changed files with 110 additions and 33 deletions

View File

@@ -36,7 +36,7 @@ class RangeUnitTests {
.isThrownBy(() -> Range.from(Bound.inclusive(10L)).to(Bound.inclusive(20L)).contains(null));
}
@Test // DATACMNS-651
@Test // DATACMNS-651, GH-2571
void excludesLowerBoundIfConfigured() {
var range = Range.from(Bound.exclusive(10L)).to(Bound.inclusive(20L));
@@ -46,9 +46,15 @@ class RangeUnitTests {
assertThat(range.contains(15L)).isTrue();
assertThat(range.contains(5L)).isFalse();
assertThat(range.contains(25L)).isFalse();
assertThat(range.contains(10L, Long::compareTo)).isFalse();
assertThat(range.contains(20L, Long::compareTo)).isTrue();
assertThat(range.contains(15L, Long::compareTo)).isTrue();
assertThat(range.contains(5L, Long::compareTo)).isFalse();
assertThat(range.contains(25L, Long::compareTo)).isFalse();
}
@Test // DATACMNS-651
@Test // DATACMNS-651, GH-2571
void excludesUpperBoundIfConfigured() {
var range = Range.of(Bound.inclusive(10L), Bound.exclusive(20L));
@@ -58,9 +64,15 @@ class RangeUnitTests {
assertThat(range.contains(15L)).isTrue();
assertThat(range.contains(5L)).isFalse();
assertThat(range.contains(25L)).isFalse();
assertThat(range.contains(10L, Long::compareTo)).isTrue();
assertThat(range.contains(20L, Long::compareTo)).isFalse();
assertThat(range.contains(15L, Long::compareTo)).isTrue();
assertThat(range.contains(5L, Long::compareTo)).isFalse();
assertThat(range.contains(25L, Long::compareTo)).isFalse();
}
@Test // DATACMNS-651, DATACMNS-1050
@Test // DATACMNS-651, DATACMNS-1050, GH-2571
void handlesOpenUpperBoundCorrectly() {
var range = Range.of(Bound.inclusive(10L), Bound.unbounded());
@@ -70,12 +82,19 @@ class RangeUnitTests {
assertThat(range.contains(15L)).isTrue();
assertThat(range.contains(5L)).isFalse();
assertThat(range.contains(25L)).isTrue();
assertThat(range.contains(10L, Long::compareTo)).isTrue();
assertThat(range.contains(20L, Long::compareTo)).isTrue();
assertThat(range.contains(15L, Long::compareTo)).isTrue();
assertThat(range.contains(5L, Long::compareTo)).isFalse();
assertThat(range.contains(25L, Long::compareTo)).isTrue();
assertThat(range.getLowerBound().isBounded()).isTrue();
assertThat(range.getUpperBound().isBounded()).isFalse();
assertThat(range.toString()).isEqualTo("[10-unbounded");
}
@Test // DATACMNS-651, DATACMNS-1050
@Test // DATACMNS-651, DATACMNS-1050, GH-2571
void handlesOpenLowerBoundCorrectly() {
var range = Range.of(Bound.unbounded(), Bound.inclusive(20L));
@@ -85,10 +104,17 @@ class RangeUnitTests {
assertThat(range.contains(15L)).isTrue();
assertThat(range.contains(5L)).isTrue();
assertThat(range.contains(25L)).isFalse();
assertThat(range.contains(10L, Long::compareTo)).isTrue();
assertThat(range.contains(20L, Long::compareTo)).isTrue();
assertThat(range.contains(15L, Long::compareTo)).isTrue();
assertThat(range.contains(5L, Long::compareTo)).isTrue();
assertThat(range.contains(25L, Long::compareTo)).isFalse();
assertThat(range.getLowerBound().isBounded()).isFalse();
assertThat(range.getUpperBound().isBounded()).isTrue();
}
@Test // DATACMNS-1050
void createsInclusiveBoundaryCorrectly() {
@@ -107,7 +133,7 @@ class RangeUnitTests {
assertThat(bound.getValue()).contains(10d);
}
@Test // DATACMNS-1050
@Test // DATACMNS-1050, GH-2571
void createsRangeFromBoundariesCorrectly() {
var lower = Bound.inclusive(10L);
@@ -119,9 +145,14 @@ class RangeUnitTests {
assertThat(range.contains(10L)).isTrue();
assertThat(range.contains(20L)).isTrue();
assertThat(range.contains(21L)).isFalse();
assertThat(range.contains(9L, Long::compareTo)).isFalse();
assertThat(range.contains(10L, Long::compareTo)).isTrue();
assertThat(range.contains(20L, Long::compareTo)).isTrue();
assertThat(range.contains(21L, Long::compareTo)).isFalse();
}
@Test // DATACMNS-1050
@Test // DATACMNS-1050, GH-2571
void shouldExclusiveBuildRangeLowerFirst() {
var range = Range.from(Bound.exclusive(10L)).to(Bound.exclusive(20L));
@@ -132,10 +163,17 @@ class RangeUnitTests {
assertThat(range.contains(19L)).isTrue();
assertThat(range.contains(20L)).isFalse();
assertThat(range.contains(21L)).isFalse();
assertThat(range.contains(9L, Long::compareTo)).isFalse();
assertThat(range.contains(10L, Long::compareTo)).isFalse();
assertThat(range.contains(11L, Long::compareTo)).isTrue();
assertThat(range.contains(19L, Long::compareTo)).isTrue();
assertThat(range.contains(20L, Long::compareTo)).isFalse();
assertThat(range.contains(21L, Long::compareTo)).isFalse();
assertThat(range.toString()).isEqualTo("(10-20)");
}
@Test // DATACMNS-1050
@Test // DATACMNS-1050, GH-2571
void shouldBuildRange() {
var range = Range.from(Bound.inclusive(10L)).to(Bound.inclusive(20L));
@@ -146,53 +184,73 @@ class RangeUnitTests {
assertThat(range.contains(19L)).isTrue();
assertThat(range.contains(20L)).isTrue();
assertThat(range.contains(21L)).isFalse();
assertThat(range.contains(9L, Long::compareTo)).isFalse();
assertThat(range.contains(10L, Long::compareTo)).isTrue();
assertThat(range.contains(11L, Long::compareTo)).isTrue();
assertThat(range.contains(19L, Long::compareTo)).isTrue();
assertThat(range.contains(20L, Long::compareTo)).isTrue();
assertThat(range.contains(21L, Long::compareTo)).isFalse();
assertThat(range.toString()).isEqualTo("[10-20]");
}
@Test // DATACMNS-1050
@Test // DATACMNS-1050, GH-2571
void createsUnboundedRange() {
Range<Long> range = Range.unbounded();
assertThat(range.contains(10L)).isTrue();
assertThat(range.contains(10L, Long::compareTo)).isTrue();
assertThat(range.getLowerBound().getValue()).isEmpty();
assertThat(range.getUpperBound().getValue()).isEmpty();
}
@Test // DATACMNS-1499
@Test // DATACMNS-1499, GH-2571
void createsOpenRange() {
var range = Range.open(5L, 10L);
assertThat(range.contains(5L)).isFalse();
assertThat(range.contains(10L)).isFalse();
assertThat(range.contains(5L, Long::compareTo)).isFalse();
assertThat(range.contains(10L, Long::compareTo)).isFalse();
}
@Test // DATACMNS-1499
@Test // DATACMNS-1499, GH-2571
void createsClosedRange() {
var range = Range.closed(5L, 10L);
assertThat(range.contains(5L)).isTrue();
assertThat(range.contains(10L)).isTrue();
assertThat(range.contains(5L, Long::compareTo)).isTrue();
assertThat(range.contains(10L, Long::compareTo)).isTrue();
}
@Test // DATACMNS-1499
@Test // DATACMNS-1499, GH-2571
void createsLeftOpenRange() {
var range = Range.leftOpen(5L, 10L);
assertThat(range.contains(5L)).isFalse();
assertThat(range.contains(10L)).isTrue();
assertThat(range.contains(5L, Long::compareTo)).isFalse();
assertThat(range.contains(10L, Long::compareTo)).isTrue();
}
@Test // DATACMNS-1499
@Test // DATACMNS-1499, GH-2571
void createsRightOpenRange() {
var range = Range.rightOpen(5L, 10L);
assertThat(range.contains(5L)).isTrue();
assertThat(range.contains(10L)).isFalse();
assertThat(range.contains(5L, Long::compareTo)).isTrue();
assertThat(range.contains(10L, Long::compareTo)).isFalse();
}
@Test // DATACMNS-1499