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
31namespace i18n {
32namespace phonenumbers {
33class 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:
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
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
59TEST_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
80TEST_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
102TEST_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
128TEST_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
138TEST_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
219TEST_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
303TEST_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
311TEST_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
317TEST_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
326TEST_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
333TEST_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
344TEST_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
350TEST_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
357TEST_F(ShortNumberInfoTest, ConnectsToEmergencyNumber_CL) {
358  EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("131", RegionCode::CL()));
359  EXPECT_TRUE(short_info_.ConnectsToEmergencyNumber("133", RegionCode::CL()));
360}
361
362TEST_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
368TEST_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
378TEST_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
387TEST_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
393TEST_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
399TEST_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
408TEST_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
418TEST_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
424TEST_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
430TEST_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
438TEST_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
445TEST_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
472TEST_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
494TEST_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