diff --git a/packages/pulp-concert/src/pulpconcert/ParkingData/Model/SubTypeOccupancyParkingData.php b/packages/pulp-concert/src/pulpconcert/ParkingData/Model/SubTypeOccupancyParkingData.php index 1bd307a..bb4c814 100644 --- a/packages/pulp-concert/src/pulpconcert/ParkingData/Model/SubTypeOccupancyParkingData.php +++ b/packages/pulp-concert/src/pulpconcert/ParkingData/Model/SubTypeOccupancyParkingData.php @@ -179,7 +179,7 @@ public function getAllPropertiesAsArray(): array /** * @return array */ - public function jsonSerialize() + public function jsonSerialize(): mixed { return $this->getAllPropertiesAsArray(); } diff --git a/packages/pulp-concert/src/pulpconcert/ParkingData/ParseParkingDataHandler.php b/packages/pulp-concert/src/pulpconcert/ParkingData/ParseParkingDataHandler.php index 47fde29..6e041bf 100644 --- a/packages/pulp-concert/src/pulpconcert/ParkingData/ParseParkingDataHandler.php +++ b/packages/pulp-concert/src/pulpconcert/ParkingData/ParseParkingDataHandler.php @@ -42,6 +42,27 @@ protected static function convertPHWerteTrend(string $phWerteString): ?string }; } + /** + * @param SubTypeOccupancyParkingData[] $subTypeOccupancyData + */ + private static function selectTrendSource(array $subTypeOccupancyData): ?SubTypeOccupancyParkingData + { + return array_reduce( + $subTypeOccupancyData, + static function ( + ?SubTypeOccupancyParkingData $carry, + SubTypeOccupancyParkingData $occupancyParkingData + ): SubTypeOccupancyParkingData { + if (!$carry instanceof SubTypeOccupancyParkingData || $carry->getCapacity() < $occupancyParkingData->getOccupancy()) { + return $occupancyParkingData; + } + + return $carry; + }, + null + ); + } + /** * @param SimpleXMLElement $e * @param ParkingData $parkingData @@ -87,14 +108,7 @@ protected static function mapPHWerte(SimpleXMLElement $e, ParkingData $parkingDa $parkingData->setCapacity($shortTermCapacity); $parkingData->setDriveIn($shortTermDriveIn); $parkingData->setDriveOut($shortTermDriveOut); - $parkingData->setTrend(array_reduce($subTypeOccupancyData, static function (SubTypeOccupancyParkingData $carry, SubTypeOccupancyParkingData $occupancyParkingData): SubTypeOccupancyParkingData { - /** @var SubTypeOccupancyParkingData|null $carry */ - if (!$carry instanceof SubTypeOccupancyParkingData || $carry->getCapacity() < $occupancyParkingData->getOccupancy()) { - return $occupancyParkingData; - } - - return $carry; - })->getTrend()); + $parkingData->setTrend(self::selectTrendSource($subTypeOccupancyData)?->getTrend()); $parkingData->setSubTypeOccupancyData($subTypeOccupancyData); return $parkingData; @@ -149,14 +163,7 @@ protected static function mapOcpi2(SimpleXMLElement $e, ParkingData $parkingData $parkingData->setCapacity($shortTermCapacity); $parkingData->setDriveIn($shortTermDriveIn); $parkingData->setDriveOut($shortTermDriveOut); - $parkingData->setTrend(array_reduce($subTypeOccupancyData, static function (SubTypeOccupancyParkingData $carry, SubTypeOccupancyParkingData $occupancyParkingData): SubTypeOccupancyParkingData { - /** @var SubTypeOccupancyParkingData|null $carry */ - if (!$carry instanceof SubTypeOccupancyParkingData || $carry->getCapacity() < $occupancyParkingData->getOccupancy()) { - return $occupancyParkingData; - } - - return $carry; - })->getTrend()); + $parkingData->setTrend(self::selectTrendSource($subTypeOccupancyData)?->getTrend()); $parkingData->setSubTypeOccupancyData($subTypeOccupancyData); return $parkingData; diff --git a/packages/pulp-concert/test/ParkingDataTest.php b/packages/pulp-concert/test/ParkingDataTest.php new file mode 100644 index 0000000..e6c5247 --- /dev/null +++ b/packages/pulp-concert/test/ParkingDataTest.php @@ -0,0 +1,86 @@ +content = new SimpleXMLElement(<<<'XML' + + + + parking-source-id + ocpi2 + + 2024-01-10T10:15:00Z + active + + parking-1 + + 2024-01-10T10:15:00Z + + open + ok + + shortterm + 12 + 40 + increasing + 5 + 2 + 0 + + + shortterm + 18 + 40 + decreasing + 8 + 3 + 0 + + + shortterm + 30 + 40 + constant + 13 + 5 + 15 + + + + +XML); + + $res = Pulp::start() + ->pipe(Pulp::src($file)) + ->pipe(PulpConcert::parseParkingData()) + ->run(); + + $this->assertCount(1, $res); + $parkingData = $res[0]->content['parking-1'] ?? null; + $this->assertInstanceOf(ParkingData::class, $parkingData); + $this->assertSame(30, $parkingData->getOccupancy()); + $this->assertSame(80, $parkingData->getCapacity()); + $this->assertSame(13, $parkingData->getDriveIn()); + $this->assertSame(5, $parkingData->getDriveOut()); + $this->assertSame('increasing', $parkingData->getTrend()); + } +}