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