OpenTripPlanner/application/src/test/java/org/opentripplanner/service/worldenvelope/model/WorldEnvelopeTest.java
Leonard Ehrenfried ab17160b38
Fix all package names and imports
# Conflicts:
#	application/src/test-fixtures/java/org/opentripplanner/transit/model/site/TestStopLocation.java
#	application/src/test/java/org/opentripplanner/transit/service/DefaultTransitServiceTest.java

# Conflicts:
#	application/src/ext-test/java/org/opentripplanner/ext/flex/FlexIntegrationTest.java
#	application/src/ext/java/org/opentripplanner/ext/carpooling/model/CarpoolLeg.java
#	application/src/ext/java/org/opentripplanner/ext/flex/FlexTransferIndex.java
#	application/src/ext/java/org/opentripplanner/ext/reportapi/model/TransfersReport.java
#	application/src/main/java/org/opentripplanner/apis/transmodel/model/EnumTypes.java
#	application/src/main/java/org/opentripplanner/graph_builder/GraphBuilder.java
#	application/src/main/java/org/opentripplanner/gtfs/interlining/InterlineProcessor.java
#	application/src/main/java/org/opentripplanner/model/plan/Leg.java
#	application/src/main/java/org/opentripplanner/model/plan/leg/ScheduledTransitLeg.java
#	application/src/main/java/org/opentripplanner/routing/algorithm/mapping/RaptorPathToItineraryMapper.java
#	application/src/main/java/org/opentripplanner/routing/algorithm/raptoradapter/transit/request/RaptorRequestTransferCache.java
#	application/src/main/java/org/opentripplanner/transfer/regular/TransferRepository.java
#	application/src/main/java/org/opentripplanner/transfer/regular/internal/DefaultTransferRepository.java
#	application/src/main/java/org/opentripplanner/transfer/regular/model/PathTransfer.java
#	application/src/test/java/org/opentripplanner/apis/transmodel/mapping/TripRequestMapperTest.java
#	application/src/test/java/org/opentripplanner/routing/algorithm/GraphRoutingTest.java

# Conflicts:
#	application/src/ext-test/java/org/opentripplanner/ext/vectortiles/layers/stops/StopsLayerTest.java
#	application/src/main/java/org/opentripplanner/updater/configure/UpdaterConfigurator.java
#	application/src/test/java/org/opentripplanner/service/vehicleparking/VehicleParkingTestGraphData.java

# Conflicts:
#	application/src/main/java/org/opentripplanner/updater/trip/gtfs/TripTimesUpdater.java

# Conflicts:
#	application/src/test/java/org/opentripplanner/graph_builder/module/islandpruning/SubgraphOnlyFerryTest.java

# Conflicts:
#	application/src/test/java/org/opentripplanner/apis/gtfs/mapping/routerequest/LegacyRouteRequestMapperTest.java
2026-02-16 10:58:51 +01:00

119 lines
4.6 KiB
Java

package org.opentripplanner.service.worldenvelope.model;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.opentripplanner.street.geometry.WgsCoordinate;
class WorldEnvelopeTest {
private static final int S10 = -10;
private static final int S20 = -20;
private static final int N30 = 30;
private static final int N40 = 40;
private static final int E50 = 50;
private static final int E160 = 160;
private static final int W60 = -60;
private static final int W170 = -170;
/**
* To make sure we cover all cases we add a case for each combination of:
* - latitude
* - south hemisphere
* - north hemisphere
* - both sides of the equator
* - longitude
* - east side of 0º (Greenwich)
* - west side of 0º
* - both sides of 0º
* - both sides of 180º
* Skip cases for North- and South-pole - not relevant - obscure cases)
*/
static List<Arguments> testCases() {
return List.of(
// name, lower-lat, left-lon, upper-lat, right-lon, center-lat, center-lon
Arguments.of("South-East", S20, E50, S10, E160, -15d, 105d),
Arguments.of("Equator-East", S10, E50, N30, E160, 10d, 105d),
Arguments.of("North-East", N30, E50, N40, E160, 35d, 105d),
Arguments.of("South-West", S20, W170, S10, W60, -15d, -115d),
Arguments.of("Equator-West", S10, W170, N30, W60, 10d, -115d),
Arguments.of("North-West", N30, W170, N40, W60, 35d, -115d),
Arguments.of("North-Greenwich", N30, W60, N40, E50, 35d, -5d),
Arguments.of("Equator-Greenwich", S10, W60, N30, E50, 10d, -5d),
Arguments.of("South-Greenwich", S20, W60, S10, E50, -15d, -5d),
Arguments.of("North-180º", N30, E160, N40, W170, 35d, 175d),
Arguments.of("Equator-180º", S10, E160, N30, W170, 10d, 175d),
Arguments.of("South-180º", S20, E160, S10, W170, -15d, 175d)
);
}
@ParameterizedTest
@MethodSource("testCases")
void testWorldEnvelope(
String name,
double lowerLat,
double leftLon,
double upperLat,
double rightLon,
double centerLat,
double centerLon
) {
// Add a point close to the center
var median = new WgsCoordinate(centerLat + 1.0, centerLon + 1.0);
// WorldEnvelope should normalize to lower-left and upper-right
// Add lower-right & upper-left the world-envelope
var subjectWithoutMedian = WorldEnvelope.of()
.expandToIncludeStreetEntities(lowerLat, rightLon)
.expandToIncludeStreetEntities(upperLat, leftLon)
.build();
// Add the ~middle point between each corner of the envelope + median point
// We offset the one center value to the "other" side of the median by adding 2.0
var subjectWithMedian = WorldEnvelope.of()
.expandToIncludeTransitEntities(
List.of(
new WgsCoordinate(upperLat, centerLon),
new WgsCoordinate(lowerLat, centerLon + 2d),
new WgsCoordinate(centerLat, rightLon),
new WgsCoordinate(centerLat + 2d, leftLon),
median
),
WgsCoordinate::latitude,
WgsCoordinate::longitude
)
.build();
for (WorldEnvelope subject : List.of(subjectWithoutMedian, subjectWithMedian)) {
assertEquals(lowerLat, subject.lowerLeft().latitude(), name + " lower-latitude");
assertEquals(leftLon, subject.lowerLeft().longitude(), name + " left-longitude");
assertEquals(upperLat, subject.upperRight().latitude(), name + " upper-latitude");
assertEquals(rightLon, subject.upperRight().longitude(), name + " right-longitude");
assertEquals(centerLat, subject.meanCenter().latitude(), name + " center-latitude");
assertEquals(centerLon, subject.meanCenter().longitude(), name + " center-longitude");
}
assertTrue(
subjectWithoutMedian.medianCenter().isEmpty(),
"First envelope does not have a median"
);
assertTrue(subjectWithMedian.medianCenter().isPresent(), "Second envelope does have a median");
assertEquals(median, subjectWithMedian.medianCenter().get(), name + " median");
}
@Test
void testWorldEnvelopeToString() {
assertEquals(
"WorldEnvelope{lowerLeft: (-10.0, -60.0), upperRight: (40.0, 50.0), meanCenter: (15.0, -5.0)}",
WorldEnvelope.of()
.expandToIncludeStreetEntities(S10, E50)
.expandToIncludeStreetEntities(N40, W60)
.build()
.toString()
);
}
}