summaryrefslogtreecommitdiff
path: root/tests/RegistrationNumberTest.php
blob: dfb3dd3c3df0152193acb8499adeced85649c48e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php

declare(strict_types=1);

namespace Zhineng\VehicleLicenseChina\Tests;

use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
use Zhineng\VehicleLicenseChina\RegistrationNumber;
use Zhineng\VehicleLicenseChina\RegistrationNumberException;

#[CoversClass(RegistrationNumber::class)]
final class RegistrationNumberTest extends TestCase
{
    #[DataProvider('provide_valid_registration_numbers')]
    #[DataProvider('provide_valid_clean_energy_registration_numbers')]
    public function test_valid_registration_number(string $registrationNumber): void
    {
        $instance = RegistrationNumber::make($registrationNumber);
        $this->assertSame($registrationNumber, $instance->registrationNumber);
    }

    #[DataProvider('provide_invalid_registration_numbers')]
    #[DataProvider('provide_invalid_clean_energy_registration_numbers')]
    public function test_invalid_registration_number(string $registrationNumber): void
    {
        $this->expectException(RegistrationNumberException::class);
        $this->expectExceptionMessage(sprintf('The registration number "%s" is invalid.', $registrationNumber));
        RegistrationNumber::make($registrationNumber);
    }

    /**
     * @return string[]
     */
    public static function provide_valid_registration_numbers(): array
    {
        return [
            ['粤E1234'],
            ['粤EA123'],
            ['粤E1A23'],
            ['粤E12A3'],
            ['粤E123A'],
            ['粤EAB12'],
            ['粤E12AB'],
            ['粤E1AB2'],
            ['粤E1A2B'],
            ['粤EA12B'],
            ['粤EA1B2'],
            ['粤E12345'],
            ['粤EA1234'],
            ['粤E1A234'],
            ['粤E12A34'],
            ['粤E123A4'],
            ['粤E1234A'],

            // Authority code "O" (the 2nd character) is for internal
            ['粤O12345'],

            // Authority code "Z" (the 2nd character) is for internal in Guangdong province
            ['粤Z12345'],

            // Authority code "W" (the 2nd character) is for internal in Shandong province
            ['鲁W12345'],
        ];
    }

    /**
     * @return string[]
     */
    public static function provide_valid_clean_energy_registration_numbers(): array
    {
        return [
            ['粤ED12345'],
            ['粤EDA1234'],

            // Authority code "O" (the 2nd character) is for internal
            ['粤OD12345'],

            // Authority code "Z" (the 2nd character) is for internal in Guangdong province
            ['粤ZD12345'],

            // Authority code "W" (the 2nd character) is for internal in Shandong province
            ['鲁WD12345'],
        ];
    }

    /**
     * @return string[]
     */
    public static function provide_invalid_registration_numbers(): array
    {
        return [
            ['假E12345'],
            ['粤I12345'],
            ['粤EABC1'],
            ['粤E123+'],
            ['粤E1234+'],
            ['粤EABC12'],

            // Sequence could not contain "O" or "I"
            ['粤EO123'],
            ['粤E1O23'],
            ['粤E12O3'],
            ['粤E123O'],
            ['粤EI123'],
            ['粤E1I23'],
            ['粤E12I3'],
            ['粤E123I'],
            ['粤EO1234'],
            ['粤E1O234'],
            ['粤E12O34'],
            ['粤E123O4'],
            ['粤E1234O'],
            ['粤EI1234'],
            ['粤E1I234'],
            ['粤E12I34'],
            ['粤E123I4'],
            ['粤E1234I'],
        ];
    }

    /**
     * @return string[]
     */
    public static function provide_invalid_clean_energy_registration_numbers(): array
    {
        return [
            ['粤ED1A234'],
            ['粤ED12A34'],
            ['粤ED123A4'],
            ['粤ED1234A'],
            ['粤EZ12345'],
            ['粤ED1234+'],

            // Sequence could not contain "O" or "I"
            ['粤EDO1234'],
            ['粤EDI1234'],
        ];
    }
}