Passed
Push — upstream-8.9.2 ( 6a22e8 )
by Joshua
25:34 queued 09:29
created

PhoneNumberOfflineGeocoderTest   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 198
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
wmc 12
lcom 1
cbo 3
dl 0
loc 198
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace libphonenumber\Tests\geocoding;
4
5
use libphonenumber\geocoding\PhoneNumberOfflineGeocoder;
6
use libphonenumber\PhoneNumber;
7
8
class PhoneNumberOfflineGeocoderTest extends \PHPUnit_Framework_TestCase
9
{
10
    const TEST_META_DATA_FILE_PREFIX = "/../../tests/prefixmapper/data";
11
    private static $KO_Number1;
12
    private static $KO_Number2;
13
    private static $KO_Number3;
14
    private static $KO_InvalidNumber;
15
    private static $KO_Mobile;
16
    private static $US_Number1;
17
    private static $US_Number2;
18
    private static $US_Number3;
19
    private static $US_Number4;
20
    private static $US_InvalidNumber;
21
    private static $NANPA_TollFree;
22
    private static $BS_Number1;
23
    private static $AU_Number;
24
    private static $AR_MobileNumber;
25
    private static $numberWithInvalidCountryCode;
26
    private static $internationalTollFree;
27
    /**
28
     * @var PhoneNumberOfflineGeocoder
29
     */
30
    protected $geocoder;
31
32
    public static function setUpBeforeClass()
33
    {
34
        self::$KO_Number1 = new PhoneNumber();
35
        self::$KO_Number1->setCountryCode(82)->setNationalNumber(22123456);
36
37
        self::$KO_Number2 = new PhoneNumber();
38
        self::$KO_Number2->setCountryCode(82)->setNationalNumber(322123456);
39
40
        self::$KO_Number3 = new PhoneNumber();
41
        self::$KO_Number3->setCountryCode(82)->setNationalNumber(6421234567);
42
43
        self::$KO_InvalidNumber = new PhoneNumber();
44
        self::$KO_InvalidNumber->setCountryCode(82)->setNationalNumber(1234);
45
46
        self::$KO_Mobile = new PhoneNumber();
47
        self::$KO_Mobile->setCountryCode(82)->setNationalNumber(101234567);
48
49
        self::$US_Number1 = new PhoneNumber();
50
        self::$US_Number1->setCountryCode(1)->setNationalNumber(6502530000);
51
52
        self::$US_Number2 = new PhoneNumber();
53
        self::$US_Number2->setCountryCode(1)->setNationalNumber(6509600000);
54
55
        self::$US_Number3 = new PhoneNumber();
56
        self::$US_Number3->setCountryCode(1)->setNationalNumber(2128120000);
57
58
        self::$US_Number4 = new PhoneNumber();
59
        self::$US_Number4->setCountryCode(1)->setNationalNumber(6174240000);
60
61
        self::$US_InvalidNumber = new PhoneNumber();
62
        self::$US_InvalidNumber->setCountryCode(1)->setNationalNumber(123456789);
63
64
        self::$NANPA_TollFree = new PhoneNumber();
65
        self::$NANPA_TollFree->setCountryCode(1)->setNationalNumber(8002431234);
66
67
        self::$BS_Number1 = new PhoneNumber();
68
        self::$BS_Number1->setCountryCode(1)->setNationalNumber(2423651234);
69
70
        self::$AU_Number = new PhoneNumber();
71
        self::$AU_Number->setCountryCode(61)->setNationalNumber(236618300);
72
73
        self::$AR_MobileNumber = new PhoneNumber();
74
        self::$AR_MobileNumber->setCountryCode(54)->setNationalNumber(92214000000);
75
76
        self::$numberWithInvalidCountryCode = new PhoneNumber();
77
        self::$numberWithInvalidCountryCode->setCountryCode(999)->setNationalNumber(2423651234);
78
79
        self::$internationalTollFree = new PhoneNumber();
80
        self::$internationalTollFree->setCountryCode(800)->setNationalNumber(12345678);
81
    }
82
83
    public function setUp()
84
    {
85
        PhoneNumberOfflineGeocoder::resetInstance();
86
        $this->geocoder = PhoneNumberOfflineGeocoder::getInstance(self::TEST_META_DATA_FILE_PREFIX);
87
    }
88
89
    public function testGetDescriptionForNumberWithNoDataFile()
90
    {
91
        // No data file containing mappings for US numbers is available in Chinese for the unittests. As
92
        // a result, the country name of United States in simplified Chinese is returned.
93
94
        $this->assertEquals(
95
            pack('H*', 'e7be8e') . pack('H*', 'e59bbd'),
96
            $this->geocoder->getDescriptionForNumber(self::$US_Number1, "zh_CN")
97
        );
98
        $this->assertEquals("Bahamas", $this->geocoder->getDescriptionForNumber(self::$BS_Number1, "en_US"));
99
        $this->assertEquals("Australia", $this->geocoder->getDescriptionForNumber(self::$AU_Number, "en_US"));
100
        $this->assertEquals("", $this->geocoder->getDescriptionForNumber(self::$numberWithInvalidCountryCode, "en_US"));
101
        $this->assertEquals("", $this->geocoder->getDescriptionForNumber(self::$internationalTollFree, "en_US"));
102
    }
103
104
    public function testGetDescriptionForNumberWithMissingPrefix()
105
    {
106
        // Test that the name of the country is returned when the number passed in is valid but not
107
        // covered by the geocoding data file.
108
109
        $this->assertEquals("United States", $this->geocoder->getDescriptionForNumber(self::$US_Number4, "en_US"));
110
    }
111
112
    public function testGetDescriptionForNumberBelongingToMultipleCountriesIsEmpty()
113
    {
114
        // Test that nothing is returned when the number passed in is valid but not
115
        // covered by the geocoding data file and belongs to multiple countries
116
        $this->assertEquals("", $this->geocoder->getDescriptionForNumber(self::$NANPA_TollFree, 'en_US'));
117
    }
118
119
    public function testGetDescriptionForNumber_en_US()
120
    {
121
        $ca = $this->geocoder->getDescriptionForNumber(self::$US_Number1, "en_US");
122
        $this->assertEquals("CA", $ca);
123
        $this->assertEquals("Mountain View, CA", $this->geocoder->getDescriptionForNumber(self::$US_Number2, "en_US"));
124
        $this->assertEquals("New York, NY", $this->geocoder->getDescriptionForNumber(self::$US_Number3, "en_US"));
125
    }
126
127
    public function testGetDescriptionForKoreanNumber()
128
    {
129
        $this->assertEquals("Seoul", $this->geocoder->getDescriptionForNumber(self::$KO_Number1, "en"));
130
        $this->assertEquals("Incheon", $this->geocoder->getDescriptionForNumber(self::$KO_Number2, "en"));
131
        $this->assertEquals("Jeju", $this->geocoder->getDescriptionForNumber(self::$KO_Number3, "en"));
132
133
        $this->assertEquals(
134
            pack('H*', 'ec849c') . pack('H*', 'ec9ab8'),
135
            $this->geocoder->getDescriptionForNumber(self::$KO_Number1, "ko")
136
        );
137
        $this->assertEquals(
138
            pack('H*', 'ec9db8') . pack('H*', 'ecb29c'),
139
            $this->geocoder->getDescriptionForNumber(self::$KO_Number2, "ko")
140
        );
141
    }
142
143
    public function testGetDescriptionForArgentinianMobileNumber()
144
    {
145
        $this->assertEquals("La Plata", $this->geocoder->getDescriptionForNumber(self::$AR_MobileNumber, "en"));
146
    }
147
148
    public function testGetDescriptionForFallBack()
149
    {
150
        // No fallback, as the location name for the given phone number is available in the requested
151
        // language.
152
153
        $this->assertEquals("Kalifornien", $this->geocoder->getDescriptionForNumber(self::$US_Number1, "de"));
154
155
        // German falls back to English.
156
        $this->assertEquals("New York, NY", $this->geocoder->getDescriptionForNumber(self::$US_Number3, "de"));
157
158
        // Italian fals back to English.
159
        $this->assertEquals("CA", $this->geocoder->getDescriptionForNumber(self::$US_Number1, "it"));
160
161
        // Korean doesn't fall back to English. -
162
        $this->assertEquals(
163
            pack('H*', 'eb8c80') . pack('H*', 'ed959c') . pack('H*', 'ebafbc') . pack('H*', 'eab5ad'),
164
            $this->geocoder->getDescriptionForNumber(self::$KO_Number3, "ko")
165
        );
166
    }
167
168
    public function testGetDescriptionForNumberWithUserRegion()
169
    {
170
        // User in Italy, American number. We should just show United States, in Spanish, and not more
171
        // detailed information.
172
        $this->assertEquals(
173
            "Estados Unidos",
174
            $this->geocoder->getDescriptionForNumber(self::$US_Number1, "es_ES", "IT")
175
        );
176
177
        // Unknown region - should just show country name.
178
        $this->assertEquals(
179
            "Estados Unidos",
180
            $this->geocoder->getDescriptionForNumber(self::$US_Number1, "es_ES", "ZZ")
181
        );
182
183
        // User in the States, language German, should show detailed data.
184
        $this->assertEquals("Kalifornien", $this->geocoder->getDescriptionForNumber(self::$US_Number1, "de", "US"));
185
186
        // User in the States, language French, no data for French, so we fallback to English detailed
187
        // data.
188
        $this->assertEquals("CA", $this->geocoder->getDescriptionForNumber(self::$US_Number1, "fr", "US"));
189
190
        // Invalid number - return an empty string.
191
        $this->assertEquals("", $this->geocoder->getDescriptionForNumber(self::$US_InvalidNumber, "en", "US"));
192
    }
193
194
    public function testGetDescriptionForInvalidNumber()
195
    {
196
        $this->assertEquals("", $this->geocoder->getDescriptionForNumber(self::$KO_InvalidNumber, "en"));
197
        $this->assertEquals("", $this->geocoder->getDescriptionForNumber(self::$US_InvalidNumber, "en"));
198
    }
199
200
    public function testGetDescriptionForNonGeographicalNumberWithGeocodingPrefix()
201
    {
202
        // We have a geocoding prefix, but we shouldn't use it since this is not geographical.
203
        $this->assertEquals("South Korea", $this->geocoder->getDescriptionForNumber(self::$KO_Mobile, 'en'));
204
    }
205
}
206