66import static org .junit .jupiter .api .Assertions .assertThrows ;
77import static org .opentripplanner .transit .model ._data .FeedScopedIdForTestFactory .id ;
88
9+ import de .vdv .ojp20 .LineDirectionFilterStructure ;
910import de .vdv .ojp20 .ModeAndModeOfOperationFilterStructure ;
1011import de .vdv .ojp20 .OJPTripRequestStructure ;
12+ import de .vdv .ojp20 .OperatorFilterStructure ;
13+ import de .vdv .ojp20 .PersonalModesEnumeration ;
1114import de .vdv .ojp20 .PlaceContextStructure ;
1215import de .vdv .ojp20 .PlaceRefStructure ;
1316import de .vdv .ojp20 .StopPlaceRefStructure ;
1417import de .vdv .ojp20 .TripParamStructure ;
18+ import de .vdv .ojp20 .siri .LineDirectionStructure ;
19+ import de .vdv .ojp20 .siri .LineRefStructure ;
1520import de .vdv .ojp20 .siri .LocationStructure ;
21+ import de .vdv .ojp20 .siri .OperatorRefStructure ;
1622import de .vdv .ojp20 .siri .StopPointRefStructure ;
1723import de .vdv .ojp20 .siri .VehicleModesOfTransportEnumeration ;
1824import java .time .Duration ;
25+ import java .util .List ;
26+ import java .util .stream .Stream ;
1927import org .junit .jupiter .api .Test ;
28+ import org .junit .jupiter .params .ParameterizedTest ;
29+ import org .junit .jupiter .params .provider .Arguments ;
30+ import org .junit .jupiter .params .provider .MethodSource ;
2031import org .opentripplanner .api .model .transit .DefaultFeedIdMapper ;
2132import org .opentripplanner .routing .api .request .RouteRequest ;
33+ import org .opentripplanner .routing .api .request .StreetMode ;
2234
2335class RouteRequestMapperTest {
2436
@@ -37,7 +49,9 @@ void mapWithCoordinates() {
3749 assertEquals (8.5417 , routeRequest .from ().lng );
3850 assertEquals (46.9480 , routeRequest .to ().lat );
3951 assertEquals (7.4474 , routeRequest .to ().lng );
40- assertTransitFilters (routeRequest , "[ALLOW_ALL]" );
52+ assertTransitFilters ("[ALLOW_ALL]" , routeRequest );
53+
54+ assertEquals (StreetMode .WALK , routeRequest .journey ().access ().mode ());
4155 }
4256
4357 @ Test
@@ -161,7 +175,76 @@ void excludeMode() {
161175
162176 var routeRequest = mapper .map (tripRequest );
163177
164- assertTransitFilters (routeRequest , "[(not: [(transportModes: [RAIL])])]" );
178+ assertTransitFilters ("[(not: [(transportModes: [RAIL])])]" , routeRequest );
179+ }
180+
181+ private static List <Arguments > transitFilterCases () {
182+ return List .of (
183+ Arguments .of (
184+ "[(select: [(transportModes: EMPTY, agencies: [F:agency1])])]" ,
185+ new TripParamStructure ()
186+ .withOperatorFilter (
187+ new OperatorFilterStructure ()
188+ .withExclude (false )
189+ .withOperatorRef (List .of (new OperatorRefStructure ().withValue ("F:agency1" )))
190+ )
191+ ),
192+ Arguments .of (
193+ "[(not: [(transportModes: EMPTY, agencies: [F:agency1])])]" ,
194+ new TripParamStructure ()
195+ .withOperatorFilter (
196+ new OperatorFilterStructure ()
197+ .withExclude (true )
198+ .withOperatorRef (List .of (new OperatorRefStructure ().withValue ("F:agency1" )))
199+ )
200+ ),
201+ Arguments .of (
202+ "[(select: [(transportModes: EMPTY, routes: [F:route1])])]" ,
203+ new TripParamStructure ()
204+ .withLineFilter (
205+ new LineDirectionFilterStructure ()
206+ .withExclude (false )
207+ .withLine (
208+ (new LineDirectionStructure ()
209+ .withLineRef (new LineRefStructure ().withValue ("F:route1" )))
210+ )
211+ )
212+ ),
213+ Arguments .of (
214+ "[(not: [(transportModes: EMPTY, routes: [F:agency1])])]" ,
215+ new TripParamStructure ()
216+ .withLineFilter (
217+ new LineDirectionFilterStructure ()
218+ .withExclude (true )
219+ .withLine (
220+ (new LineDirectionStructure ()
221+ .withLineRef (new LineRefStructure ().withValue ("F:agency1" )))
222+ )
223+ )
224+ ),
225+ Arguments .of (
226+ "[(not: [(transportModes: EMPTY, routes: [B:route2, A:route1])])]" ,
227+ new TripParamStructure ()
228+ .withLineFilter (
229+ new LineDirectionFilterStructure ()
230+ .withExclude (true )
231+ .withLine (
232+ new LineDirectionStructure ()
233+ .withLineRef (new LineRefStructure ().withValue ("A:route1" )),
234+ new LineDirectionStructure ()
235+ .withLineRef (new LineRefStructure ().withValue ("B:route2" ))
236+ )
237+ )
238+ )
239+ );
240+ }
241+
242+ @ ParameterizedTest
243+ @ MethodSource ("transitFilterCases" )
244+ void transitFilter (String expectedFilter , TripParamStructure tripParamStructure ) {
245+ var tripRequest = baseRequest ().withParams (tripParamStructure );
246+ var routeRequest = mapper .map (tripRequest );
247+ assertTransitFilters (expectedFilter , routeRequest );
165248 }
166249
167250 @ Test
@@ -174,13 +257,72 @@ void mapAdditionalTransferTime() {
174257 assertEquals (Duration .ofMinutes (10 ), routeRequest .preferences ().transfer ().slack ());
175258 }
176259
260+ private static List <Arguments > personalModeCase () {
261+ return List .of (
262+ Arguments .of (PersonalModesEnumeration .FOOT , StreetMode .WALK ),
263+ Arguments .of (PersonalModesEnumeration .CAR , StreetMode .CAR )
264+ );
265+ }
266+
267+ @ ParameterizedTest
268+ @ MethodSource ("personalModeCase" )
269+ void personalMode (PersonalModesEnumeration personalMode , StreetMode expectedMode ) {
270+ var tripRequest = baseRequest ()
271+ .withParams (
272+ new TripParamStructure ()
273+ .withModeAndModeOfOperationFilter (
274+ new ModeAndModeOfOperationFilterStructure ()
275+ .withExclude (false )
276+ .withPersonalMode (personalMode )
277+ )
278+ );
279+
280+ var routeRequest = mapper .map (tripRequest );
281+
282+ assertEquals (expectedMode , routeRequest .journey ().access ().mode ());
283+ }
284+
285+ private static Stream <TripParamStructure > invalidPersonalModeCases () {
286+ return Stream .of (
287+ new TripParamStructure ()
288+ .withModeAndModeOfOperationFilter (
289+ new ModeAndModeOfOperationFilterStructure ()
290+ .withExclude (true )
291+ .withPersonalMode (PersonalModesEnumeration .BICYCLE )
292+ ),
293+ new TripParamStructure ()
294+ .withModeAndModeOfOperationFilter (
295+ new ModeAndModeOfOperationFilterStructure ()
296+ .withExclude (false )
297+ .withPersonalMode (PersonalModesEnumeration .BICYCLE , PersonalModesEnumeration .CAR )
298+ ),
299+ new TripParamStructure ()
300+ .withModeAndModeOfOperationFilter (
301+ new ModeAndModeOfOperationFilterStructure ()
302+ .withExclude (false )
303+ .withPersonalMode (PersonalModesEnumeration .BICYCLE ),
304+ new ModeAndModeOfOperationFilterStructure ()
305+ .withExclude (false )
306+ .withPersonalMode (PersonalModesEnumeration .FOOT )
307+ )
308+ );
309+ }
310+
311+ @ ParameterizedTest
312+ @ MethodSource ("invalidPersonalModeCases" )
313+ void throwsExceptionForUnsupportedPersonalMode (TripParamStructure tripParamStructure ) {
314+ var tripRequest = baseRequest ().withParams (tripParamStructure );
315+
316+ assertThrows (IllegalArgumentException .class , () -> mapper .map (tripRequest ));
317+ }
318+
177319 private static OJPTripRequestStructure baseRequest () {
178320 return new OJPTripRequestStructure ()
179321 .withOrigin (geoPosition (47.3769 , 8.5417 ))
180322 .withDestination (geoPosition (46.9480 , 7.4474 ));
181323 }
182324
183- private static void assertTransitFilters (RouteRequest routeRequest , String expected ) {
325+ private static void assertTransitFilters (String expected , RouteRequest routeRequest ) {
184326 assertEquals (expected , routeRequest .journey ().transit ().filters ().toString ());
185327 }
186328
0 commit comments