diff --git a/src/main/java/org/opentripplanner/middleware/triptracker/TravelerLocator.java b/src/main/java/org/opentripplanner/middleware/triptracker/TravelerLocator.java index 2cfa5d694..87b927333 100644 --- a/src/main/java/org/opentripplanner/middleware/triptracker/TravelerLocator.java +++ b/src/main/java/org/opentripplanner/middleware/triptracker/TravelerLocator.java @@ -282,7 +282,9 @@ private static int getNearestPointIndex(List positions, Coordinates } private static List getIntermediateAndLastStop(Leg leg) { - ArrayList stops = new ArrayList<>(leg.intermediateStops); + ArrayList stops = leg.intermediateStops == null + ? new ArrayList<>() + : new ArrayList<>(leg.intermediateStops); stops.add(leg.to); return stops; } diff --git a/src/test/java/org/opentripplanner/middleware/triptracker/ManageLegTraversalTest.java b/src/test/java/org/opentripplanner/middleware/triptracker/ManageLegTraversalTest.java index 8cb9027f0..a643b24e9 100644 --- a/src/test/java/org/opentripplanner/middleware/triptracker/ManageLegTraversalTest.java +++ b/src/test/java/org/opentripplanner/middleware/triptracker/ManageLegTraversalTest.java @@ -3,6 +3,7 @@ import io.leonard.PolylineUtils; import io.leonard.Position; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -11,6 +12,7 @@ import org.opentripplanner.middleware.models.TrackedJourney; import org.opentripplanner.middleware.otp.response.Itinerary; import org.opentripplanner.middleware.otp.response.Leg; +import org.opentripplanner.middleware.otp.response.Place; import org.opentripplanner.middleware.otp.response.Step; import org.opentripplanner.middleware.testutils.CommonTestUtils; import org.opentripplanner.middleware.triptracker.instruction.DeviatedInstruction; @@ -46,6 +48,7 @@ public class ManageLegTraversalTest { private static Itinerary adairAvenueToMonroeDriveItinerary; private static Itinerary midtownToAnsleyItinerary; + private static List midtownToAnsleyIntermediateStops; private static final Locale locale = Locale.US; @@ -70,6 +73,13 @@ public static void setUp() throws IOException { CommonTestUtils.getTestResourceAsString("controllers/api/27nb-midtown-to-ansley.json"), Itinerary.class ); + // Hold on to the original list of intermediate stops (some tests will overwrite it) + midtownToAnsleyIntermediateStops = midtownToAnsleyItinerary.legs.get(1).intermediateStops; + } + + @BeforeEach + void beforeEach() { + midtownToAnsleyItinerary.legs.get(1).intermediateStops = midtownToAnsleyIntermediateStops; } @ParameterizedTest @@ -323,6 +333,12 @@ private static Stream createTurnByTurnTrace() { void canTrackTransitRide(TraceData traceData) { Itinerary itinerary = midtownToAnsleyItinerary; Leg transitLeg = itinerary.legs.get(1); + + // In some cases, simulate missing intermediateStops field from OTP. Tests should still run to end. + if (traceData.dismissIntermediateStops) { + transitLeg.intermediateStops = null; + } + TravelerPosition travelerPosition = new TravelerPosition(transitLeg, traceData.position, traceData.speed); String tripInstruction = TravelerLocator.getInstruction(traceData.tripStatus, travelerPosition, false); assertEquals(traceData.expectedInstruction, Objects.requireNonNullElse(tripInstruction, NO_INSTRUCTION), traceData.message); @@ -386,7 +402,8 @@ private static Stream createTransitRideTrace() { new TraceData( new Coordinates(33.79478, -84.37127), String.format("Get off at next stop (%s)", destinationName), - "Past the one-stop warning from the stop where you should get off." + "Past the one-stop warning from the stop where you should get off.", + true ) ), Arguments.of( @@ -505,6 +522,7 @@ private static class TraceData { int speed; String expectedInstruction; boolean isStartOfTrip; + boolean dismissIntermediateStops; String message; public TraceData(Coordinates position, String expectedInstruction, boolean isStartOfTrip, String message) { @@ -518,6 +536,11 @@ public TraceData(Coordinates position, String expectedInstruction, String messag this(position, expectedInstruction, false, message); } + public TraceData(Coordinates position, String expectedInstruction, String message, boolean dismissIntermediateStops) { + this(position, expectedInstruction, false, message); + this.dismissIntermediateStops = true; + } + public TraceData(Coordinates position, int speed, String expectedInstruction, String message) { this(position, expectedInstruction, false, message); this.speed = speed;