• 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 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