55import static org .junit .jupiter .api .Assertions .assertNotNull ;
66import static org .opentripplanner .transit .model ._data .FeedScopedIdForTestFactory .id ;
77import static org .opentripplanner .updater .spi .UpdateResultAssertions .assertFailure ;
8+ import static org .opentripplanner .updater .spi .UpdateResultAssertions .assertSuccess ;
89
910import org .junit .jupiter .api .Test ;
1011import org .opentripplanner .core .model .id .FeedScopedId ;
1112import org .opentripplanner .transit .model ._data .TransitTestEnvironment ;
1213import org .opentripplanner .transit .model ._data .TransitTestEnvironmentBuilder ;
1314import org .opentripplanner .transit .model ._data .TripInput ;
15+ import org .opentripplanner .transit .model .basic .SubMode ;
16+ import org .opentripplanner .transit .model .basic .TransitMode ;
1417import org .opentripplanner .transit .model .network .Route ;
1518import org .opentripplanner .transit .model .organization .Operator ;
1619import org .opentripplanner .transit .model .site .RegularStop ;
2225import org .opentripplanner .updater .trip .RealtimeTestConstants ;
2326import org .opentripplanner .updater .trip .SiriTestHelper ;
2427import org .opentripplanner .updater .trip .siri .SiriEtBuilder ;
28+ import uk .org .siri .siri21 .VehicleModesEnumeration ;
2529
2630class ExtraJourneyTest implements RealtimeTestConstants {
2731
2832 private static final String ADDED_TRIP_ID = "newJourney" ;
2933 private static final String OPERATOR_ID = "operatorId" ;
3034 private static final String ROUTE_ID = "routeId" ;
35+ private static final String RAIL_ROUTE_ID = "railRouteId" ;
3136
3237 private final TransitTestEnvironmentBuilder ENV_BUILDER = TransitTestEnvironment .of ();
3338 private final RegularStop STOP_A = ENV_BUILDER .stop (STOP_A_ID );
@@ -43,6 +48,15 @@ class ExtraJourneyTest implements RealtimeTestConstants {
4348 .addStop (STOP_A , "0:00:10" , "0:00:11" )
4449 .addStop (STOP_B , "0:00:20" , "0:00:21" );
4550
51+ private final Route RAIL_ROUTE = ENV_BUILDER .route (RAIL_ROUTE_ID , r ->
52+ r .withMode (TransitMode .RAIL )
53+ );
54+
55+ private final TripInput RAIL_TRIP_INPUT = TripInput .of ("railTrip1" )
56+ .withRoute (RAIL_ROUTE )
57+ .addStop (STOP_A , "0:00:10" , "0:00:11" )
58+ .addStop (STOP_B , "0:00:20" , "0:00:21" );
59+
4660 @ Test
4761 void testAddJourneyWithExistingRoute () {
4862 var env = ENV_BUILDER .addTrip (TRIP_1_INPUT ).build ();
@@ -134,11 +148,9 @@ void testAddJourneyMultipleTimes() {
134148 var updates = createValidAddedJourney (siri ).buildEstimatedTimetableDeliveries ();
135149
136150 int numTrips = env .transitService ().listTrips ().size ();
137- var result1 = siri .applyEstimatedTimetable (updates );
138- assertEquals (1 , result1 .successful ());
151+ assertSuccess (siri .applyEstimatedTimetable (updates ));
139152 assertEquals (numTrips + 1 , env .transitService ().listTrips ().size ());
140- var result2 = siri .applyEstimatedTimetable (updates );
141- assertEquals (1 , result2 .successful ());
153+ assertSuccess (siri .applyEstimatedTimetable (updates ));
142154 assertEquals (numTrips + 1 , env .transitService ().listTrips ().size ());
143155
144156 assertThat (env .raptorData ().summarizePatterns ()).containsExactly (
@@ -193,9 +205,7 @@ void testReplaceJourney() {
193205 .withEstimatedCalls (builder -> builder .call (STOP_C ).arriveAimedExpected ("00:03" , "00:04" ))
194206 .buildEstimatedTimetableDeliveries ();
195207
196- var result = siri .applyEstimatedTimetable (updates );
197-
198- assertEquals (1 , result .successful ());
208+ assertSuccess (siri .applyEstimatedTimetable (updates ));
199209
200210 assertEquals (
201211 "ADDED | A [R] 0:02 0:02 | C 0:04 0:04" ,
@@ -242,6 +252,118 @@ void testReplaceJourneyWithoutEstimatedVehicleJourneyCode() {
242252 assertFailure (UpdateError .UpdateErrorType .UNKNOWN , result );
243253 }
244254
255+ @ Test
256+ void testAddJourneyWithNewRouteAndShortName () {
257+ var env = ENV_BUILDER .addTrip (TRIP_1_INPUT ).build ();
258+ var siri = SiriTestHelper .of (env );
259+
260+ String newRouteRef = "newRouteForShortName" ;
261+ var updates = createValidAddedJourney (siri )
262+ .withLineRef (newRouteRef )
263+ .withPublishedLineName ("L1" )
264+ .buildEstimatedTimetableDeliveries ();
265+
266+ assertSuccess (siri .applyEstimatedTimetable (updates ));
267+
268+ Route newRoute = env .transitService ().getRoute (id (newRouteRef ));
269+ assertEquals (
270+ "L1" ,
271+ newRoute .getShortName (),
272+ "PublishedLineName should be mapped to the new route short name"
273+ );
274+ }
275+
276+ @ Test
277+ void testAddJourneyWithNewRouteAndOperator () {
278+ var env = ENV_BUILDER .addTrip (TRIP_1_INPUT ).build ();
279+ var siri = SiriTestHelper .of (env );
280+
281+ String newRouteRef = "newRouteForOperator" ;
282+ var updates = createValidAddedJourney (siri )
283+ .withLineRef (newRouteRef )
284+ .buildEstimatedTimetableDeliveries ();
285+
286+ assertSuccess (siri .applyEstimatedTimetable (updates ));
287+
288+ Trip trip = env .transitService ().getTrip (id (ADDED_TRIP_ID ));
289+ assertNotNull (trip );
290+ assertEquals (
291+ OPERATOR ,
292+ trip .getOperator (),
293+ "The new trip is assigned to the operator specified in OperatorRef"
294+ );
295+ }
296+
297+ @ Test
298+ void testAddJourneyWithNewRouteResolvesAgencyFromOperator () {
299+ var env = ENV_BUILDER .addTrip (TRIP_1_INPUT ).build ();
300+ var siri = SiriTestHelper .of (env );
301+
302+ String newRouteRef = "newRouteForAgency" ;
303+ var updates = createValidAddedJourney (siri )
304+ .withLineRef (newRouteRef )
305+ .buildEstimatedTimetableDeliveries ();
306+
307+ var result = siri .applyEstimatedTimetable (updates );
308+ assertEquals (1 , result .successful ());
309+
310+ Route newRoute = env .transitService ().getRoute (id (newRouteRef ));
311+ assertNotNull (newRoute );
312+ assertEquals (
313+ ROUTE .getAgency (),
314+ newRoute .getAgency (),
315+ "The new route agency should be mapped to the agency of any existing route that has the same operator"
316+ );
317+ }
318+
319+ @ Test
320+ void testAddJourneyBusReplacingRailHasRailReplacementSubmode () {
321+ var env = ENV_BUILDER .addTrip (TRIP_1_INPUT ).addTrip (RAIL_TRIP_INPUT ).build ();
322+ var siri = SiriTestHelper .of (env );
323+
324+ String newRouteRef = "busReplacementRoute" ;
325+ var updates = createValidAddedJourney (siri )
326+ .withLineRef (newRouteRef )
327+ .withExternalLineRef (RAIL_ROUTE_ID )
328+ .withVehicleMode (VehicleModesEnumeration .BUS )
329+ .buildEstimatedTimetableDeliveries ();
330+
331+ assertSuccess (siri .applyEstimatedTimetable (updates ));
332+
333+ Route newRoute = env .transitService ().getRoute (id (newRouteRef ));
334+ assertNotNull (newRoute );
335+ assertEquals (TransitMode .BUS , newRoute .getMode ());
336+ assertEquals (
337+ SubMode .of ("railReplacementBus" ),
338+ newRoute .getNetexSubmode (),
339+ "When an added bus trip is assigned to an existing rail route, the submode should be 'railReplacementBus'"
340+ );
341+ }
342+
343+ @ Test
344+ void testAddJourneyRailReplacingRailHasReplacementRailSubmode () {
345+ var env = ENV_BUILDER .addTrip (TRIP_1_INPUT ).addTrip (RAIL_TRIP_INPUT ).build ();
346+ var siri = SiriTestHelper .of (env );
347+
348+ String newRouteRef = "railReplacementRoute" ;
349+ var updates = createValidAddedJourney (siri )
350+ .withLineRef (newRouteRef )
351+ .withExternalLineRef (RAIL_ROUTE_ID )
352+ .withVehicleMode (VehicleModesEnumeration .RAIL )
353+ .buildEstimatedTimetableDeliveries ();
354+
355+ assertSuccess (siri .applyEstimatedTimetable (updates ));
356+
357+ Route newRoute = env .transitService ().getRoute (id (newRouteRef ));
358+ assertNotNull (newRoute );
359+ assertEquals (TransitMode .RAIL , newRoute .getMode ());
360+ assertEquals (
361+ SubMode .of ("replacementRailService" ),
362+ newRoute .getNetexSubmode (),
363+ "When an added rail trip is assigned to an existing rail route, the submode should be 'replacementRailService'"
364+ );
365+ }
366+
245367 private SiriEtBuilder createValidAddedJourney (SiriTestHelper siri ) {
246368 return siri
247369 .etBuilder ()
0 commit comments