• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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