summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Zhineng <[email protected]>2025-05-12 19:27:10 +0800
committerLi Zhineng <[email protected]>2025-05-12 19:27:10 +0800
commitdb83565c54a2b97ad9cf3e83314775193876be43 (patch)
treedeb5793a20bb14a463c91efc1e4928fcb22f2928
parent12ebfe678ed2554fb5902c60d99a53414bec0ad1 (diff)
downloadvehicle-license-china-db83565c54a2b97ad9cf3e83314775193876be43.tar.gz
vehicle-license-china-db83565c54a2b97ad9cf3e83314775193876be43.zip
determine if clean energy
-rw-r--r--src/RegistrationNumber.php38
-rw-r--r--tests/RegistrationNumberTest.php20
2 files changed, 57 insertions, 1 deletions
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[]
*/