DATACMNS-1050 - Encapsulate boundaries in value objects for Range.
We now encapsulate a boundary in Range within a Bound value object. Bound consists of a value and whether the value is inclusive or exclusive. Boundaries without a value are unbounded. We introduced factory methods for Range and Boundary creation using primitives and a builder to build a Range. Range<Long> range = Range.unbounded(); Range<Integer> range = Range.from(Bound.inclusive(10)).to(Bound.inclusive(20)); Range<Integer> range = Range.of(Bound.inclusive(10), Bound.inclusive(20)); Original pull request: #121.
This commit is contained in:
committed by
Oliver Gierke
parent
233fde36b5
commit
22dc91b68f
@@ -18,11 +18,13 @@ package org.springframework.data.domain;
|
||||
import static org.assertj.core.api.Assertions.*;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.data.domain.Range.Bound;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link Range}.
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @author Mark Paluch
|
||||
* @since 1.10
|
||||
*/
|
||||
public class RangeUnitTests {
|
||||
@@ -35,7 +37,7 @@ public class RangeUnitTests {
|
||||
@Test // DATACMNS-651
|
||||
public void usesBoundsInclusivelyByDefault() {
|
||||
|
||||
Range<Long> range = new Range<>(10L, 20L);
|
||||
Range<Long> range = Range.from(10L, 20L);
|
||||
|
||||
assertThat(range.contains(10L)).isTrue();
|
||||
assertThat(range.contains(20L)).isTrue();
|
||||
@@ -68,7 +70,7 @@ public class RangeUnitTests {
|
||||
assertThat(range.contains(25L)).isFalse();
|
||||
}
|
||||
|
||||
@Test // DATACMNS-651
|
||||
@Test // DATACMNS-651, DATACMNS-1050
|
||||
public void handlesOpenUpperBoundCorrectly() {
|
||||
|
||||
Range<Long> range = new Range<>(10L, null);
|
||||
@@ -78,9 +80,12 @@ public class RangeUnitTests {
|
||||
assertThat(range.contains(15L)).isTrue();
|
||||
assertThat(range.contains(5L)).isFalse();
|
||||
assertThat(range.contains(25L)).isTrue();
|
||||
assertThat(range.getLowerBound().isBounded()).isTrue();
|
||||
assertThat(range.getUpperBound().isBounded()).isFalse();
|
||||
assertThat(range.toString()).isEqualTo("[10-unbounded");
|
||||
}
|
||||
|
||||
@Test // DATACMNS-651
|
||||
@Test // DATACMNS-651, DATACMNS-1050
|
||||
public void handlesOpenLowerBoundCorrectly() {
|
||||
|
||||
Range<Long> range = new Range<>(null, 20L);
|
||||
@@ -90,5 +95,103 @@ public class RangeUnitTests {
|
||||
assertThat(range.contains(15L)).isTrue();
|
||||
assertThat(range.contains(5L)).isTrue();
|
||||
assertThat(range.contains(25L)).isFalse();
|
||||
assertThat(range.getLowerBound().isBounded()).isFalse();
|
||||
assertThat(range.getUpperBound().isBounded()).isTrue();
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1050
|
||||
public void createsInclusiveBoundaryCorrectly() {
|
||||
|
||||
Bound<Integer> bound = Bound.inclusive(10);
|
||||
|
||||
assertThat(bound.isInclusive()).isTrue();
|
||||
assertThat(bound.getValue()).contains(10);
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1050
|
||||
public void createsExclusiveBoundaryCorrectly() {
|
||||
|
||||
Bound<Double> bound = Bound.exclusive(10d);
|
||||
|
||||
assertThat(bound.isInclusive()).isFalse();
|
||||
assertThat(bound.getValue()).contains(10d);
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1050
|
||||
public void createsRangeFromBoundariesCorrectly() {
|
||||
|
||||
Bound<Long> lower = Bound.inclusive(10L);
|
||||
Bound<Long> upper = Bound.inclusive(20L);
|
||||
|
||||
Range<Long> range = Range.of(lower, upper);
|
||||
|
||||
assertThat(range.contains(9L)).isFalse();
|
||||
assertThat(range.contains(10L)).isTrue();
|
||||
assertThat(range.contains(20L)).isTrue();
|
||||
assertThat(range.contains(21L)).isFalse();
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1050
|
||||
public void shouldExclusiveBuildRangeLowerFirst() {
|
||||
|
||||
Range<Long> range = Range.from(Bound.exclusive(10L)).to(Bound.exclusive(20L));
|
||||
|
||||
assertThat(range.contains(9L)).isFalse();
|
||||
assertThat(range.contains(10L)).isFalse();
|
||||
assertThat(range.contains(11L)).isTrue();
|
||||
assertThat(range.contains(19L)).isTrue();
|
||||
assertThat(range.contains(20L)).isFalse();
|
||||
assertThat(range.contains(21L)).isFalse();
|
||||
assertThat(range.toString()).isEqualTo("(10-20)");
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1050
|
||||
public void shouldBuildRange() {
|
||||
|
||||
Range<Long> range = Range.from(Bound.inclusive(10L)).to(Bound.inclusive(20L));
|
||||
|
||||
assertThat(range.contains(9L)).isFalse();
|
||||
assertThat(range.contains(10L)).isTrue();
|
||||
assertThat(range.contains(11L)).isTrue();
|
||||
assertThat(range.contains(19L)).isTrue();
|
||||
assertThat(range.contains(20L)).isTrue();
|
||||
assertThat(range.contains(21L)).isFalse();
|
||||
assertThat(range.toString()).isEqualTo("[10-20]");
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1050
|
||||
public void createsUnboundedRange() {
|
||||
|
||||
Range<Long> range = Range.unbounded();
|
||||
|
||||
assertThat(range.contains(10L)).isTrue();
|
||||
assertThat(range.getLowerBound().getValue()).isEmpty();
|
||||
assertThat(range.getUpperBound().getValue()).isEmpty();
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1050
|
||||
public void createsPrimitiveIntInclusiveRange() {
|
||||
|
||||
Range<Integer> range = Range.from(10, 20);
|
||||
|
||||
assertThat(range.contains(9)).isFalse();
|
||||
assertThat(range.contains(10)).isTrue();
|
||||
assertThat(range.contains(11)).isTrue();
|
||||
assertThat(range.contains(19)).isTrue();
|
||||
assertThat(range.contains(20)).isTrue();
|
||||
assertThat(range.contains(21)).isFalse();
|
||||
}
|
||||
|
||||
@Test // DATACMNS-1050
|
||||
public void createsPrimitiveDoubleInclusiveRange() {
|
||||
|
||||
Range<Double> range = Range.from(10d, 20f);
|
||||
|
||||
assertThat(range.contains(9d)).isFalse();
|
||||
assertThat(range.contains(10d)).isTrue();
|
||||
assertThat(range.contains(11d)).isTrue();
|
||||
assertThat(range.contains(19d)).isTrue();
|
||||
assertThat(range.contains(20d)).isTrue();
|
||||
assertThat(range.contains(21d)).isFalse();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import static org.springframework.data.geo.Metrics.*;
|
||||
import org.assertj.core.data.Offset;
|
||||
import org.junit.Test;
|
||||
import org.springframework.data.domain.Range;
|
||||
import org.springframework.data.domain.Range.Bound;
|
||||
import org.springframework.util.SerializationUtils;
|
||||
|
||||
/**
|
||||
@@ -28,6 +29,7 @@ import org.springframework.util.SerializationUtils;
|
||||
*
|
||||
* @author Oliver Gierke
|
||||
* @author Thomas Darimont
|
||||
* @author Mark Paluch
|
||||
*/
|
||||
public class DistanceUnitTests {
|
||||
|
||||
@@ -129,8 +131,8 @@ public class DistanceUnitTests {
|
||||
Range<Distance> range = Distance.between(twoKilometers, tenKilometers);
|
||||
|
||||
assertThat(range).isNotNull();
|
||||
assertThat(range.getLowerBound()).isEqualTo(twoKilometers);
|
||||
assertThat(range.getUpperBound()).isEqualTo(tenKilometers);
|
||||
assertThat(range.getLowerBound()).isEqualTo(Bound.inclusive(twoKilometers));
|
||||
assertThat(range.getUpperBound()).isEqualTo(Bound.inclusive(tenKilometers));
|
||||
}
|
||||
|
||||
@Test // DATACMNS-651
|
||||
@@ -142,8 +144,8 @@ public class DistanceUnitTests {
|
||||
Range<Distance> range = Distance.between(2, KILOMETERS, 10, KILOMETERS);
|
||||
|
||||
assertThat(range).isNotNull();
|
||||
assertThat(range.getLowerBound()).isEqualTo(twoKilometers);
|
||||
assertThat(range.getUpperBound()).isEqualTo(tenKilometers);
|
||||
assertThat(range.getLowerBound()).isEqualTo(Bound.inclusive(twoKilometers));
|
||||
assertThat(range.getUpperBound()).isEqualTo(Bound.inclusive(tenKilometers));
|
||||
}
|
||||
|
||||
@Test // DATACMNS-651
|
||||
|
||||
Reference in New Issue
Block a user