/* * Copyright 2011-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.data.geo; import static org.assertj.core.api.Assertions.*; 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; /** * Unit tests for {@link Distance}. * * @author Oliver Gierke * @author Thomas Darimont * @author Mark Paluch */ public class DistanceUnitTests { private static final Offset<Double> EPS = Offset.offset(0.000000001); private static final double TEN_MILES_NORMALIZED = 0.002523219294755161; private static final double TEN_KM_NORMALIZED = 0.001567855942887398; @Test // DATACMNS-437 public void defaultsMetricToNeutralOne() { assertThat(new Distance(2.5).getMetric()).isEqualTo((Metric) Metrics.NEUTRAL); assertThat(new Distance(2.5, null).getMetric()).isEqualTo((Metric) Metrics.NEUTRAL); } @Test // DATACMNS-437 public void addsDistancesWithoutExplicitMetric() { Distance left = new Distance(2.5, KILOMETERS); Distance right = new Distance(2.5, KILOMETERS); assertThat(left.add(right)).isEqualTo(new Distance(5.0, KILOMETERS)); } @Test // DATACMNS-437 public void addsDistancesWithExplicitMetric() { Distance left = new Distance(2.5, KILOMETERS); Distance right = new Distance(2.5, KILOMETERS); assertThat(left.add(right, MILES)).isEqualTo(new Distance(3.106856281073925, MILES)); } @Test // DATACMNS-474 public void distanceWithSameMetricShoudEqualAfterConversion() { assertThat(new Distance(1).in(NEUTRAL)).isEqualTo(new Distance(1)); assertThat(new Distance(TEN_KM_NORMALIZED).in(KILOMETERS)).isEqualTo(new Distance(10, KILOMETERS)); assertThat(new Distance(TEN_MILES_NORMALIZED).in(MILES)).isEqualTo(new Distance(10, MILES)); } @Test // DATACMNS-474 public void distanceWithDifferentMetricShoudEqualAfterConversion() { assertThat(new Distance(10, MILES)).isEqualTo(new Distance(TEN_MILES_NORMALIZED).in(MILES)); assertThat(new Distance(10, KILOMETERS)).isEqualTo(new Distance(TEN_KM_NORMALIZED).in(KILOMETERS)); } @Test // DATACMNS-474 public void conversionShouldProduceCorrectNormalizedValue() { assertThat(new Distance(TEN_KM_NORMALIZED, NEUTRAL).in(KILOMETERS).getNormalizedValue()) .isCloseTo(new Distance(10, KILOMETERS).getNormalizedValue(), EPS); assertThat(new Distance(TEN_KM_NORMALIZED).in(KILOMETERS).getNormalizedValue()) .isCloseTo(new Distance(10, KILOMETERS).getNormalizedValue(), EPS); assertThat(new Distance(TEN_MILES_NORMALIZED).in(MILES).getNormalizedValue()) .isCloseTo(new Distance(10, MILES).getNormalizedValue(), EPS); assertThat(new Distance(TEN_MILES_NORMALIZED).in(MILES).getNormalizedValue()) .isCloseTo(new Distance(16.09344, KILOMETERS).getNormalizedValue(), EPS); assertThat(new Distance(TEN_MILES_NORMALIZED).in(KILOMETERS).getNormalizedValue()) .isCloseTo(new Distance(10, MILES).getNormalizedValue(), EPS); assertThat(new Distance(10, KILOMETERS).in(MILES).getNormalizedValue()) .isCloseTo(new Distance(6.21371192, MILES).getNormalizedValue(), EPS); } @Test // DATACMNS-474 public void toStringAfterConversion() { assertThat(new Distance(10, KILOMETERS).in(MILES).toString()) .isEqualTo(new Distance(6.21371256214785, MILES).toString()); assertThat(new Distance(6.21371256214785, MILES).in(KILOMETERS).toString()) .isEqualTo(new Distance(10, KILOMETERS).toString()); } @Test // DATACMNS-482 public void testSerialization() { Distance dist = new Distance(10, KILOMETERS); Distance serialized = (Distance) SerializationUtils.deserialize(SerializationUtils.serialize(dist)); assertThat(serialized).isEqualTo(dist); } @Test // DATACMNS-626 public void returnsMetricsAbbreviationAsUnit() { assertThat(new Distance(10, KILOMETERS).getUnit()).isEqualTo("km"); } @Test // DATACMNS-651 public void createsARangeCorrectly() { Distance twoKilometers = new Distance(2, KILOMETERS); Distance tenKilometers = new Distance(10, KILOMETERS); Range<Distance> range = Distance.between(twoKilometers, tenKilometers); assertThat(range).isNotNull(); assertThat(range.getLowerBound()).isEqualTo(Bound.inclusive(twoKilometers)); assertThat(range.getUpperBound()).isEqualTo(Bound.inclusive(tenKilometers)); } @Test // DATACMNS-651 public void createsARangeFromPiecesCorrectly() { Distance twoKilometers = new Distance(2, KILOMETERS); Distance tenKilometers = new Distance(10, KILOMETERS); Range<Distance> range = Distance.between(2, KILOMETERS, 10, KILOMETERS); assertThat(range).isNotNull(); assertThat(range.getLowerBound()).isEqualTo(Bound.inclusive(twoKilometers)); assertThat(range.getUpperBound()).isEqualTo(Bound.inclusive(tenKilometers)); } @Test // DATACMNS-651 public void implementsComparableCorrectly() { Distance twoKilometers = new Distance(2, KILOMETERS); Distance tenKilometers = new Distance(10, KILOMETERS); Distance tenKilometersInMiles = new Distance(6.21371256214785, MILES); assertThat(tenKilometers.compareTo(tenKilometers)).isEqualTo(0); assertThat(tenKilometers.compareTo(tenKilometersInMiles)).isEqualTo(0); assertThat(tenKilometersInMiles.compareTo(tenKilometers)).isEqualTo(0); assertThat(twoKilometers.compareTo(tenKilometers)).isLessThan(0); assertThat(tenKilometers.compareTo(twoKilometers)).isGreaterThan(0); } }