From db83565c54a2b97ad9cf3e83314775193876be43 Mon Sep 17 00:00:00 2001 From: Li Zhineng Date: Mon, 12 May 2025 19:27:10 +0800 Subject: determine if clean energy --- src/RegistrationNumber.php | 38 +++++++++++++++++++++++++++++++++++++- tests/RegistrationNumberTest.php | 20 ++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/RegistrationNumber.php b/src/RegistrationNumber.php index 6e729e3..3f6edcc 100644 --- a/src/RegistrationNumber.php +++ b/src/RegistrationNumber.php @@ -134,10 +134,23 @@ final readonly class RegistrationNumber 'F', 'G', 'H', 'J', 'K', ]; + /** + * @var string[] + */ + private const array BATTERY_ELECTRIC_LETTERS = [ + 'D', 'A', 'B', 'C', 'E', + ]; + + public string $region; + + public string $authority; + + public string $sequence; + private function __construct( public string $registrationNumber ) { - // + $this->parse($registrationNumber); } public static function make(string $registrationNumber): static @@ -250,4 +263,27 @@ final readonly class RegistrationNumber 'The registration number "%s" is invalid.', $registrationNumber )); } + + private function parse(string $registrationNumber): void + { + $this->region = mb_substr($registrationNumber, 0, 1); + $this->authority = mb_substr($registrationNumber, 1, 1); + $this->sequence = mb_substr($registrationNumber, 2); + } + + public function isCleanEnergy(): bool + { + return strlen($this->sequence) === 6; + } + + public function isBatteryElectric(): bool + { + if (! $this->isCleanEnergy()) { + return false; + } + + $code = mb_substr($this->sequence, 0, 1); + + return in_array($code, self::BATTERY_ELECTRIC_LETTERS); + } } diff --git a/tests/RegistrationNumberTest.php b/tests/RegistrationNumberTest.php index dfb3dd3..fcf5f33 100644 --- a/tests/RegistrationNumberTest.php +++ b/tests/RegistrationNumberTest.php @@ -30,6 +30,26 @@ final class RegistrationNumberTest extends TestCase RegistrationNumber::make($registrationNumber); } + public function test_is_clean_energy_determines_if_vehicle_is_clean_energy(): void + { + $this->assertTrue(RegistrationNumber::make('粤ED12345')->isCleanEnergy()); + $this->assertFalse(RegistrationNumber::make('粤ED1234')->isCleanEnergy()); + } + + public function test_is_battery_electric_determines_if_vehicle_is_a_fully_electric_vehicle(): void + { + $this->assertTrue(RegistrationNumber::make('粤ED12345')->isBatteryElectric()); + $this->assertTrue(RegistrationNumber::make('粤EA12345')->isBatteryElectric()); + $this->assertTrue(RegistrationNumber::make('粤EB12345')->isBatteryElectric()); + $this->assertTrue(RegistrationNumber::make('粤EC12345')->isBatteryElectric()); + $this->assertTrue(RegistrationNumber::make('粤EE12345')->isBatteryElectric()); + $this->assertFalse(RegistrationNumber::make('粤EF12345')->isBatteryElectric()); + $this->assertFalse(RegistrationNumber::make('粤EG12345')->isBatteryElectric()); + $this->assertFalse(RegistrationNumber::make('粤EH12345')->isBatteryElectric()); + $this->assertFalse(RegistrationNumber::make('粤EJ12345')->isBatteryElectric()); + $this->assertFalse(RegistrationNumber::make('粤EK12345')->isBatteryElectric()); + } + /** * @return string[] */ -- cgit v1.2.3