1 // Copyright (C) 2009 The Libphonenumber Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // Author: David Yonge-Mallo
16
17 // Note that these tests use the test metadata, not the normal metadata file, so
18 // should not be used for regression test purposes - these tests are
19 // illustrative only and test functionality.
20
21 #include "phonenumbers/shortnumberinfo.h"
22
23 #include <gtest/gtest.h>
24
25 #include "phonenumbers/base/logging.h"
26 #include "phonenumbers/default_logger.h"
27 #include "phonenumbers/phonenumberutil.h"
28 #include "phonenumbers/stringutil.h"
29 #include "phonenumbers/test_util.h"
30
31 namespace i18n {
32 namespace phonenumbers {
33 class ShortNumberInfoTest : public testing::Test {
34 public:
35 // This type is neither copyable nor movable.
36 ShortNumberInfoTest(const ShortNumberInfoTest&) = delete;
37 ShortNumberInfoTest& operator=(const ShortNumberInfoTest&) = delete;
38
39 protected:
ParseNumberForTesting(const string & number,const string & region_code)40 PhoneNumber ParseNumberForTesting(const string& number,
41 const string& region_code) {
42 PhoneNumber phone_number;
43 PhoneNumberUtil::ErrorType error_type = phone_util_.Parse(
44 number, region_code, &phone_number);
45 CHECK_EQ(error_type, PhoneNumberUtil::NO_PARSING_ERROR);
46 IGNORE_UNUSED(error_type);
47 return phone_number;
48 }
49
ShortNumberInfoTest()50 ShortNumberInfoTest() : short_info_() {
51 PhoneNumberUtil::GetInstance()->SetLogger(new StdoutLogger());
52 }
53
54 const PhoneNumberUtil phone_util_;
55 const ShortNumberInfo short_info_;
56
57 };
58
TEST_F(ShortNumberInfoTest,IsPossibleShortNumber)59 TEST_F(ShortNumberInfoTest, IsPossibleShortNumber) {
60 PhoneNumber possible_number;
61 possible_number.set_country_code(33);
62 possible_number.set_national_number(uint64{123456});
63 EXPECT_TRUE(short_info_.IsPossibleShortNumber(possible_number));
64 EXPECT_TRUE(short_info_.IsPossibleShortNumberForRegion(
65 ParseNumberForTesting("123456", RegionCode::FR()), RegionCode::FR()));
66
67 PhoneNumber impossible_number;
68 impossible_number.set_country_code(33);
69 impossible_number.set_national_number(uint64{9});
70 EXPECT_FALSE(short_info_.IsPossibleShortNumber(impossible_number));
71
72 // Note that GB and GG share the country calling code 44, and that this
73 // number is possible but not valid.
74 PhoneNumber shared_number;
75 shared_number.set_country_code(44);
76 shared_number.set_national_number(uint64{11001});
77 EXPECT_TRUE(short_info_.IsPossibleShortNumber(shared_number));
78 }
79
TEST_F(ShortNumberInfoTest,IsValidShortNumber)80 TEST_F(ShortNumberInfoTest, IsValidShortNumber) {
81 PhoneNumber valid_number;
82 valid_number.set_country_code(33);
83 valid_number.set_national_number(uint64{1010});
84 EXPECT_TRUE(short_info_.IsValidShortNumber(valid_number));
85 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
86 ParseNumberForTesting("1010", RegionCode::FR()), RegionCode::FR()));
87
88 PhoneNumber invalid_number;
89 invalid_number.set_country_code(33);
90 invalid_number.set_national_number(uint64{123456});
91 EXPECT_FALSE(short_info_.IsValidShortNumber(invalid_number));
92 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
93 ParseNumberForTesting("123456", RegionCode::FR()), RegionCode::FR()));
94
95 // Note that GB and GG share the country calling code 44.
96 PhoneNumber shared_number;
97 shared_number.set_country_code(44);
98 shared_number.set_national_number(uint64{18001});
99 EXPECT_TRUE(short_info_.IsValidShortNumber(shared_number));
100 }
101
TEST_F(ShortNumberInfoTest,IsCarrierSpecific)102 TEST_F(ShortNumberInfoTest, IsCarrierSpecific) {
103 PhoneNumber carrier_specific_number;
104 carrier_specific_number.set_country_code(1);
105 carrier_specific_number.set_national_number(uint64{33669});
106 EXPECT_TRUE(short_info_.IsCarrierSpecific(carrier_specific_number));
107 EXPECT_TRUE(short_info_.IsCarrierSpecificForRegion(
108 ParseNumberForTesting("33669", RegionCode::US()), RegionCode::US()));
109
110 PhoneNumber not_carrier_specific_number;
111 not_carrier_specific_number.set_country_code(1);
112 not_carrier_specific_number.set_national_number(uint64{911});
113 EXPECT_FALSE(short_info_.IsCarrierSpecific(not_carrier_specific_number));
114 EXPECT_FALSE(short_info_.IsCarrierSpecificForRegion(
115 ParseNumberForTesting("911", RegionCode::US()), RegionCode::US()));
116
117 PhoneNumber carrier_specific_number_for_some_region;
118 carrier_specific_number_for_some_region.set_country_code(1);
119 carrier_specific_number_for_some_region.set_national_number(uint64{211});
120 EXPECT_TRUE(short_info_.IsCarrierSpecific(
121 carrier_specific_number_for_some_region));
122 EXPECT_TRUE(short_info_.IsCarrierSpecificForRegion(
123 carrier_specific_number_for_some_region, RegionCode::US()));
124 EXPECT_FALSE(short_info_.IsCarrierSpecificForRegion(
125 carrier_specific_number_for_some_region, RegionCode::BB()));
126 }
127
TEST_F(ShortNumberInfoTest,IsSmsService)128 TEST_F(ShortNumberInfoTest, IsSmsService) {
129 PhoneNumber sms_service_number_for_some_region;
130 sms_service_number_for_some_region.set_country_code(1);
131 sms_service_number_for_some_region.set_national_number(uint64{21234});
132 EXPECT_TRUE(short_info_.IsSmsServiceForRegion(
133 sms_service_number_for_some_region, RegionCode::US()));
134 EXPECT_FALSE(short_info_.IsSmsServiceForRegion(
135 sms_service_number_for_some_region, RegionCode::BB()));
136 }
137
TEST_F(ShortNumberInfoTest,GetExpectedCost)138 TEST_F(ShortNumberInfoTest, GetExpectedCost) {
139 uint64 national_number;
140 const string& premium_rate_example =
141 short_info_.GetExampleShortNumberForCost(
142 RegionCode::FR(), ShortNumberInfo::PREMIUM_RATE);
143 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE,
144 short_info_.GetExpectedCostForRegion(
145 ParseNumberForTesting(premium_rate_example, RegionCode::FR()),
146 RegionCode::FR()));
147 PhoneNumber premium_rate_number;
148 premium_rate_number.set_country_code(33);
149 safe_strtou64(premium_rate_example, &national_number);
150 premium_rate_number.set_national_number(national_number);
151 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE,
152 short_info_.GetExpectedCost(premium_rate_number));
153
154 const string& standard_rate_example =
155 short_info_.GetExampleShortNumberForCost(
156 RegionCode::FR(), ShortNumberInfo::STANDARD_RATE);
157 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE,
158 short_info_.GetExpectedCostForRegion(
159 ParseNumberForTesting(standard_rate_example, RegionCode::FR()),
160 RegionCode::FR()));
161 PhoneNumber standard_rate_number;
162 standard_rate_number.set_country_code(33);
163 safe_strtou64(standard_rate_example, &national_number);
164 standard_rate_number.set_national_number(national_number);
165 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE,
166 short_info_.GetExpectedCost(standard_rate_number));
167
168 const string& toll_free_example =
169 short_info_.GetExampleShortNumberForCost(
170 RegionCode::FR(), ShortNumberInfo::TOLL_FREE);
171 EXPECT_EQ(ShortNumberInfo::TOLL_FREE,
172 short_info_.GetExpectedCostForRegion(
173 ParseNumberForTesting(toll_free_example, RegionCode::FR()),
174 RegionCode::FR()));
175 PhoneNumber toll_free_number;
176 toll_free_number.set_country_code(33);
177 safe_strtou64(toll_free_example, &national_number);
178 toll_free_number.set_national_number(national_number);
179 EXPECT_EQ(ShortNumberInfo::TOLL_FREE,
180 short_info_.GetExpectedCost(toll_free_number));
181
182 EXPECT_EQ(
183 ShortNumberInfo::UNKNOWN_COST,
184 short_info_.GetExpectedCostForRegion(
185 ParseNumberForTesting("12345", RegionCode::FR()), RegionCode::FR()));
186 PhoneNumber unknown_cost_number;
187 unknown_cost_number.set_country_code(33);
188 unknown_cost_number.set_national_number(uint64{12345});
189 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
190 short_info_.GetExpectedCost(unknown_cost_number));
191
192 // Test that an invalid number may nevertheless have a cost other than
193 // UNKNOWN_COST.
194 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
195 ParseNumberForTesting("116123", RegionCode::FR()), RegionCode::FR()));
196 EXPECT_EQ(
197 ShortNumberInfo::TOLL_FREE,
198 short_info_.GetExpectedCostForRegion(
199 ParseNumberForTesting("116123", RegionCode::FR()), RegionCode::FR()));
200 PhoneNumber invalid_number;
201 invalid_number.set_country_code(33);
202 invalid_number.set_national_number(uint64{116123});
203 EXPECT_FALSE(short_info_.IsValidShortNumber(invalid_number));
204 EXPECT_EQ(ShortNumberInfo::TOLL_FREE,
205 short_info_.GetExpectedCost(invalid_number));
206
207 // Test a nonexistent country code.
208 EXPECT_EQ(
209 ShortNumberInfo::UNKNOWN_COST,
210 short_info_.GetExpectedCostForRegion(
211 ParseNumberForTesting("911", RegionCode::US()), RegionCode::ZZ()));
212 unknown_cost_number.Clear();
213 unknown_cost_number.set_country_code(123);
214 unknown_cost_number.set_national_number(uint64{911});
215 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
216 short_info_.GetExpectedCost(unknown_cost_number));
217 }
218
TEST_F(ShortNumberInfoTest,GetExpectedCostForSharedCountryCallingCode)219 TEST_F(ShortNumberInfoTest, GetExpectedCostForSharedCountryCallingCode) {
220 // Test some numbers which have different costs in countries sharing the same
221 // country calling code. In Australia, 1234 is premium-rate, 1194 is
222 // standard-rate, and 733 is toll-free. These are not known to be valid
223 // numbers in the Christmas Islands.
224 string ambiguous_premium_rate_string("1234");
225 PhoneNumber ambiguous_premium_rate_number;
226 ambiguous_premium_rate_number.set_country_code(61);
227 ambiguous_premium_rate_number.set_national_number(uint64{1234});
228 string ambiguous_standard_rate_string("1194");
229 PhoneNumber ambiguous_standard_rate_number;
230 ambiguous_standard_rate_number.set_country_code(61);
231 ambiguous_standard_rate_number.set_national_number(uint64{1194});
232 string ambiguous_toll_free_string("733");
233 PhoneNumber ambiguous_toll_free_number;
234 ambiguous_toll_free_number.set_country_code(61);
235 ambiguous_toll_free_number.set_national_number(uint64{733});
236
237 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_premium_rate_number));
238 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_standard_rate_number));
239 EXPECT_TRUE(short_info_.IsValidShortNumber(ambiguous_toll_free_number));
240
241 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
242 ParseNumberForTesting(ambiguous_premium_rate_string, RegionCode::AU()),
243 RegionCode::AU()));
244 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE,
245 short_info_.GetExpectedCostForRegion(
246 ParseNumberForTesting(ambiguous_premium_rate_string,
247 RegionCode::AU()),
248 RegionCode::AU()));
249
250 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
251 ParseNumberForTesting(ambiguous_premium_rate_string, RegionCode::CX()),
252 RegionCode::CX()));
253 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
254 short_info_.GetExpectedCostForRegion(
255 ParseNumberForTesting(ambiguous_premium_rate_string,
256 RegionCode::CX()),
257 RegionCode::CX()));
258 // PREMIUM_RATE takes precedence over UNKNOWN_COST.
259 EXPECT_EQ(ShortNumberInfo::PREMIUM_RATE,
260 short_info_.GetExpectedCost(ambiguous_premium_rate_number));
261
262 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
263 ParseNumberForTesting(ambiguous_standard_rate_string, RegionCode::AU()),
264 RegionCode::AU()));
265 EXPECT_EQ(ShortNumberInfo::STANDARD_RATE,
266 short_info_.GetExpectedCostForRegion(
267 ParseNumberForTesting(ambiguous_standard_rate_string,
268 RegionCode::AU()),
269 RegionCode::AU()));
270
271 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
272 ParseNumberForTesting(ambiguous_standard_rate_string, RegionCode::CX()),
273 RegionCode::CX()));
274 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
275 short_info_.GetExpectedCostForRegion(
276 ParseNumberForTesting(ambiguous_standard_rate_string,
277 RegionCode::CX()),
278 RegionCode::CX()));
279 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
280 short_info_.GetExpectedCost(ambiguous_standard_rate_number));
281
282 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
283 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::AU()),
284 RegionCode::AU()));
285 EXPECT_EQ(
286 ShortNumberInfo::TOLL_FREE,
287 short_info_.GetExpectedCostForRegion(
288 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::AU()),
289 RegionCode::AU()));
290
291 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
292 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::CX()),
293 RegionCode::CX()));
294 EXPECT_EQ(
295 ShortNumberInfo::UNKNOWN_COST,
296 short_info_.GetExpectedCostForRegion(
297 ParseNumberForTesting(ambiguous_toll_free_string, RegionCode::CX()),
298 RegionCode::CX()));
299 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
300 short_info_.GetExpectedCost(ambiguous_toll_free_number));
301 }
302
TEST_F(ShortNumberInfoTest,GetExampleShortNumber)303 TEST_F(ShortNumberInfoTest, GetExampleShortNumber) {
304 EXPECT_FALSE(short_info_.GetExampleShortNumber(RegionCode::AD()).empty());
305 EXPECT_FALSE(short_info_.GetExampleShortNumber(RegionCode::FR()).empty());
306 EXPECT_TRUE(short_info_.GetExampleShortNumber(RegionCode::UN001()).empty());
307 EXPECT_TRUE(
308 short_info_.GetExampleShortNumber(RegionCode::GetUnknown()).empty());
309 }
310
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumber_US)311 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_US) {
312 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::US()));
313 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("112", RegionCode::US()));
314 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("999", RegionCode::US()));
315 }
316
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumberLongNumber_US)317 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_US) {
318 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("9116666666",
319 RegionCode::US()));
320 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("1126666666",
321 RegionCode::US()));
322 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9996666666",
323 RegionCode::US()));
324 }
325
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumberWithFormatting_US)326 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberWithFormatting_US) {
327 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("9-1-1", RegionCode::US()));
328 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("1-1-2", RegionCode::US()));
329 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9-9-9",
330 RegionCode::US()));
331 }
332
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumberWithPlusSign_US)333 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberWithPlusSign_US) {
334 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+911", RegionCode::US()));
335 // This hex sequence is the full-width plus sign U+FF0B.
336 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("\xEF\xBC\x8B" "911",
337 RegionCode::US()));
338 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber(" +911",
339 RegionCode::US()));
340 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+112", RegionCode::US()));
341 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("+999", RegionCode::US()));
342 }
343
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumber_BR)344 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_BR) {
345 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::BR()));
346 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("190", RegionCode::BR()));
347 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("999", RegionCode::BR()));
348 }
349
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumberLongNumber_BR)350 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_BR) {
351 // Brazilian emergency numbers don't work when additional digits are appended.
352 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9111", RegionCode::BR()));
353 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1900", RegionCode::BR()));
354 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("9996", RegionCode::BR()));
355 }
356
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumber_CL)357 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_CL) {
358 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("131", RegionCode::CL()));
359 EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("133", RegionCode::CL()));
360 }
361
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumberLongNumber_CL)362 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumberLongNumber_CL) {
363 // Chilean emergency numbers don't work when additional digits are appended.
364 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1313", RegionCode::CL()));
365 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("1330", RegionCode::CL()));
366 }
367
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumber_AO)368 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_AO) {
369 // Angola doesn't have any metadata for emergency numbers in the test
370 // metadata.
371 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::AO()));
372 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("222123456",
373 RegionCode::AO()));
374 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("923123456",
375 RegionCode::AO()));
376 }
377
TEST_F(ShortNumberInfoTest,ConnectsToEmergencyNumber_ZW)378 TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_ZW) {
379 // Zimbabwe doesn't have any metadata in the test metadata.
380 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("911", RegionCode::ZW()));
381 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("01312345",
382 RegionCode::ZW()));
383 EXPECT_FALSE(short_info_.ConnectsToEmergencyNumber("0711234567",
384 RegionCode::ZW()));
385 }
386
TEST_F(ShortNumberInfoTest,IsEmergencyNumber_US)387 TEST_F(ShortNumberInfoTest, IsEmergencyNumber_US) {
388 EXPECT_TRUE(short_info_.IsEmergencyNumber("911", RegionCode::US()));
389 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::US()));
390 EXPECT_FALSE(short_info_.IsEmergencyNumber("999", RegionCode::US()));
391 }
392
TEST_F(ShortNumberInfoTest,IsEmergencyNumberLongNumber_US)393 TEST_F(ShortNumberInfoTest, IsEmergencyNumberLongNumber_US) {
394 EXPECT_FALSE(short_info_.IsEmergencyNumber("9116666666", RegionCode::US()));
395 EXPECT_FALSE(short_info_.IsEmergencyNumber("1126666666", RegionCode::US()));
396 EXPECT_FALSE(short_info_.IsEmergencyNumber("9996666666", RegionCode::US()));
397 }
398
TEST_F(ShortNumberInfoTest,IsEmergencyNumberWithFormatting_US)399 TEST_F(ShortNumberInfoTest, IsEmergencyNumberWithFormatting_US) {
400 EXPECT_TRUE(short_info_.IsEmergencyNumber("9-1-1", RegionCode::US()));
401 EXPECT_TRUE(short_info_.IsEmergencyNumber("*911", RegionCode::US()));
402 EXPECT_TRUE(short_info_.IsEmergencyNumber("1-1-2", RegionCode::US()));
403 EXPECT_TRUE(short_info_.IsEmergencyNumber("*112", RegionCode::US()));
404 EXPECT_FALSE(short_info_.IsEmergencyNumber("9-9-9", RegionCode::US()));
405 EXPECT_FALSE(short_info_.IsEmergencyNumber("*999", RegionCode::US()));
406 }
407
TEST_F(ShortNumberInfoTest,IsEmergencyNumberWithPlusSign_US)408 TEST_F(ShortNumberInfoTest, IsEmergencyNumberWithPlusSign_US) {
409 EXPECT_FALSE(short_info_.IsEmergencyNumber("+911", RegionCode::US()));
410 // This hex sequence is the full-width plus sign U+FF0B.
411 EXPECT_FALSE(short_info_.IsEmergencyNumber("\xEF\xBC\x8B" "911",
412 RegionCode::US()));
413 EXPECT_FALSE(short_info_.IsEmergencyNumber(" +911", RegionCode::US()));
414 EXPECT_FALSE(short_info_.IsEmergencyNumber("+112", RegionCode::US()));
415 EXPECT_FALSE(short_info_.IsEmergencyNumber("+999", RegionCode::US()));
416 }
417
TEST_F(ShortNumberInfoTest,IsEmergencyNumber_BR)418 TEST_F(ShortNumberInfoTest, IsEmergencyNumber_BR) {
419 EXPECT_TRUE(short_info_.IsEmergencyNumber("911", RegionCode::BR()));
420 EXPECT_TRUE(short_info_.IsEmergencyNumber("190", RegionCode::BR()));
421 EXPECT_FALSE(short_info_.IsEmergencyNumber("999", RegionCode::BR()));
422 }
423
TEST_F(ShortNumberInfoTest,EmergencyNumberLongNumber_BR)424 TEST_F(ShortNumberInfoTest, EmergencyNumberLongNumber_BR) {
425 EXPECT_FALSE(short_info_.IsEmergencyNumber("9111", RegionCode::BR()));
426 EXPECT_FALSE(short_info_.IsEmergencyNumber("1900", RegionCode::BR()));
427 EXPECT_FALSE(short_info_.IsEmergencyNumber("9996", RegionCode::BR()));
428 }
429
TEST_F(ShortNumberInfoTest,IsEmergencyNumber_AO)430 TEST_F(ShortNumberInfoTest, IsEmergencyNumber_AO) {
431 // Angola doesn't have any metadata for emergency numbers in the test
432 // metadata.
433 EXPECT_FALSE(short_info_.IsEmergencyNumber("911", RegionCode::AO()));
434 EXPECT_FALSE(short_info_.IsEmergencyNumber("222123456", RegionCode::AO()));
435 EXPECT_FALSE(short_info_.IsEmergencyNumber("923123456", RegionCode::AO()));
436 }
437
TEST_F(ShortNumberInfoTest,IsEmergencyNumber_ZW)438 TEST_F(ShortNumberInfoTest, IsEmergencyNumber_ZW) {
439 // Zimbabwe doesn't have any metadata in the test metadata.
440 EXPECT_FALSE(short_info_.IsEmergencyNumber("911", RegionCode::ZW()));
441 EXPECT_FALSE(short_info_.IsEmergencyNumber("01312345", RegionCode::ZW()));
442 EXPECT_FALSE(short_info_.IsEmergencyNumber("0711234567", RegionCode::ZW()));
443 }
444
TEST_F(ShortNumberInfoTest,EmergencyNumberForSharedCountryCallingCode)445 TEST_F(ShortNumberInfoTest, EmergencyNumberForSharedCountryCallingCode) {
446 // Test the emergency number 112, which is valid in both Australia and the
447 // Christmas Islands.
448 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::AU()));
449 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
450 ParseNumberForTesting("112", RegionCode::AU()), RegionCode::AU()));
451 EXPECT_EQ(
452 ShortNumberInfo::TOLL_FREE,
453 short_info_.GetExpectedCostForRegion(
454 ParseNumberForTesting("112", RegionCode::AU()), RegionCode::AU()));
455
456 EXPECT_TRUE(short_info_.IsEmergencyNumber("112", RegionCode::CX()));
457 EXPECT_TRUE(short_info_.IsValidShortNumberForRegion(
458 ParseNumberForTesting("112", RegionCode::CX()), RegionCode::CX()));
459 EXPECT_EQ(
460 ShortNumberInfo::TOLL_FREE,
461 short_info_.GetExpectedCostForRegion(
462 ParseNumberForTesting("112", RegionCode::CX()), RegionCode::CX()));
463
464 PhoneNumber shared_emergency_number;
465 shared_emergency_number.set_country_code(61);
466 shared_emergency_number.set_national_number(uint64{112});
467 EXPECT_TRUE(short_info_.IsValidShortNumber(shared_emergency_number));
468 EXPECT_EQ(ShortNumberInfo::TOLL_FREE,
469 short_info_.GetExpectedCost(shared_emergency_number));
470 }
471
TEST_F(ShortNumberInfoTest,OverlappingNANPANumber)472 TEST_F(ShortNumberInfoTest, OverlappingNANPANumber) {
473 // 211 is an emergency number in Barbados, while it is a toll-free
474 // information line in Canada and the USA.
475 EXPECT_TRUE(short_info_.IsEmergencyNumber("211", RegionCode::BB()));
476 EXPECT_EQ(
477 ShortNumberInfo::TOLL_FREE,
478 short_info_.GetExpectedCostForRegion(
479 ParseNumberForTesting("211", RegionCode::BB()), RegionCode::BB()));
480
481 EXPECT_FALSE(short_info_.IsEmergencyNumber("211", RegionCode::US()));
482 EXPECT_EQ(
483 ShortNumberInfo::UNKNOWN_COST,
484 short_info_.GetExpectedCostForRegion(
485 ParseNumberForTesting("211", RegionCode::US()), RegionCode::US()));
486
487 EXPECT_FALSE(short_info_.IsEmergencyNumber("211", RegionCode::CA()));
488 EXPECT_EQ(
489 ShortNumberInfo::TOLL_FREE,
490 short_info_.GetExpectedCostForRegion(
491 ParseNumberForTesting("211", RegionCode::CA()), RegionCode::CA()));
492 }
493
TEST_F(ShortNumberInfoTest,CountryCallingCodeIsNotIgnored)494 TEST_F(ShortNumberInfoTest, CountryCallingCodeIsNotIgnored) {
495 // +46 is the country calling code for Sweden (SE), and 40404 is a valid short
496 // number in the US.
497 EXPECT_FALSE(short_info_.IsPossibleShortNumberForRegion(
498 ParseNumberForTesting("+4640404", RegionCode::SE()), RegionCode::US()));
499 EXPECT_FALSE(short_info_.IsValidShortNumberForRegion(
500 ParseNumberForTesting("+4640404", RegionCode::SE()), RegionCode::US()));
501 EXPECT_EQ(ShortNumberInfo::UNKNOWN_COST,
502 short_info_.GetExpectedCostForRegion(
503 ParseNumberForTesting("+4640404", RegionCode::SE()),
504 RegionCode::US()));
505 }
506
507 } // namespace phonenumbers
508 } // namespace i18n
509