public function testSortJourneysWithTransferAtStart()
 {
     $schedule = new TransferPatternSchedule([new TransferPatternLeg([new Leg([new TimetableConnection("B", "C", 1020, 1045, "LN1121", "LN")]), new Leg([new TimetableConnection("B", "C", 1100, 1145, "LN1122", "LN")]), new Leg([new TimetableConnection("B", "C", 1200, 1215, "LN1123", "LN")])]), new TransferPatternLeg([new Leg([new TimetableConnection("C", "D", 1120, 1145, "LN1131", "LN")]), new Leg([new TimetableConnection("C", "D", 1200, 1245, "LN1132", "LN")]), new Leg([new TimetableConnection("C", "D", 1300, 1315, "LN1133", "LN")])])]);
     $schedule2 = new TransferPatternSchedule([new TransferPatternLeg([new Leg([new TimetableConnection("B", "C", 1025, 1050, "LN1121", "LN")]), new Leg([new TimetableConnection("B", "C", 1105, 1150, "LN1122", "LN")]), new Leg([new TimetableConnection("B", "C", 1205, 1250, "LN1123", "LN")])]), new TransferPatternLeg([new Leg([new TimetableConnection("C", "D", 1125, 1150, "LN1131", "LN")]), new Leg([new TimetableConnection("C", "D", 1205, 1250, "LN1132", "LN")]), new Leg([new TimetableConnection("C", "D", 1305, 1320, "LN1133", "LN")])])]);
     $nonTimetable = ["A" => [new NonTimetableConnection("A", "B", 10)]];
     $mock = $this->createMock(ScheduleProvider::class);
     $mock->method('getInterchangeTimes')->willReturn([]);
     $mock->method('getNonTimetableConnections')->willReturn($nonTimetable);
     $mock->method('getTimetable')->willReturn([$schedule, $schedule2]);
     $scanner = new MultiSchedulePlanner($mock, [new SlowJourneyFilter()]);
     $journeys = $scanner->getJourneys(["A"], ["D"], 900);
     $this->assertEquals([new Journey([new Leg([new NonTimetableConnection("A", "B", 10)]), new Leg([new TimetableConnection("B", "C", 1020, 1045, "LN1121", "LN")]), new Leg([new TimetableConnection("C", "D", 1120, 1145, "LN1131", "LN")])]), new Journey([new Leg([new NonTimetableConnection("A", "B", 10)]), new Leg([new TimetableConnection("B", "C", 1025, 1050, "LN1121", "LN")]), new Leg([new TimetableConnection("C", "D", 1125, 1150, "LN1131", "LN")])]), new Journey([new Leg([new NonTimetableConnection("A", "B", 10)]), new Leg([new TimetableConnection("B", "C", 1100, 1145, "LN1122", "LN")]), new Leg([new TimetableConnection("C", "D", 1200, 1245, "LN1132", "LN")])]), new Journey([new Leg([new NonTimetableConnection("A", "B", 10)]), new Leg([new TimetableConnection("B", "C", 1105, 1150, "LN1122", "LN")]), new Leg([new TimetableConnection("C", "D", 1205, 1250, "LN1132", "LN")])]), new Journey([new Leg([new NonTimetableConnection("A", "B", 10)]), new Leg([new TimetableConnection("B", "C", 1200, 1215, "LN1123", "LN")]), new Leg([new TimetableConnection("C", "D", 1300, 1315, "LN1133", "LN")])]), new Journey([new Leg([new NonTimetableConnection("A", "B", 10)]), new Leg([new TimetableConnection("B", "C", 1205, 1250, "LN1123", "LN")]), new Leg([new TimetableConnection("C", "D", 1305, 1320, "LN1133", "LN")])])], $journeys);
 }
 /**
  * @param Application $app
  * @param Request $request
  *
  * @return JsonResponse
  */
 public function __invoke(Application $app, Request $request)
 {
     /** @var StationProvider $stationProvider */
     $stationProvider = $app['provider.station'];
     /** @var ScheduleProvider $scheduleProvider */
     $scheduleProvider = $app['provider.schedule'];
     $targetTime = strtotime($request->get('date') . " UTC");
     $origins = $stationProvider->getRelevantStations($request->get('origin'));
     $destinations = $stationProvider->getRelevantStations($request->get('destination'));
     $planner = new MultiSchedulePlanner($scheduleProvider, [new SlowJourneyFilter()]);
     $journeys = $planner->getJourneys($origins, $destinations, $targetTime);
     $views = array_map(function (Journey $journey) {
         return new JourneyView($journey);
     }, $journeys);
     return new JsonResponse($views);
 }
 private function planMutlipleJourneys(OutputInterface $out, $origin, $destination, $targetTime)
 {
     $this->outputHeading($out, "Journey Planner");
     $locations = $this->outputTask($out, "Loading locations", function () {
         return $this->stationProvider->getLocations();
     });
     $results = $this->outputTask($out, "Plan journeys", function () use($targetTime, $origin, $destination) {
         $origins = $this->stationProvider->getRelevantStations($origin);
         $destinations = $this->stationProvider->getRelevantStations($destination);
         $scanner = new MultiSchedulePlanner($this->scheduleProvider, [new SlowJourneyFilter()]);
         return $scanner->getJourneys($origins, $destinations, $targetTime);
     });
     foreach ($results as $journey) {
         $this->displayRoute($out, $locations, $journey);
     }
     $this->outputMemoryUsage($out);
 }