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); }