• 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: Shaopeng Jia
16 // Author: Lara Rennie
17 // Open-sourced by: Philippe Liard
18 //
19 // Note that these tests use the metadata contained in the test metadata file,
20 // not the normal metadata file, so should not be used for regression test
21 // purposes - these tests are illustrative only and test functionality.
22 
23 #include "phonenumbers/phonenumberutil.h"
24 
25 #include <algorithm>
26 #include <iostream>
27 #include <list>
28 #include <set>
29 #include <string>
30 
31 #include <gtest/gtest.h>
32 #include <unicode/uchar.h>
33 
34 #include "phonenumbers/default_logger.h"
35 #include "phonenumbers/normalize_utf8.h"
36 #include "phonenumbers/phonemetadata.pb.h"
37 #include "phonenumbers/phonenumber.h"
38 #include "phonenumbers/phonenumber.pb.h"
39 #include "phonenumbers/test_util.h"
40 
41 namespace i18n {
42 namespace phonenumbers {
43 
44 using std::find;
45 using std::ostream;
46 
47 using google::protobuf::RepeatedPtrField;
48 
49 static const int kInvalidCountryCode = 2;
50 
51 class PhoneNumberUtilTest : public testing::Test {
52  protected:
PhoneNumberUtilTest()53   PhoneNumberUtilTest() : phone_util_(*PhoneNumberUtil::GetInstance()) {
54     PhoneNumberUtil::GetInstance()->SetLogger(new StdoutLogger());
55   }
56 
57   // Wrapper functions for private functions that we want to test.
GetPhoneMetadata(const string & region_code) const58   const PhoneMetadata* GetPhoneMetadata(const string& region_code) const {
59     return phone_util_.GetMetadataForRegion(region_code);
60   }
61 
GetMetadataForNonGeographicalRegion(int country_code) const62   const PhoneMetadata* GetMetadataForNonGeographicalRegion(
63       int country_code) const {
64     return phone_util_.GetMetadataForNonGeographicalRegion(country_code);
65   }
66 
ExtractPossibleNumber(const string & number,string * extracted_number) const67   void ExtractPossibleNumber(const string& number,
68                              string* extracted_number) const {
69     phone_util_.ExtractPossibleNumber(number, extracted_number);
70   }
71 
IsViablePhoneNumber(const string & number) const72   bool IsViablePhoneNumber(const string& number) const {
73     return phone_util_.IsViablePhoneNumber(number);
74   }
75 
Normalize(string * number) const76   void Normalize(string* number) const {
77     phone_util_.Normalize(number);
78   }
79 
MaybeStripInternationalPrefixAndNormalize(const string & possible_idd_prefix,string * number) const80   PhoneNumber::CountryCodeSource MaybeStripInternationalPrefixAndNormalize(
81       const string& possible_idd_prefix,
82       string* number) const {
83     return phone_util_.MaybeStripInternationalPrefixAndNormalize(
84         possible_idd_prefix,
85         number);
86   }
87 
MaybeStripNationalPrefixAndCarrierCode(const PhoneMetadata & metadata,string * number,string * carrier_code) const88   void MaybeStripNationalPrefixAndCarrierCode(const PhoneMetadata& metadata,
89                                               string* number,
90                                               string* carrier_code) const {
91     phone_util_.MaybeStripNationalPrefixAndCarrierCode(metadata, number,
92                                                             carrier_code);
93   }
94 
MaybeStripExtension(string * number,string * extension) const95   bool MaybeStripExtension(string* number, string* extension) const {
96     return phone_util_.MaybeStripExtension(number, extension);
97   }
98 
MaybeExtractCountryCode(const PhoneMetadata * default_region_metadata,bool keep_raw_input,string * national_number,PhoneNumber * phone_number) const99   PhoneNumberUtil::ErrorType MaybeExtractCountryCode(
100       const PhoneMetadata* default_region_metadata,
101       bool keep_raw_input,
102       string* national_number,
103       PhoneNumber* phone_number) const {
104     return phone_util_.MaybeExtractCountryCode(default_region_metadata,
105                                                keep_raw_input,
106                                                national_number,
107                                                phone_number);
108   }
109 
ContainsOnlyValidDigits(const string & s) const110   bool ContainsOnlyValidDigits(const string& s) const {
111     return phone_util_.ContainsOnlyValidDigits(s);
112   }
113 
114   const PhoneNumberUtil& phone_util_;
115 
116  private:
117   DISALLOW_COPY_AND_ASSIGN(PhoneNumberUtilTest);
118 };
119 
TEST_F(PhoneNumberUtilTest,ContainsOnlyValidDigits)120 TEST_F(PhoneNumberUtilTest, ContainsOnlyValidDigits) {
121   EXPECT_TRUE(ContainsOnlyValidDigits(""));
122   EXPECT_TRUE(ContainsOnlyValidDigits("2"));
123   EXPECT_TRUE(ContainsOnlyValidDigits("25"));
124   EXPECT_TRUE(ContainsOnlyValidDigits("\xEF\xBC\x96" /* "6" */));
125   EXPECT_FALSE(ContainsOnlyValidDigits("a"));
126   EXPECT_FALSE(ContainsOnlyValidDigits("2a"));
127 }
128 
TEST_F(PhoneNumberUtilTest,InterchangeInvalidCodepoints)129 TEST_F(PhoneNumberUtilTest, InterchangeInvalidCodepoints) {
130   PhoneNumber phone_number;
131 
132   std::vector<string> valid_inputs = {
133     "+44" "\xE2\x80\x93" "2087654321", // U+2013, EN DASH
134   };
135   for (auto input : valid_inputs) {
136     EXPECT_EQ(input, NormalizeUTF8::NormalizeDecimalDigits(input));
137     EXPECT_TRUE(IsViablePhoneNumber(input));
138     EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
139               phone_util_.Parse(input, RegionCode::GB(), &phone_number));
140   }
141 
142   std::vector<string> invalid_inputs = {
143     "+44" "\x96"         "2087654321", // Invalid sequence
144     "+44" "\xC2\x96"     "2087654321", // U+0096
145     "+44" "\xEF\xBF\xBE" "2087654321", // U+FFFE
146   };
147   for (auto input : invalid_inputs) {
148     EXPECT_TRUE(NormalizeUTF8::NormalizeDecimalDigits(input).empty());
149     EXPECT_FALSE(IsViablePhoneNumber(input));
150     EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
151               phone_util_.Parse(input, RegionCode::GB(), &phone_number));
152   }
153 }
154 
TEST_F(PhoneNumberUtilTest,GetSupportedRegions)155 TEST_F(PhoneNumberUtilTest, GetSupportedRegions) {
156   std::set<string> regions;
157 
158   phone_util_.GetSupportedRegions(&regions);
159   EXPECT_GT(regions.size(), 0U);
160 }
161 
TEST_F(PhoneNumberUtilTest,GetSupportedGlobalNetworkCallingCodes)162 TEST_F(PhoneNumberUtilTest, GetSupportedGlobalNetworkCallingCodes) {
163   std::set<int> calling_codes;
164 
165   phone_util_.GetSupportedGlobalNetworkCallingCodes(&calling_codes);
166   EXPECT_GT(calling_codes.size(), 0U);
167   for (std::set<int>::const_iterator it = calling_codes.begin();
168        it != calling_codes.end(); ++it) {
169     EXPECT_GT(*it, 0);
170     string region_code;
171     phone_util_.GetRegionCodeForCountryCode(*it, &region_code);
172     EXPECT_EQ(RegionCode::UN001(), region_code);
173   }
174 }
175 
TEST_F(PhoneNumberUtilTest,GetSupportedCallingCodes)176 TEST_F(PhoneNumberUtilTest, GetSupportedCallingCodes) {
177   std::set<int> calling_codes;
178 
179   phone_util_.GetSupportedCallingCodes(&calling_codes);
180   EXPECT_GT(calling_codes.size(), 0U);
181   for (std::set<int>::const_iterator it = calling_codes.begin();
182        it != calling_codes.end(); ++it) {
183     EXPECT_GT(*it, 0);
184     string region_code;
185     phone_util_.GetRegionCodeForCountryCode(*it, &region_code);
186     EXPECT_NE(RegionCode::ZZ(), region_code);
187   }
188   std::set<int> supported_global_network_calling_codes;
189   phone_util_.GetSupportedGlobalNetworkCallingCodes(
190       &supported_global_network_calling_codes);
191   // There should be more than just the global network calling codes in this
192   // set.
193   EXPECT_GT(calling_codes.size(),
194             supported_global_network_calling_codes.size());
195   // But they should be included. Testing one of them.
196   EXPECT_NE(calling_codes.find(979), calling_codes.end());
197 }
198 
TEST_F(PhoneNumberUtilTest,GetSupportedTypesForRegion)199 TEST_F(PhoneNumberUtilTest, GetSupportedTypesForRegion) {
200   std::set<PhoneNumberUtil::PhoneNumberType> types;
201   phone_util_.GetSupportedTypesForRegion(RegionCode::BR(), &types);
202   EXPECT_NE(types.find(PhoneNumberUtil::FIXED_LINE), types.end());
203   // Our test data has no mobile numbers for Brazil.
204   EXPECT_EQ(types.find(PhoneNumberUtil::MOBILE), types.end());
205   // UNKNOWN should never be returned.
206   EXPECT_EQ(types.find(PhoneNumberUtil::UNKNOWN), types.end());
207 
208   types.clear();
209   // In the US, many numbers are classified as FIXED_LINE_OR_MOBILE; but we
210   // don't want to expose this as a supported type, instead we say FIXED_LINE
211   // and MOBILE are both present.
212   phone_util_.GetSupportedTypesForRegion(RegionCode::US(), &types);
213   EXPECT_NE(types.find(PhoneNumberUtil::FIXED_LINE), types.end());
214   EXPECT_NE(types.find(PhoneNumberUtil::MOBILE), types.end());
215   EXPECT_EQ(types.find(PhoneNumberUtil::FIXED_LINE_OR_MOBILE), types.end());
216   types.clear();
217   phone_util_.GetSupportedTypesForRegion(RegionCode::ZZ(), &types);
218   // Test the invalid region code.
219   EXPECT_EQ(0u, types.size());
220 }
221 
TEST_F(PhoneNumberUtilTest,GetSupportedTypesForNonGeoEntity)222 TEST_F(PhoneNumberUtilTest, GetSupportedTypesForNonGeoEntity) {
223   std::set<PhoneNumberUtil::PhoneNumberType> types;
224   // No data exists for 999 at all, no types should be returned.
225   phone_util_.GetSupportedTypesForNonGeoEntity(999, &types);
226   EXPECT_EQ(0u, types.size());
227 
228   types.clear();
229   phone_util_.GetSupportedTypesForNonGeoEntity(979, &types);
230   EXPECT_NE(types.find(PhoneNumberUtil::PREMIUM_RATE), types.end());
231   EXPECT_EQ(types.find(PhoneNumberUtil::MOBILE), types.end());
232   EXPECT_EQ(types.find(PhoneNumberUtil::UNKNOWN), types.end());
233 }
234 
TEST_F(PhoneNumberUtilTest,GetRegionCodesForCountryCallingCode)235 TEST_F(PhoneNumberUtilTest, GetRegionCodesForCountryCallingCode) {
236   std::list<string> regions;
237 
238   phone_util_.GetRegionCodesForCountryCallingCode(1, &regions);
239   EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::US())
240               != regions.end());
241   EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::BS())
242               != regions.end());
243 
244   regions.clear();
245   phone_util_.GetRegionCodesForCountryCallingCode(44, &regions);
246   EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::GB())
247               != regions.end());
248 
249   regions.clear();
250   phone_util_.GetRegionCodesForCountryCallingCode(49, &regions);
251   EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::DE())
252               != regions.end());
253 
254   regions.clear();
255   phone_util_.GetRegionCodesForCountryCallingCode(800, &regions);
256   EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::UN001())
257               != regions.end());
258 
259   regions.clear();
260   phone_util_.GetRegionCodesForCountryCallingCode(
261       kInvalidCountryCode, &regions);
262   EXPECT_TRUE(regions.empty());
263 }
264 
TEST_F(PhoneNumberUtilTest,GetInstanceLoadUSMetadata)265 TEST_F(PhoneNumberUtilTest, GetInstanceLoadUSMetadata) {
266   const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::US());
267   EXPECT_EQ("US", metadata->id());
268   EXPECT_EQ(1, metadata->country_code());
269   EXPECT_EQ("011", metadata->international_prefix());
270   EXPECT_TRUE(metadata->has_national_prefix());
271   ASSERT_EQ(2, metadata->number_format_size());
272   EXPECT_EQ("(\\d{3})(\\d{3})(\\d{4})",
273             metadata->number_format(1).pattern());
274   EXPECT_EQ("$1 $2 $3", metadata->number_format(1).format());
275   EXPECT_EQ("[13-689]\\d{9}|2[0-35-9]\\d{8}",
276             metadata->general_desc().national_number_pattern());
277   EXPECT_EQ("[13-689]\\d{9}|2[0-35-9]\\d{8}",
278             metadata->fixed_line().national_number_pattern());
279   EXPECT_EQ(1, metadata->general_desc().possible_length_size());
280   EXPECT_EQ(10, metadata->general_desc().possible_length(0));
281   // Possible lengths are the same as the general description, so aren't stored
282   // separately in the toll free element as well.
283   EXPECT_EQ(0, metadata->toll_free().possible_length_size());
284   EXPECT_EQ("900\\d{7}", metadata->premium_rate().national_number_pattern());
285   // No shared-cost data is available, so its national number data should not be
286   // set.
287   EXPECT_FALSE(metadata->shared_cost().has_national_number_pattern());
288 }
289 
TEST_F(PhoneNumberUtilTest,GetInstanceLoadDEMetadata)290 TEST_F(PhoneNumberUtilTest, GetInstanceLoadDEMetadata) {
291   const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::DE());
292   EXPECT_EQ("DE", metadata->id());
293   EXPECT_EQ(49, metadata->country_code());
294   EXPECT_EQ("00", metadata->international_prefix());
295   EXPECT_EQ("0", metadata->national_prefix());
296   ASSERT_EQ(6, metadata->number_format_size());
297   EXPECT_EQ(1, metadata->number_format(5).leading_digits_pattern_size());
298   EXPECT_EQ("900", metadata->number_format(5).leading_digits_pattern(0));
299   EXPECT_EQ("(\\d{3})(\\d{3,4})(\\d{4})",
300             metadata->number_format(5).pattern());
301   EXPECT_EQ(2, metadata->general_desc().possible_length_local_only_size());
302   EXPECT_EQ(8, metadata->general_desc().possible_length_size());
303   // Nothing is present for fixed-line, since it is the same as the general
304   // desc, so for efficiency reasons we don't store an extra value.
305   EXPECT_EQ(0, metadata->fixed_line().possible_length_size());
306   EXPECT_EQ(2, metadata->mobile().possible_length_size());
307   EXPECT_EQ("$1 $2 $3", metadata->number_format(5).format());
308   EXPECT_EQ("(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:0[2-9]|[1-9]\\d))\\d{1,8}",
309             metadata->fixed_line().national_number_pattern());
310   EXPECT_EQ("30123456", metadata->fixed_line().example_number());
311   EXPECT_EQ(10, metadata->toll_free().possible_length(0));
312   EXPECT_EQ("900([135]\\d{6}|9\\d{7})",
313             metadata->premium_rate().national_number_pattern());
314 }
315 
TEST_F(PhoneNumberUtilTest,GetInstanceLoadARMetadata)316 TEST_F(PhoneNumberUtilTest, GetInstanceLoadARMetadata) {
317   const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::AR());
318   EXPECT_EQ("AR", metadata->id());
319   EXPECT_EQ(54, metadata->country_code());
320   EXPECT_EQ("00", metadata->international_prefix());
321   EXPECT_EQ("0", metadata->national_prefix());
322   EXPECT_EQ("0(?:(11|343|3715)15)?", metadata->national_prefix_for_parsing());
323   EXPECT_EQ("9$1", metadata->national_prefix_transform_rule());
324   ASSERT_EQ(5, metadata->number_format_size());
325   EXPECT_EQ("$2 15 $3-$4", metadata->number_format(2).format());
326   EXPECT_EQ("(\\d)(\\d{4})(\\d{2})(\\d{4})",
327             metadata->number_format(3).pattern());
328   EXPECT_EQ("(\\d)(\\d{4})(\\d{2})(\\d{4})",
329             metadata->intl_number_format(3).pattern());
330   EXPECT_EQ("$1 $2 $3 $4", metadata->intl_number_format(3).format());
331 }
332 
TEST_F(PhoneNumberUtilTest,GetInstanceLoadInternationalTollFreeMetadata)333 TEST_F(PhoneNumberUtilTest, GetInstanceLoadInternationalTollFreeMetadata) {
334   const PhoneMetadata* metadata = GetMetadataForNonGeographicalRegion(800);
335   EXPECT_FALSE(metadata == NULL);
336   EXPECT_EQ("001", metadata->id());
337   EXPECT_EQ(800, metadata->country_code());
338   EXPECT_EQ("$1 $2", metadata->number_format(0).format());
339   EXPECT_EQ("(\\d{4})(\\d{4})", metadata->number_format(0).pattern());
340   EXPECT_EQ(0, metadata->general_desc().possible_length_local_only_size());
341   EXPECT_EQ(1, metadata->general_desc().possible_length_size());
342   EXPECT_EQ("12345678", metadata->toll_free().example_number());
343 }
344 
TEST_F(PhoneNumberUtilTest,GetNationalSignificantNumber)345 TEST_F(PhoneNumberUtilTest, GetNationalSignificantNumber) {
346   PhoneNumber number;
347   number.set_country_code(1);
348   number.set_national_number(uint64{6502530000});
349   string national_significant_number;
350   phone_util_.GetNationalSignificantNumber(number,
351                                            &national_significant_number);
352   EXPECT_EQ("6502530000", national_significant_number);
353 
354   // An Italian mobile number.
355   national_significant_number.clear();
356   number.set_country_code(39);
357   number.set_national_number(uint64{312345678});
358   phone_util_.GetNationalSignificantNumber(number,
359                                            &national_significant_number);
360   EXPECT_EQ("312345678", national_significant_number);
361 
362   // An Italian fixed line number.
363   national_significant_number.clear();
364   number.set_country_code(39);
365   number.set_national_number(uint64{236618300});
366   number.set_italian_leading_zero(true);
367   phone_util_.GetNationalSignificantNumber(number,
368                                            &national_significant_number);
369   EXPECT_EQ("0236618300", national_significant_number);
370 
371   national_significant_number.clear();
372   number.Clear();
373   number.set_country_code(800);
374   number.set_national_number(uint64{12345678});
375   phone_util_.GetNationalSignificantNumber(number,
376                                            &national_significant_number);
377   EXPECT_EQ("12345678", national_significant_number);
378 }
379 
TEST_F(PhoneNumberUtilTest,GetNationalSignificantNumber_ManyLeadingZeros)380 TEST_F(PhoneNumberUtilTest, GetNationalSignificantNumber_ManyLeadingZeros) {
381   PhoneNumber number;
382   number.set_country_code(1);
383   number.set_national_number(uint64{650});
384   number.set_italian_leading_zero(true);
385   number.set_number_of_leading_zeros(2);
386   string national_significant_number;
387   phone_util_.GetNationalSignificantNumber(number,
388                                            &national_significant_number);
389   EXPECT_EQ("00650", national_significant_number);
390 
391   // Set a bad value; we shouldn't crash, we shouldn't output any leading zeros
392   // at all.
393   number.set_number_of_leading_zeros(-3);
394   national_significant_number.clear();
395   phone_util_.GetNationalSignificantNumber(number,
396                                            &national_significant_number);
397   EXPECT_EQ("650", national_significant_number);
398 }
399 
TEST_F(PhoneNumberUtilTest,GetExampleNumber)400 TEST_F(PhoneNumberUtilTest, GetExampleNumber) {
401   PhoneNumber de_number;
402   de_number.set_country_code(49);
403   de_number.set_national_number(uint64{30123456});
404   PhoneNumber test_number;
405   bool success = phone_util_.GetExampleNumber(RegionCode::DE(), &test_number);
406   EXPECT_TRUE(success);
407   EXPECT_EQ(de_number, test_number);
408 
409   success = phone_util_.GetExampleNumberForType(
410       RegionCode::DE(), PhoneNumberUtil::FIXED_LINE, &test_number);
411   EXPECT_TRUE(success);
412   EXPECT_EQ(de_number, test_number);
413 
414   // Should return the same response if asked for FIXED_LINE_OR_MOBILE too.
415   success = phone_util_.GetExampleNumberForType(
416       RegionCode::DE(), PhoneNumberUtil::FIXED_LINE_OR_MOBILE, &test_number);
417   EXPECT_EQ(de_number, test_number);
418 
419   success = phone_util_.GetExampleNumberForType(
420       RegionCode::DE(), PhoneNumberUtil::MOBILE, &test_number);
421   // We have data for the US, but no data for VOICEMAIL, so the number passed in
422   // should be left empty.
423   success = phone_util_.GetExampleNumberForType(
424       RegionCode::US(), PhoneNumberUtil::VOICEMAIL, &test_number);
425   test_number.Clear();
426   EXPECT_FALSE(success);
427   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
428 
429   success = phone_util_.GetExampleNumberForType(
430       RegionCode::US(), PhoneNumberUtil::FIXED_LINE, &test_number);
431   // Here we test that the call to get an example number succeeded, and that the
432   // number passed in was modified.
433   EXPECT_TRUE(success);
434   EXPECT_NE(PhoneNumber::default_instance(), test_number);
435   success = phone_util_.GetExampleNumberForType(
436       RegionCode::US(), PhoneNumberUtil::MOBILE, &test_number);
437   EXPECT_TRUE(success);
438   EXPECT_NE(PhoneNumber::default_instance(), test_number);
439 
440   // CS is an invalid region, so we have no data for it. We should return false.
441   test_number.Clear();
442   EXPECT_FALSE(phone_util_.GetExampleNumberForType(
443       RegionCode::CS(), PhoneNumberUtil::MOBILE, &test_number));
444   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
445 
446   // RegionCode 001 is reserved for supporting non-geographical country calling
447   // code. We don't support getting an example number for it with this method.
448   EXPECT_FALSE(phone_util_.GetExampleNumber(RegionCode::UN001(), &test_number));
449 }
450 
TEST_F(PhoneNumberUtilTest,GetInvalidExampleNumber)451 TEST_F(PhoneNumberUtilTest, GetInvalidExampleNumber) {
452   // RegionCode 001 is reserved for supporting non-geographical country calling
453   // codes. We don't support getting an invalid example number for it with
454   // GetInvalidExampleNumber.
455   PhoneNumber test_number;
456   EXPECT_FALSE(phone_util_.GetInvalidExampleNumber(RegionCode::UN001(),
457                                                    &test_number));
458   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
459   EXPECT_FALSE(phone_util_.GetInvalidExampleNumber(RegionCode::CS(),
460                                                    &test_number));
461   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
462 
463   EXPECT_TRUE(phone_util_.GetInvalidExampleNumber(RegionCode::US(),
464                                                   &test_number));
465   // At least the country calling code should be set correctly.
466   EXPECT_EQ(1, test_number.country_code());
467   EXPECT_NE(0u, test_number.national_number());
468 }
469 
TEST_F(PhoneNumberUtilTest,GetExampleNumberForNonGeoEntity)470 TEST_F(PhoneNumberUtilTest, GetExampleNumberForNonGeoEntity) {
471   PhoneNumber toll_free_number;
472   toll_free_number.set_country_code(800);
473   toll_free_number.set_national_number(uint64{12345678});
474   PhoneNumber test_number;
475   bool success =
476       phone_util_.GetExampleNumberForNonGeoEntity(800 , &test_number);
477   EXPECT_TRUE(success);
478   EXPECT_EQ(toll_free_number, test_number);
479 
480   PhoneNumber universal_premium_rate;
481   universal_premium_rate.set_country_code(979);
482   universal_premium_rate.set_national_number(uint64{123456789});
483   success = phone_util_.GetExampleNumberForNonGeoEntity(979 , &test_number);
484   EXPECT_TRUE(success);
485   EXPECT_EQ(universal_premium_rate, test_number);
486 }
487 
TEST_F(PhoneNumberUtilTest,GetExampleNumberWithoutRegion)488 TEST_F(PhoneNumberUtilTest, GetExampleNumberWithoutRegion) {
489   // In our test metadata we don't cover all types: in our real metadata, we do.
490   PhoneNumber test_number;
491   bool success = phone_util_.GetExampleNumberForType(
492       PhoneNumberUtil::FIXED_LINE,
493       &test_number);
494   // We test that the call to get an example number succeeded, and that the
495   // number passed in was modified.
496   EXPECT_TRUE(success);
497   EXPECT_NE(PhoneNumber::default_instance(), test_number);
498   test_number.Clear();
499 
500   success = phone_util_.GetExampleNumberForType(PhoneNumberUtil::MOBILE,
501                                                 &test_number);
502   EXPECT_TRUE(success);
503   EXPECT_NE(PhoneNumber::default_instance(), test_number);
504   test_number.Clear();
505 
506   success = phone_util_.GetExampleNumberForType(PhoneNumberUtil::PREMIUM_RATE,
507                                                 &test_number);
508   EXPECT_TRUE(success);
509   EXPECT_NE(PhoneNumber::default_instance(), test_number);
510 }
511 
TEST_F(PhoneNumberUtilTest,FormatUSNumber)512 TEST_F(PhoneNumberUtilTest, FormatUSNumber) {
513   PhoneNumber test_number;
514   string formatted_number;
515   test_number.set_country_code(1);
516   test_number.set_national_number(uint64{6502530000});
517   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
518   EXPECT_EQ("650 253 0000", formatted_number);
519   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
520                      &formatted_number);
521   EXPECT_EQ("+1 650 253 0000", formatted_number);
522 
523   test_number.set_national_number(uint64{8002530000});
524   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
525   EXPECT_EQ("800 253 0000", formatted_number);
526   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
527                      &formatted_number);
528   EXPECT_EQ("+1 800 253 0000", formatted_number);
529 
530   test_number.set_national_number(uint64{9002530000});
531   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
532   EXPECT_EQ("900 253 0000", formatted_number);
533   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
534                      &formatted_number);
535   EXPECT_EQ("+1 900 253 0000", formatted_number);
536   phone_util_.Format(test_number, PhoneNumberUtil::RFC3966, &formatted_number);
537   EXPECT_EQ("tel:+1-900-253-0000", formatted_number);
538   test_number.set_national_number(uint64{0});
539   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
540   EXPECT_EQ("0", formatted_number);
541   // Numbers with all zeros in the national number part will be formatted by
542   // using the raw_input if that is available no matter which format is
543   // specified.
544   test_number.set_raw_input("000-000-0000");
545   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
546   EXPECT_EQ("000-000-0000", formatted_number);
547 }
548 
TEST_F(PhoneNumberUtilTest,FormatBSNumber)549 TEST_F(PhoneNumberUtilTest, FormatBSNumber) {
550   PhoneNumber test_number;
551   string formatted_number;
552   test_number.set_country_code(1);
553   test_number.set_national_number(uint64{2421234567});
554   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
555   EXPECT_EQ("242 123 4567", formatted_number);
556   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
557                      &formatted_number);
558   EXPECT_EQ("+1 242 123 4567", formatted_number);
559 
560   test_number.set_national_number(uint64{8002530000});
561   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
562   EXPECT_EQ("800 253 0000", formatted_number);
563   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
564                      &formatted_number);
565   EXPECT_EQ("+1 800 253 0000", formatted_number);
566 
567   test_number.set_national_number(uint64{9002530000});
568   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
569   EXPECT_EQ("900 253 0000", formatted_number);
570   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
571                      &formatted_number);
572   EXPECT_EQ("+1 900 253 0000", formatted_number);
573 }
574 
TEST_F(PhoneNumberUtilTest,FormatGBNumber)575 TEST_F(PhoneNumberUtilTest, FormatGBNumber) {
576   PhoneNumber test_number;
577   string formatted_number;
578   test_number.set_country_code(44);
579   test_number.set_national_number(uint64{2087389353});
580   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
581   EXPECT_EQ("(020) 8738 9353", formatted_number);
582   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
583                      &formatted_number);
584   EXPECT_EQ("+44 20 8738 9353", formatted_number);
585 
586   test_number.set_national_number(uint64{7912345678});
587   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
588   EXPECT_EQ("(07912) 345 678", formatted_number);
589   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
590                      &formatted_number);
591   EXPECT_EQ("+44 7912 345 678", formatted_number);
592 }
593 
TEST_F(PhoneNumberUtilTest,FormatDENumber)594 TEST_F(PhoneNumberUtilTest, FormatDENumber) {
595   PhoneNumber test_number;
596   string formatted_number;
597   test_number.set_country_code(49);
598   test_number.set_national_number(uint64{301234});
599   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
600   EXPECT_EQ("030/1234", formatted_number);
601   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
602                      &formatted_number);
603   EXPECT_EQ("+49 30/1234", formatted_number);
604   phone_util_.Format(test_number, PhoneNumberUtil::RFC3966, &formatted_number);
605   EXPECT_EQ("tel:+49-30-1234", formatted_number);
606 
607   test_number.set_national_number(uint64{291123});
608   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
609   EXPECT_EQ("0291 123", formatted_number);
610   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
611                      &formatted_number);
612   EXPECT_EQ("+49 291 123", formatted_number);
613 
614   test_number.set_national_number(uint64{29112345678});
615   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
616   EXPECT_EQ("0291 12345678", formatted_number);
617   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
618                      &formatted_number);
619   EXPECT_EQ("+49 291 12345678", formatted_number);
620 
621   test_number.set_national_number(uint64{9123123});
622   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
623   EXPECT_EQ("09123 123", formatted_number);
624   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
625                      &formatted_number);
626   EXPECT_EQ("+49 9123 123", formatted_number);
627 
628   test_number.set_national_number(uint64{80212345});
629   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
630   EXPECT_EQ("08021 2345", formatted_number);
631   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
632                      &formatted_number);
633   EXPECT_EQ("+49 8021 2345", formatted_number);
634 
635   test_number.set_national_number(uint64{1234});
636   // Note this number is correctly formatted without national prefix. Most of
637   // the numbers that are treated as invalid numbers by the library are short
638   // numbers, and they are usually not dialed with national prefix.
639   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
640   EXPECT_EQ("1234", formatted_number);
641   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
642                      &formatted_number);
643   EXPECT_EQ("+49 1234", formatted_number);
644 }
645 
TEST_F(PhoneNumberUtilTest,FormatITNumber)646 TEST_F(PhoneNumberUtilTest, FormatITNumber) {
647   PhoneNumber test_number;
648   string formatted_number;
649   test_number.set_country_code(39);
650   test_number.set_national_number(uint64{236618300});
651   test_number.set_italian_leading_zero(true);
652   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
653   EXPECT_EQ("02 3661 8300", formatted_number);
654   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
655                      &formatted_number);
656   EXPECT_EQ("+39 02 3661 8300", formatted_number);
657   phone_util_.Format(test_number, PhoneNumberUtil::E164,
658                      &formatted_number);
659   EXPECT_EQ("+390236618300", formatted_number);
660 
661   test_number.set_national_number(uint64{345678901});
662   test_number.set_italian_leading_zero(false);
663   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
664   EXPECT_EQ("345 678 901", formatted_number);
665   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
666                      &formatted_number);
667   EXPECT_EQ("+39 345 678 901", formatted_number);
668   phone_util_.Format(test_number, PhoneNumberUtil::E164,
669                      &formatted_number);
670   EXPECT_EQ("+39345678901", formatted_number);
671 }
672 
TEST_F(PhoneNumberUtilTest,FormatAUNumber)673 TEST_F(PhoneNumberUtilTest, FormatAUNumber) {
674   PhoneNumber test_number;
675   string formatted_number;
676   test_number.set_country_code(61);
677   test_number.set_national_number(uint64{236618300});
678   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
679   EXPECT_EQ("02 3661 8300", formatted_number);
680   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
681                      &formatted_number);
682   EXPECT_EQ("+61 2 3661 8300", formatted_number);
683   phone_util_.Format(test_number, PhoneNumberUtil::E164,
684                      &formatted_number);
685   EXPECT_EQ("+61236618300", formatted_number);
686 
687   test_number.set_national_number(uint64{1800123456});
688   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
689   EXPECT_EQ("1800 123 456", formatted_number);
690   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
691                      &formatted_number);
692   EXPECT_EQ("+61 1800 123 456", formatted_number);
693   phone_util_.Format(test_number, PhoneNumberUtil::E164,
694                      &formatted_number);
695   EXPECT_EQ("+611800123456", formatted_number);
696 }
697 
TEST_F(PhoneNumberUtilTest,FormatARNumber)698 TEST_F(PhoneNumberUtilTest, FormatARNumber) {
699   PhoneNumber test_number;
700   string formatted_number;
701   test_number.set_country_code(54);
702   test_number.set_national_number(uint64{1187654321});
703   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
704   EXPECT_EQ("011 8765-4321", formatted_number);
705   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
706                      &formatted_number);
707   EXPECT_EQ("+54 11 8765-4321", formatted_number);
708   phone_util_.Format(test_number, PhoneNumberUtil::E164,
709                      &formatted_number);
710   EXPECT_EQ("+541187654321", formatted_number);
711 
712   test_number.set_national_number(uint64{91187654321});
713   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
714   EXPECT_EQ("011 15 8765-4321", formatted_number);
715   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
716                      &formatted_number);
717   EXPECT_EQ("+54 9 11 8765 4321", formatted_number);
718   phone_util_.Format(test_number, PhoneNumberUtil::E164,
719                      &formatted_number);
720   EXPECT_EQ("+5491187654321", formatted_number);
721 }
722 
TEST_F(PhoneNumberUtilTest,FormatMXNumber)723 TEST_F(PhoneNumberUtilTest, FormatMXNumber) {
724   PhoneNumber test_number;
725   string formatted_number;
726   test_number.set_country_code(52);
727   test_number.set_national_number(uint64{12345678900});
728   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
729   EXPECT_EQ("045 234 567 8900", formatted_number);
730   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
731                      &formatted_number);
732   EXPECT_EQ("+52 1 234 567 8900", formatted_number);
733   phone_util_.Format(test_number, PhoneNumberUtil::E164,
734                      &formatted_number);
735   EXPECT_EQ("+5212345678900", formatted_number);
736 
737   test_number.set_national_number(uint64{15512345678});
738   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
739   EXPECT_EQ("045 55 1234 5678", formatted_number);
740   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
741                      &formatted_number);
742   EXPECT_EQ("+52 1 55 1234 5678", formatted_number);
743   phone_util_.Format(test_number, PhoneNumberUtil::E164,
744                      &formatted_number);
745   EXPECT_EQ("+5215512345678", formatted_number);
746 
747   test_number.set_national_number(3312345678LL);
748   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
749   EXPECT_EQ("01 33 1234 5678", formatted_number);
750   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
751                      &formatted_number);
752   EXPECT_EQ("+52 33 1234 5678", formatted_number);
753   phone_util_.Format(test_number, PhoneNumberUtil::E164,
754                      &formatted_number);
755   EXPECT_EQ("+523312345678", formatted_number);
756 
757   test_number.set_national_number(8211234567LL);
758   phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
759   EXPECT_EQ("01 821 123 4567", formatted_number);
760   phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
761                      &formatted_number);
762   EXPECT_EQ("+52 821 123 4567", formatted_number);
763   phone_util_.Format(test_number, PhoneNumberUtil::E164,
764                      &formatted_number);
765   EXPECT_EQ("+528211234567", formatted_number);
766 }
767 
TEST_F(PhoneNumberUtilTest,FormatOutOfCountryCallingNumber)768 TEST_F(PhoneNumberUtilTest, FormatOutOfCountryCallingNumber) {
769   PhoneNumber test_number;
770   string formatted_number;
771   test_number.set_country_code(1);
772   test_number.set_national_number(uint64{9002530000});
773   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::DE(),
774                                               &formatted_number);
775   EXPECT_EQ("00 1 900 253 0000", formatted_number);
776 
777   test_number.set_national_number(uint64{6502530000});
778   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::BS(),
779                                               &formatted_number);
780   EXPECT_EQ("1 650 253 0000", formatted_number);
781   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::PL(),
782                                               &formatted_number);
783   EXPECT_EQ("00 1 650 253 0000", formatted_number);
784 
785   test_number.set_country_code(44);
786   test_number.set_national_number(uint64{7912345678});
787   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
788                                               &formatted_number);
789   EXPECT_EQ("011 44 7912 345 678", formatted_number);
790 
791   test_number.set_country_code(49);
792   test_number.set_national_number(uint64{1234});
793   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::GB(),
794                                               &formatted_number);
795   EXPECT_EQ("00 49 1234", formatted_number);
796   // Note this number is correctly formatted without national prefix. Most of
797   // the numbers that are treated as invalid numbers by the library are short
798   // numbers, and they are usually not dialed with national prefix.
799   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::DE(),
800                                               &formatted_number);
801   EXPECT_EQ("1234", formatted_number);
802 
803   test_number.set_country_code(39);
804   test_number.set_national_number(uint64{236618300});
805   test_number.set_italian_leading_zero(true);
806   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
807                                               &formatted_number);
808   EXPECT_EQ("011 39 02 3661 8300", formatted_number);
809   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::IT(),
810                                               &formatted_number);
811   EXPECT_EQ("02 3661 8300", formatted_number);
812   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::SG(),
813                                               &formatted_number);
814   EXPECT_EQ("+39 02 3661 8300", formatted_number);
815 
816   test_number.set_country_code(65);
817   test_number.set_national_number(uint64{94777892});
818   test_number.set_italian_leading_zero(false);
819   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::SG(),
820                                               &formatted_number);
821   EXPECT_EQ("9477 7892", formatted_number);
822 
823   test_number.set_country_code(800);
824   test_number.set_national_number(uint64{12345678});
825   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
826                                               &formatted_number);
827   EXPECT_EQ("011 800 1234 5678", formatted_number);
828 
829   test_number.set_country_code(54);
830   test_number.set_national_number(uint64{91187654321});
831   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
832                                               &formatted_number);
833   EXPECT_EQ("011 54 9 11 8765 4321", formatted_number);
834 
835   test_number.set_extension("1234");
836   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
837                                               &formatted_number);
838   EXPECT_EQ("011 54 9 11 8765 4321 ext. 1234", formatted_number);
839   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AU(),
840                                               &formatted_number);
841   EXPECT_EQ("0011 54 9 11 8765 4321 ext. 1234", formatted_number);
842   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AR(),
843                                               &formatted_number);
844   EXPECT_EQ("011 15 8765-4321 ext. 1234", formatted_number);
845 }
846 
TEST_F(PhoneNumberUtilTest,FormatOutOfCountryWithInvalidRegion)847 TEST_F(PhoneNumberUtilTest, FormatOutOfCountryWithInvalidRegion) {
848   PhoneNumber test_number;
849   string formatted_number;
850   test_number.set_country_code(1);
851   test_number.set_national_number(uint64{6502530000});
852   // AQ/Antarctica isn't a valid region code for phone number formatting,
853   // so this falls back to intl formatting.
854   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AQ(),
855                                               &formatted_number);
856   EXPECT_EQ("+1 650 253 0000", formatted_number);
857   // For region code 001, the out-of-country format always turns into the
858   // international format.
859   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::UN001(),
860                                               &formatted_number);
861   EXPECT_EQ("+1 650 253 0000", formatted_number);
862 }
863 
TEST_F(PhoneNumberUtilTest,FormatOutOfCountryWithPreferredIntlPrefix)864 TEST_F(PhoneNumberUtilTest, FormatOutOfCountryWithPreferredIntlPrefix) {
865   PhoneNumber test_number;
866   string formatted_number;
867   test_number.set_country_code(39);
868   test_number.set_national_number(uint64{236618300});
869   test_number.set_italian_leading_zero(true);
870   // This should use 0011, since that is the preferred international prefix
871   // (both 0011 and 0012 are accepted as possible international prefixes in our
872   // test metadta.)
873   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AU(),
874                                               &formatted_number);
875   EXPECT_EQ("0011 39 02 3661 8300", formatted_number);
876 
877   // Testing preferred international prefixes with ~ are supported (designates
878   // waiting).
879   phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::UZ(),
880                                               &formatted_number);
881   EXPECT_EQ("8~10 39 02 3661 8300", formatted_number);
882 }
883 
TEST_F(PhoneNumberUtilTest,FormatOutOfCountryKeepingAlphaChars)884 TEST_F(PhoneNumberUtilTest, FormatOutOfCountryKeepingAlphaChars) {
885   PhoneNumber alpha_numeric_number;
886   string formatted_number;
887   alpha_numeric_number.set_country_code(1);
888   alpha_numeric_number.set_national_number(uint64{8007493524});
889   alpha_numeric_number.set_raw_input("1800 six-flag");
890   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
891                                                   RegionCode::AU(),
892                                                   &formatted_number);
893   EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number);
894 
895   formatted_number.clear();
896   alpha_numeric_number.set_raw_input("1-800-SIX-flag");
897   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
898                                                   RegionCode::AU(),
899                                                   &formatted_number);
900   EXPECT_EQ("0011 1 800-SIX-FLAG", formatted_number);
901 
902   formatted_number.clear();
903   alpha_numeric_number.set_raw_input("Call us from UK: 00 1 800 SIX-flag");
904   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
905                                                   RegionCode::AU(),
906                                                   &formatted_number);
907   EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number);
908 
909   formatted_number.clear();
910   alpha_numeric_number.set_raw_input("800 SIX-flag");
911   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
912                                                   RegionCode::AU(),
913                                                   &formatted_number);
914   EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number);
915 
916   // Formatting from within the NANPA region.
917   formatted_number.clear();
918   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
919                                                   RegionCode::US(),
920                                                   &formatted_number);
921   EXPECT_EQ("1 800 SIX-FLAG", formatted_number);
922   formatted_number.clear();
923   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
924                                                   RegionCode::BS(),
925                                                   &formatted_number);
926   EXPECT_EQ("1 800 SIX-FLAG", formatted_number);
927 
928   // Testing that if the raw input doesn't exist, it is formatted using
929   // FormatOutOfCountryCallingNumber.
930   alpha_numeric_number.clear_raw_input();
931   formatted_number.clear();
932   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
933                                                   RegionCode::DE(),
934                                                   &formatted_number);
935   EXPECT_EQ("00 1 800 749 3524", formatted_number);
936 
937   // Testing AU alpha number formatted from Australia.
938   alpha_numeric_number.set_country_code(61);
939   alpha_numeric_number.set_national_number(uint64{827493524});
940   alpha_numeric_number.set_raw_input("+61 82749-FLAG");
941   formatted_number.clear();
942   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
943                                                   RegionCode::AU(),
944                                                   &formatted_number);
945   // This number should have the national prefix prefixed.
946   EXPECT_EQ("082749-FLAG", formatted_number);
947 
948   alpha_numeric_number.set_raw_input("082749-FLAG");
949   formatted_number.clear();
950   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
951                                                   RegionCode::AU(),
952                                                   &formatted_number);
953   EXPECT_EQ("082749-FLAG", formatted_number);
954 
955   alpha_numeric_number.set_national_number(uint64{18007493524});
956   alpha_numeric_number.set_raw_input("1-800-SIX-flag");
957   formatted_number.clear();
958   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
959                                                   RegionCode::AU(),
960                                                   &formatted_number);
961   // This number should not have the national prefix prefixed, in accordance
962   // with the override for this specific formatting rule.
963   EXPECT_EQ("1-800-SIX-FLAG", formatted_number);
964   // The metadata should not be permanently changed, since we copied it before
965   // modifying patterns. Here we check this.
966   formatted_number.clear();
967   alpha_numeric_number.set_national_number(uint64{1800749352});
968   phone_util_.FormatOutOfCountryCallingNumber(alpha_numeric_number,
969                                               RegionCode::AU(),
970                                               &formatted_number);
971   EXPECT_EQ("1800 749 352", formatted_number);
972 
973   // Testing a country with multiple international prefixes.
974   formatted_number.clear();
975   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
976                                                   RegionCode::SG(),
977                                                   &formatted_number);
978   EXPECT_EQ("+61 1-800-SIX-FLAG", formatted_number);
979   // Testing the case of calling from a non-supported region.
980   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
981                                                   RegionCode::AQ(),
982                                                   &formatted_number);
983   EXPECT_EQ("+61 1-800-SIX-FLAG", formatted_number);
984 
985   // Testing the case with an invalid country code.
986   formatted_number.clear();
987   alpha_numeric_number.set_country_code(0);
988   alpha_numeric_number.set_national_number(uint64{18007493524});
989   alpha_numeric_number.set_raw_input("1-800-SIX-flag");
990   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
991                                                   RegionCode::DE(),
992                                                   &formatted_number);
993   // Uses the raw input only.
994   EXPECT_EQ("1-800-SIX-flag", formatted_number);
995 
996   // Testing the case of an invalid alpha number.
997   formatted_number.clear();
998   alpha_numeric_number.set_country_code(1);
999   alpha_numeric_number.set_national_number(uint64{80749});
1000   alpha_numeric_number.set_raw_input("180-SIX");
1001   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
1002                                                   RegionCode::DE(),
1003                                                   &formatted_number);
1004   // No country-code stripping can be done.
1005   EXPECT_EQ("00 1 180-SIX", formatted_number);
1006   // Testing the case of calling from a non-supported region.
1007   phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
1008                                                   RegionCode::AQ(),
1009                                                   &formatted_number);
1010   // No country-code stripping can be done since the number is invalid.
1011   EXPECT_EQ("+1 180-SIX", formatted_number);
1012 }
1013 
TEST_F(PhoneNumberUtilTest,FormatWithCarrierCode)1014 TEST_F(PhoneNumberUtilTest, FormatWithCarrierCode) {
1015   // We only support this for AR in our test metadata.
1016   PhoneNumber ar_number;
1017   string formatted_number;
1018   ar_number.set_country_code(54);
1019   ar_number.set_national_number(uint64{91234125678});
1020   phone_util_.Format(ar_number, PhoneNumberUtil::NATIONAL, &formatted_number);
1021   EXPECT_EQ("01234 12-5678", formatted_number);
1022   // Test formatting with a carrier code.
1023   phone_util_.FormatNationalNumberWithCarrierCode(ar_number, "15",
1024                                                   &formatted_number);
1025   EXPECT_EQ("01234 15 12-5678", formatted_number);
1026   phone_util_.FormatNationalNumberWithCarrierCode(ar_number, "",
1027                                                   &formatted_number);
1028   EXPECT_EQ("01234 12-5678", formatted_number);
1029   // Here the international rule is used, so no carrier code should be present.
1030   phone_util_.Format(ar_number, PhoneNumberUtil::E164, &formatted_number);
1031   EXPECT_EQ("+5491234125678", formatted_number);
1032 
1033   // We don't support this for the US so there should be no change.
1034   PhoneNumber us_number;
1035   us_number.set_country_code(1);
1036   us_number.set_national_number(uint64{4241231234});
1037   phone_util_.Format(us_number, PhoneNumberUtil::NATIONAL, &formatted_number);
1038   EXPECT_EQ("424 123 1234", formatted_number);
1039   phone_util_.FormatNationalNumberWithCarrierCode(us_number, "15",
1040                                                   &formatted_number);
1041   EXPECT_EQ("424 123 1234", formatted_number);
1042 
1043   // Invalid country code should just get the NSN.
1044   PhoneNumber invalid_number;
1045   invalid_number.set_country_code(kInvalidCountryCode);
1046   invalid_number.set_national_number(uint64{12345});
1047   phone_util_.FormatNationalNumberWithCarrierCode(invalid_number, "89",
1048                                                   &formatted_number);
1049   EXPECT_EQ("12345", formatted_number);
1050 }
1051 
TEST_F(PhoneNumberUtilTest,FormatWithPreferredCarrierCode)1052 TEST_F(PhoneNumberUtilTest, FormatWithPreferredCarrierCode) {
1053   // We only support this for AR in our test metadata.
1054   PhoneNumber ar_number;
1055   string formatted_number;
1056   ar_number.set_country_code(54);
1057   ar_number.set_national_number(uint64{91234125678});
1058   // Test formatting with no preferred carrier code stored in the number itself.
1059   phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15",
1060                                                            &formatted_number);
1061   EXPECT_EQ("01234 15 12-5678", formatted_number);
1062   phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "",
1063                                                            &formatted_number);
1064   EXPECT_EQ("01234 12-5678", formatted_number);
1065   // Test formatting with preferred carrier code present.
1066   ar_number.set_preferred_domestic_carrier_code("19");
1067   phone_util_.Format(ar_number, PhoneNumberUtil::NATIONAL, &formatted_number);
1068   EXPECT_EQ("01234 12-5678", formatted_number);
1069   phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15",
1070                                                            &formatted_number);
1071   EXPECT_EQ("01234 19 12-5678", formatted_number);
1072   phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "",
1073                                                            &formatted_number);
1074   EXPECT_EQ("01234 19 12-5678", formatted_number);
1075   // When the preferred_domestic_carrier_code is present (even when it is just a
1076   // space), use it instead of the default carrier code passed in.
1077   ar_number.set_preferred_domestic_carrier_code(" ");
1078   phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15",
1079                                                            &formatted_number);
1080   EXPECT_EQ("01234   12-5678", formatted_number);
1081   // When the preferred_domestic_carrier_code is present but empty, treat it as
1082   // unset and use instead the default carrier code passed in.
1083   ar_number.set_preferred_domestic_carrier_code("");
1084   phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15",
1085                                                            &formatted_number);
1086   EXPECT_EQ("01234 15 12-5678", formatted_number);
1087   // We don't support this for the US so there should be no change.
1088   PhoneNumber us_number;
1089   us_number.set_country_code(1);
1090   us_number.set_national_number(uint64{4241231234});
1091   us_number.set_preferred_domestic_carrier_code("99");
1092   phone_util_.Format(us_number, PhoneNumberUtil::NATIONAL, &formatted_number);
1093   EXPECT_EQ("424 123 1234", formatted_number);
1094   phone_util_.FormatNationalNumberWithPreferredCarrierCode(us_number, "15",
1095                                                            &formatted_number);
1096   EXPECT_EQ("424 123 1234", formatted_number);
1097 }
1098 
TEST_F(PhoneNumberUtilTest,FormatNumberForMobileDialing)1099 TEST_F(PhoneNumberUtilTest, FormatNumberForMobileDialing) {
1100   PhoneNumber test_number;
1101   string formatted_number;
1102 
1103   // Numbers are normally dialed in national format in-country, and
1104   // international format from outside the country.
1105   test_number.set_country_code(49);
1106   test_number.set_national_number(uint64{30123456});
1107   phone_util_.FormatNumberForMobileDialing(
1108       test_number, RegionCode::DE(), false, /* remove formatting */
1109       &formatted_number);
1110   EXPECT_EQ("030123456", formatted_number);
1111   phone_util_.FormatNumberForMobileDialing(
1112       test_number, RegionCode::CH(), false, /* remove formatting */
1113       &formatted_number);
1114   EXPECT_EQ("+4930123456", formatted_number);
1115 
1116   test_number.set_extension("1234");
1117   phone_util_.FormatNumberForMobileDialing(
1118       test_number, RegionCode::DE(), false, /* remove formatting */
1119       &formatted_number);
1120   EXPECT_EQ("030123456", formatted_number);
1121   phone_util_.FormatNumberForMobileDialing(
1122       test_number, RegionCode::CH(), false, /* remove formatting */
1123       &formatted_number);
1124   EXPECT_EQ("+4930123456", formatted_number);
1125 
1126   test_number.set_country_code(1);
1127   test_number.clear_extension();
1128   // US toll free numbers are marked as noInternationalDialling in the test
1129   // metadata for testing purposes. For such numbers, we expect nothing to be
1130   // returned when the region code is not the same one.
1131   test_number.set_national_number(uint64{8002530000});
1132   phone_util_.FormatNumberForMobileDialing(
1133       test_number, RegionCode::US(), true, /* keep formatting */
1134       &formatted_number);
1135   EXPECT_EQ("800 253 0000", formatted_number);
1136   phone_util_.FormatNumberForMobileDialing(
1137       test_number, RegionCode::CN(), true, &formatted_number);
1138   EXPECT_EQ("", formatted_number);
1139   phone_util_.FormatNumberForMobileDialing(
1140       test_number, RegionCode::US(), false, /* remove formatting */
1141       &formatted_number);
1142   EXPECT_EQ("8002530000", formatted_number);
1143   phone_util_.FormatNumberForMobileDialing(
1144       test_number, RegionCode::CN(), false, &formatted_number);
1145   EXPECT_EQ("", formatted_number);
1146 
1147   test_number.set_national_number(uint64{6502530000});
1148   phone_util_.FormatNumberForMobileDialing(
1149       test_number, RegionCode::US(), true, &formatted_number);
1150   EXPECT_EQ("+1 650 253 0000", formatted_number);
1151   phone_util_.FormatNumberForMobileDialing(
1152       test_number, RegionCode::US(), false, &formatted_number);
1153   EXPECT_EQ("+16502530000", formatted_number);
1154 
1155   test_number.set_extension("1234");
1156   phone_util_.FormatNumberForMobileDialing(
1157       test_number, RegionCode::US(), true, &formatted_number);
1158   EXPECT_EQ("+1 650 253 0000", formatted_number);
1159   phone_util_.FormatNumberForMobileDialing(
1160       test_number, RegionCode::US(), false, &formatted_number);
1161   EXPECT_EQ("+16502530000", formatted_number);
1162 
1163   // An invalid US number, which is one digit too long.
1164   test_number.set_national_number(uint64{65025300001});
1165   phone_util_.FormatNumberForMobileDialing(
1166       test_number, RegionCode::US(), true, &formatted_number);
1167   EXPECT_EQ("+1 65025300001", formatted_number);
1168   phone_util_.FormatNumberForMobileDialing(
1169       test_number, RegionCode::US(), false, &formatted_number);
1170   EXPECT_EQ("+165025300001", formatted_number);
1171 
1172   // Star numbers. In real life they appear in Israel, but we have them in JP
1173   // in our test metadata.
1174   test_number.set_country_code(81);
1175   test_number.set_national_number(uint64{2345});
1176   phone_util_.FormatNumberForMobileDialing(
1177       test_number, RegionCode::JP(), true, &formatted_number);
1178   EXPECT_EQ("*2345", formatted_number);
1179   phone_util_.FormatNumberForMobileDialing(
1180       test_number, RegionCode::JP(), false, &formatted_number);
1181   EXPECT_EQ("*2345", formatted_number);
1182 
1183   test_number.set_country_code(800);
1184   test_number.set_national_number(uint64{12345678});
1185   phone_util_.FormatNumberForMobileDialing(
1186       test_number, RegionCode::JP(), false, &formatted_number);
1187   EXPECT_EQ("+80012345678", formatted_number);
1188   phone_util_.FormatNumberForMobileDialing(
1189       test_number, RegionCode::JP(), true, &formatted_number);
1190   EXPECT_EQ("+800 1234 5678", formatted_number);
1191 
1192   // UAE numbers beginning with 600 (classified as UAN) need to be dialled
1193   // without +971 locally.
1194   test_number.set_country_code(971);
1195   test_number.set_national_number(uint64{600123456});
1196   phone_util_.FormatNumberForMobileDialing(
1197       test_number, RegionCode::JP(), false, &formatted_number);
1198   EXPECT_EQ("+971600123456", formatted_number);
1199   phone_util_.FormatNumberForMobileDialing(
1200       test_number, RegionCode::AE(), true, &formatted_number);
1201   EXPECT_EQ("600123456", formatted_number);
1202 
1203   test_number.set_country_code(52);
1204   test_number.set_national_number(uint64{3312345678});
1205   phone_util_.FormatNumberForMobileDialing(
1206       test_number, RegionCode::MX(), false, &formatted_number);
1207   EXPECT_EQ("+523312345678", formatted_number);
1208   phone_util_.FormatNumberForMobileDialing(
1209       test_number, RegionCode::US(), false, &formatted_number);
1210   EXPECT_EQ("+523312345678", formatted_number);
1211 
1212   // Test whether Uzbek phone numbers are returned in international format even
1213   // when dialled from same region or other regions.
1214   // Fixed-line number
1215   test_number.set_country_code(998);
1216   test_number.set_national_number(uint64{612201234});
1217   phone_util_.FormatNumberForMobileDialing(
1218       test_number, RegionCode::UZ(), false, &formatted_number);
1219   EXPECT_EQ("+998612201234", formatted_number);
1220   // Mobile number
1221   test_number.set_country_code(998);
1222   test_number.set_national_number(uint64{950123456});
1223   phone_util_.FormatNumberForMobileDialing(
1224       test_number, RegionCode::UZ(), false, &formatted_number);
1225   EXPECT_EQ("+998950123456", formatted_number);
1226   phone_util_.FormatNumberForMobileDialing(
1227       test_number, RegionCode::US(), false, &formatted_number);
1228   EXPECT_EQ("+998950123456", formatted_number);
1229 
1230   // Non-geographical numbers should always be dialed in international format.
1231   test_number.set_country_code(800);
1232   test_number.set_national_number(uint64{12345678});
1233   phone_util_.FormatNumberForMobileDialing(
1234       test_number, RegionCode::US(), false, &formatted_number);
1235   EXPECT_EQ("+80012345678", formatted_number);
1236   phone_util_.FormatNumberForMobileDialing(
1237       test_number, RegionCode::UN001(), false, &formatted_number);
1238   EXPECT_EQ("+80012345678", formatted_number);
1239 
1240   // Test that a short number is formatted correctly for mobile dialing within
1241   // the region, and is not diallable from outside the region.
1242   test_number.set_country_code(49);
1243   test_number.set_national_number(123L);
1244   phone_util_.FormatNumberForMobileDialing(
1245       test_number, RegionCode::DE(), false, &formatted_number);
1246   EXPECT_EQ("123", formatted_number);
1247   phone_util_.FormatNumberForMobileDialing(
1248       test_number, RegionCode::IT(), false, &formatted_number);
1249   EXPECT_EQ("", formatted_number);
1250 
1251   // Test the special logic for NANPA countries, for which regular length phone
1252   // numbers are always output in international format, but short numbers are
1253   // in national format.
1254   test_number.set_country_code(1);
1255   test_number.set_national_number(uint64{6502530000});
1256   phone_util_.FormatNumberForMobileDialing(
1257       test_number, RegionCode::US(), false, &formatted_number);
1258   EXPECT_EQ("+16502530000", formatted_number);
1259   phone_util_.FormatNumberForMobileDialing(
1260       test_number, RegionCode::CA(), false, &formatted_number);
1261   EXPECT_EQ("+16502530000", formatted_number);
1262   phone_util_.FormatNumberForMobileDialing(
1263       test_number, RegionCode::BR(), false, &formatted_number);
1264   EXPECT_EQ("+16502530000", formatted_number);
1265   test_number.set_national_number(911L);
1266   phone_util_.FormatNumberForMobileDialing(
1267       test_number, RegionCode::US(), false, &formatted_number);
1268   EXPECT_EQ("911", formatted_number);
1269   phone_util_.FormatNumberForMobileDialing(
1270       test_number, RegionCode::CA(), false, &formatted_number);
1271   EXPECT_EQ("", formatted_number);
1272   phone_util_.FormatNumberForMobileDialing(
1273       test_number, RegionCode::BR(), false, &formatted_number);
1274   EXPECT_EQ("", formatted_number);
1275   // Test that the Australian emergency number 000 is formatted correctly.
1276   test_number.set_country_code(61);
1277   test_number.set_national_number(0L);
1278   test_number.set_italian_leading_zero(true);
1279   test_number.set_number_of_leading_zeros(2);
1280   phone_util_.FormatNumberForMobileDialing(
1281       test_number, RegionCode::AU(), false, &formatted_number);
1282   EXPECT_EQ("000", formatted_number);
1283   phone_util_.FormatNumberForMobileDialing(
1284       test_number, RegionCode::NZ(), false, &formatted_number);
1285   EXPECT_EQ("", formatted_number);
1286 }
1287 
TEST_F(PhoneNumberUtilTest,FormatByPattern)1288 TEST_F(PhoneNumberUtilTest, FormatByPattern) {
1289   PhoneNumber test_number;
1290   string formatted_number;
1291   test_number.set_country_code(1);
1292   test_number.set_national_number(uint64{6502530000});
1293 
1294   RepeatedPtrField<NumberFormat> number_formats;
1295   NumberFormat* number_format = number_formats.Add();
1296   number_format->set_pattern("(\\d{3})(\\d{3})(\\d{4})");
1297   number_format->set_format("($1) $2-$3");
1298   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
1299                               number_formats,
1300                               &formatted_number);
1301   EXPECT_EQ("(650) 253-0000", formatted_number);
1302   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL,
1303                               number_formats,
1304                               &formatted_number);
1305   EXPECT_EQ("+1 (650) 253-0000", formatted_number);
1306   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::RFC3966,
1307                               number_formats,
1308                               &formatted_number);
1309   EXPECT_EQ("tel:+1-650-253-0000", formatted_number);
1310 
1311   // $NP is set to '1' for the US. Here we check that for other NANPA countries
1312   // the US rules are followed.
1313   number_format->set_national_prefix_formatting_rule("$NP ($FG)");
1314   number_format->set_format("$1 $2-$3");
1315   test_number.set_country_code(1);
1316   test_number.set_national_number(uint64{4168819999});
1317   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
1318                               number_formats,
1319                               &formatted_number);
1320   EXPECT_EQ("1 (416) 881-9999", formatted_number);
1321   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL,
1322                               number_formats,
1323                               &formatted_number);
1324   EXPECT_EQ("+1 416 881-9999", formatted_number);
1325 
1326   test_number.set_country_code(39);
1327   test_number.set_national_number(uint64{236618300});
1328   test_number.set_italian_leading_zero(true);
1329   number_format->set_pattern("(\\d{2})(\\d{5})(\\d{3})");
1330   number_format->set_format("$1-$2 $3");
1331   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
1332                               number_formats,
1333                               &formatted_number);
1334   EXPECT_EQ("02-36618 300", formatted_number);
1335   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL,
1336                               number_formats,
1337                               &formatted_number);
1338   EXPECT_EQ("+39 02-36618 300", formatted_number);
1339 
1340   test_number.set_country_code(44);
1341   test_number.set_national_number(uint64{2012345678});
1342   test_number.set_italian_leading_zero(false);
1343   number_format->set_national_prefix_formatting_rule("$NP$FG");
1344   number_format->set_pattern("(\\d{2})(\\d{4})(\\d{4})");
1345   number_format->set_format("$1 $2 $3");
1346   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
1347                               number_formats,
1348                               &formatted_number);
1349   EXPECT_EQ("020 1234 5678", formatted_number);
1350 
1351   number_format->set_national_prefix_formatting_rule("($NP$FG)");
1352   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
1353                               number_formats,
1354                               &formatted_number);
1355   EXPECT_EQ("(020) 1234 5678", formatted_number);
1356   number_format->set_national_prefix_formatting_rule("");
1357   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
1358                               number_formats,
1359                               &formatted_number);
1360   EXPECT_EQ("20 1234 5678", formatted_number);
1361   number_format->set_national_prefix_formatting_rule("");
1362   phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL,
1363                               number_formats,
1364                               &formatted_number);
1365   EXPECT_EQ("+44 20 1234 5678", formatted_number);
1366 }
1367 
TEST_F(PhoneNumberUtilTest,FormatE164Number)1368 TEST_F(PhoneNumberUtilTest, FormatE164Number) {
1369   PhoneNumber test_number;
1370   string formatted_number;
1371   test_number.set_country_code(1);
1372   test_number.set_national_number(uint64{6502530000});
1373   phone_util_.Format(test_number, PhoneNumberUtil::E164, &formatted_number);
1374   EXPECT_EQ("+16502530000", formatted_number);
1375 
1376   test_number.set_country_code(49);
1377   test_number.set_national_number(uint64{301234});
1378   phone_util_.Format(test_number, PhoneNumberUtil::E164, &formatted_number);
1379   EXPECT_EQ("+49301234", formatted_number);
1380 
1381   test_number.set_country_code(800);
1382   test_number.set_national_number(uint64{12345678});
1383   phone_util_.Format(test_number, PhoneNumberUtil::E164, &formatted_number);
1384   EXPECT_EQ("+80012345678", formatted_number);
1385 }
1386 
TEST_F(PhoneNumberUtilTest,FormatNumberWithExtension)1387 TEST_F(PhoneNumberUtilTest, FormatNumberWithExtension) {
1388   PhoneNumber nz_number;
1389   nz_number.set_country_code(64);
1390   nz_number.set_national_number(uint64{33316005});
1391   nz_number.set_extension("1234");
1392   string formatted_number;
1393   // Uses default extension prefix:
1394   phone_util_.Format(nz_number, PhoneNumberUtil::NATIONAL, &formatted_number);
1395   EXPECT_EQ("03-331 6005 ext. 1234", formatted_number);
1396   // Uses RFC 3966 syntax.
1397   phone_util_.Format(nz_number, PhoneNumberUtil::RFC3966, &formatted_number);
1398   EXPECT_EQ("tel:+64-3-331-6005;ext=1234", formatted_number);
1399   // Extension prefix overridden in the territory information for the US:
1400   PhoneNumber us_number_with_extension;
1401   us_number_with_extension.set_country_code(1);
1402   us_number_with_extension.set_national_number(uint64{6502530000});
1403   us_number_with_extension.set_extension("4567");
1404   phone_util_.Format(us_number_with_extension,
1405                      PhoneNumberUtil::NATIONAL, &formatted_number);
1406   EXPECT_EQ("650 253 0000 extn. 4567", formatted_number);
1407 }
1408 
TEST_F(PhoneNumberUtilTest,GetLengthOfGeographicalAreaCode)1409 TEST_F(PhoneNumberUtilTest, GetLengthOfGeographicalAreaCode) {
1410   PhoneNumber number;
1411   // Google MTV, which has area code "650".
1412   number.set_country_code(1);
1413   number.set_national_number(uint64{6502530000});
1414   EXPECT_EQ(3, phone_util_.GetLengthOfGeographicalAreaCode(number));
1415 
1416   // A North America toll-free number, which has no area code.
1417   number.set_country_code(1);
1418   number.set_national_number(uint64{8002530000});
1419   EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
1420 
1421   // An invalid US number (1 digit shorter), which has no area code.
1422   number.set_country_code(1);
1423   number.set_national_number(uint64{650253000});
1424   EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
1425 
1426   // Google London, which has area code "20".
1427   number.set_country_code(44);
1428   number.set_national_number(uint64{2070313000});
1429   EXPECT_EQ(2, phone_util_.GetLengthOfGeographicalAreaCode(number));
1430 
1431   // A mobile number in the UK does not have an area code (by default, mobile
1432   // numbers do not, unless they have been added to our list of exceptions).
1433   number.set_country_code(44);
1434   number.set_national_number(uint64{7912345678});
1435   EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
1436 
1437   // Google Buenos Aires, which has area code "11".
1438   number.set_country_code(54);
1439   number.set_national_number(uint64{1155303000});
1440   EXPECT_EQ(2, phone_util_.GetLengthOfGeographicalAreaCode(number));
1441 
1442   // A mobile number in Argentina also has an area code.
1443   number.set_country_code(54);
1444   number.set_national_number(uint64{91187654321});
1445   EXPECT_EQ(3, phone_util_.GetLengthOfGeographicalAreaCode(number));
1446 
1447   // Google Sydney, which has area code "2".
1448   number.set_country_code(61);
1449   number.set_national_number(uint64{293744000});
1450   EXPECT_EQ(1, phone_util_.GetLengthOfGeographicalAreaCode(number));
1451 
1452   // Italian numbers - there is no national prefix, but it still has an area
1453   // code.
1454   number.set_country_code(39);
1455   number.set_national_number(uint64{236618300});
1456   number.set_italian_leading_zero(true);
1457   EXPECT_EQ(2, phone_util_.GetLengthOfGeographicalAreaCode(number));
1458 
1459   // Google Singapore. Singapore has no area code and no national prefix.
1460   number.set_country_code(65);
1461   number.set_national_number(uint64{65218000});
1462   number.set_italian_leading_zero(false);
1463   EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
1464 
1465   // An international toll free number, which has no area code.
1466   number.set_country_code(800);
1467   number.set_national_number(uint64{12345678});
1468   EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
1469 
1470   // A mobile number from China is geographical, but does not have an area code.
1471   PhoneNumber cn_mobile;
1472   cn_mobile.set_country_code(86);
1473   cn_mobile.set_national_number(uint64{18912341234});
1474   EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(cn_mobile));
1475 }
1476 
TEST_F(PhoneNumberUtilTest,GetLengthOfNationalDestinationCode)1477 TEST_F(PhoneNumberUtilTest, GetLengthOfNationalDestinationCode) {
1478   PhoneNumber number;
1479   // Google MTV, which has national destination code (NDC) "650".
1480   number.set_country_code(1);
1481   number.set_national_number(uint64{6502530000});
1482   EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(number));
1483 
1484   // A North America toll-free number, which has NDC "800".
1485   number.set_country_code(1);
1486   number.set_national_number(uint64{8002530000});
1487   EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(number));
1488 
1489   // Google London, which has NDC "20".
1490   number.set_country_code(44);
1491   number.set_national_number(uint64{2070313000});
1492   EXPECT_EQ(2, phone_util_.GetLengthOfNationalDestinationCode(number));
1493 
1494   // A UK mobile phone, which has NDC "7912"
1495   number.set_country_code(44);
1496   number.set_national_number(uint64{7912345678});
1497   EXPECT_EQ(4, phone_util_.GetLengthOfNationalDestinationCode(number));
1498 
1499   // Google Buenos Aires, which has NDC "11".
1500   number.set_country_code(54);
1501   number.set_national_number(uint64{1155303000});
1502   EXPECT_EQ(2, phone_util_.GetLengthOfNationalDestinationCode(number));
1503 
1504   // An Argentinian mobile which has NDC "911".
1505   number.set_country_code(54);
1506   number.set_national_number(uint64{91187654321});
1507   EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(number));
1508 
1509   // Google Sydney, which has NDC "2".
1510   number.set_country_code(61);
1511   number.set_national_number(uint64{293744000});
1512   EXPECT_EQ(1, phone_util_.GetLengthOfNationalDestinationCode(number));
1513 
1514   // Google Singapore. Singapore has NDC "6521".
1515   number.set_country_code(65);
1516   number.set_national_number(uint64{65218000});
1517   EXPECT_EQ(4, phone_util_.GetLengthOfNationalDestinationCode(number));
1518 
1519   // An invalid US number (1 digit shorter), which has no NDC.
1520   number.set_country_code(1);
1521   number.set_national_number(uint64{650253000});
1522   EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number));
1523 
1524   // A number containing an invalid country code, which shouldn't have any NDC.
1525   number.set_country_code(123);
1526   number.set_national_number(uint64{650253000});
1527   EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number));
1528 
1529   // A number that has only one group of digits after country code when
1530   // formatted in the international format.
1531   number.set_country_code(376);
1532   number.set_national_number(uint64{12345});
1533   EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number));
1534 
1535   // The same number above, but with an extension.
1536   number.set_country_code(376);
1537   number.set_national_number(uint64{12345});
1538   number.set_extension("321");
1539   EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number));
1540 
1541   // An international toll free number, which has NDC "1234".
1542   number.Clear();
1543   number.set_country_code(800);
1544   number.set_national_number(uint64{12345678});
1545   EXPECT_EQ(4, phone_util_.GetLengthOfNationalDestinationCode(number));
1546 
1547   // A mobile number from China is geographical, but does not have an area code:
1548   // however it still can be considered to have a national destination code.
1549   PhoneNumber cn_mobile;
1550   cn_mobile.set_country_code(86);
1551   cn_mobile.set_national_number(uint64{18912341234});
1552   EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(cn_mobile));
1553 }
1554 
TEST_F(PhoneNumberUtilTest,GetCountryMobileToken)1555 TEST_F(PhoneNumberUtilTest, GetCountryMobileToken) {
1556   int country_calling_code;
1557   string mobile_token;
1558 
1559   country_calling_code = phone_util_.GetCountryCodeForRegion(RegionCode::AR());
1560   phone_util_.GetCountryMobileToken(country_calling_code, &mobile_token);
1561   EXPECT_EQ("9", mobile_token);
1562 
1563   // Country calling code for Sweden, which has no mobile token.
1564   country_calling_code = phone_util_.GetCountryCodeForRegion(RegionCode::SE());
1565   phone_util_.GetCountryMobileToken(country_calling_code, &mobile_token);
1566   EXPECT_EQ("", mobile_token);
1567 }
1568 
TEST_F(PhoneNumberUtilTest,ExtractPossibleNumber)1569 TEST_F(PhoneNumberUtilTest, ExtractPossibleNumber) {
1570   // Removes preceding funky punctuation and letters but leaves the rest
1571   // untouched.
1572   string extracted_number;
1573   ExtractPossibleNumber("Tel:0800-345-600", &extracted_number);
1574   EXPECT_EQ("0800-345-600", extracted_number);
1575   ExtractPossibleNumber("Tel:0800 FOR PIZZA", &extracted_number);
1576   EXPECT_EQ("0800 FOR PIZZA", extracted_number);
1577 
1578   // Should not remove plus sign.
1579   ExtractPossibleNumber("Tel:+800-345-600", &extracted_number);
1580   EXPECT_EQ("+800-345-600", extracted_number);
1581   // Should recognise wide digits as possible start values.
1582   ExtractPossibleNumber("\xEF\xBC\x90\xEF\xBC\x92\xEF\xBC\x93" /* "023" */,
1583                         &extracted_number);
1584   EXPECT_EQ("\xEF\xBC\x90\xEF\xBC\x92\xEF\xBC\x93" /* "023" */,
1585             extracted_number);
1586   // Dashes are not possible start values and should be removed.
1587   ExtractPossibleNumber("Num-\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93"
1588                         /* "Num-123" */, &extracted_number);
1589   EXPECT_EQ("\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93" /* "123" */,
1590             extracted_number);
1591   // If not possible number present, return empty string.
1592   ExtractPossibleNumber("Num-....", &extracted_number);
1593   EXPECT_EQ("", extracted_number);
1594   // Leading brackets are stripped - these are not used when parsing.
1595   ExtractPossibleNumber("(650) 253-0000", &extracted_number);
1596   EXPECT_EQ("650) 253-0000", extracted_number);
1597 
1598   // Trailing non-alpha-numeric characters should be removed.
1599   ExtractPossibleNumber("(650) 253-0000..- ..", &extracted_number);
1600   EXPECT_EQ("650) 253-0000", extracted_number);
1601   ExtractPossibleNumber("(650) 253-0000.", &extracted_number);
1602   EXPECT_EQ("650) 253-0000", extracted_number);
1603   // This case has a trailing RTL char.
1604   ExtractPossibleNumber("(650) 253-0000\xE2\x80\x8F"
1605                         /* "(650) 253-0000‏" */, &extracted_number);
1606   EXPECT_EQ("650) 253-0000", extracted_number);
1607 }
1608 
TEST_F(PhoneNumberUtilTest,IsNANPACountry)1609 TEST_F(PhoneNumberUtilTest, IsNANPACountry) {
1610   EXPECT_TRUE(phone_util_.IsNANPACountry(RegionCode::US()));
1611   EXPECT_TRUE(phone_util_.IsNANPACountry(RegionCode::BS()));
1612   EXPECT_FALSE(phone_util_.IsNANPACountry(RegionCode::DE()));
1613   EXPECT_FALSE(phone_util_.IsNANPACountry(RegionCode::GetUnknown()));
1614   EXPECT_FALSE(phone_util_.IsNANPACountry(RegionCode::UN001()));
1615 }
1616 
TEST_F(PhoneNumberUtilTest,IsValidNumber)1617 TEST_F(PhoneNumberUtilTest, IsValidNumber) {
1618   PhoneNumber us_number;
1619   us_number.set_country_code(1);
1620   us_number.set_national_number(uint64{6502530000});
1621   EXPECT_TRUE(phone_util_.IsValidNumber(us_number));
1622 
1623   PhoneNumber it_number;
1624   it_number.set_country_code(39);
1625   it_number.set_national_number(uint64{236618300});
1626   it_number.set_italian_leading_zero(true);
1627   EXPECT_TRUE(phone_util_.IsValidNumber(it_number));
1628 
1629   PhoneNumber gb_number;
1630   gb_number.set_country_code(44);
1631   gb_number.set_national_number(uint64{7912345678});
1632   EXPECT_TRUE(phone_util_.IsValidNumber(gb_number));
1633 
1634   PhoneNumber nz_number;
1635   nz_number.set_country_code(64);
1636   nz_number.set_national_number(uint64{21387835});
1637   EXPECT_TRUE(phone_util_.IsValidNumber(nz_number));
1638 
1639   PhoneNumber intl_toll_free_number;
1640   intl_toll_free_number.set_country_code(800);
1641   intl_toll_free_number.set_national_number(uint64{12345678});
1642   EXPECT_TRUE(phone_util_.IsValidNumber(intl_toll_free_number));
1643 
1644   PhoneNumber universal_premium_rate;
1645   universal_premium_rate.set_country_code(979);
1646   universal_premium_rate.set_national_number(uint64{123456789});
1647   EXPECT_TRUE(phone_util_.IsValidNumber(universal_premium_rate));
1648 }
1649 
TEST_F(PhoneNumberUtilTest,IsValidForRegion)1650 TEST_F(PhoneNumberUtilTest, IsValidForRegion) {
1651   // This number is valid for the Bahamas, but is not a valid US number.
1652   PhoneNumber bs_number;
1653   bs_number.set_country_code(1);
1654   bs_number.set_national_number(uint64{2423232345});
1655   EXPECT_TRUE(phone_util_.IsValidNumber(bs_number));
1656   EXPECT_TRUE(phone_util_.IsValidNumberForRegion(bs_number, RegionCode::BS()));
1657   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(bs_number, RegionCode::US()));
1658   bs_number.set_national_number(uint64{2421232345});
1659   // This number is no longer valid.
1660   EXPECT_FALSE(phone_util_.IsValidNumber(bs_number));
1661 
1662   // La Mayotte and Réunion use 'leadingDigits' to differentiate them.
1663   PhoneNumber re_number;
1664   re_number.set_country_code(262);
1665   re_number.set_national_number(uint64{262123456});
1666   EXPECT_TRUE(phone_util_.IsValidNumber(re_number));
1667   EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE()));
1668   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT()));
1669   // Now change the number to be a number for La Mayotte.
1670   re_number.set_national_number(uint64{269601234});
1671   EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT()));
1672   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE()));
1673   // This number is no longer valid.
1674   re_number.set_national_number(uint64{269123456});
1675   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT()));
1676   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE()));
1677   EXPECT_FALSE(phone_util_.IsValidNumber(re_number));
1678   // However, it should be recognised as from La Mayotte.
1679   string region_code;
1680   phone_util_.GetRegionCodeForNumber(re_number, &region_code);
1681   EXPECT_EQ(RegionCode::YT(), region_code);
1682   // This number is valid in both places.
1683   re_number.set_national_number(uint64{800123456});
1684   EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT()));
1685   EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE()));
1686 
1687   PhoneNumber intl_toll_free_number;
1688   intl_toll_free_number.set_country_code(800);
1689   intl_toll_free_number.set_national_number(uint64{12345678});
1690   EXPECT_TRUE(phone_util_.IsValidNumberForRegion(intl_toll_free_number,
1691                                                  RegionCode::UN001()));
1692   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(intl_toll_free_number,
1693                                                   RegionCode::US()));
1694   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(intl_toll_free_number,
1695                                                   RegionCode::ZZ()));
1696 
1697   PhoneNumber invalid_number;
1698   // Invalid country calling codes.
1699   invalid_number.set_country_code(3923);
1700   invalid_number.set_national_number(uint64{2366});
1701   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(invalid_number,
1702                                                   RegionCode::ZZ()));
1703   invalid_number.set_country_code(3923);
1704   invalid_number.set_national_number(uint64{2366});
1705   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(invalid_number,
1706                                                   RegionCode::UN001()));
1707   invalid_number.set_country_code(0);
1708   invalid_number.set_national_number(uint64{2366});
1709   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(invalid_number,
1710                                                   RegionCode::UN001()));
1711   invalid_number.set_country_code(0);
1712   EXPECT_FALSE(phone_util_.IsValidNumberForRegion(invalid_number,
1713                                                   RegionCode::ZZ()));
1714 }
1715 
TEST_F(PhoneNumberUtilTest,IsNotValidNumber)1716 TEST_F(PhoneNumberUtilTest, IsNotValidNumber) {
1717   PhoneNumber us_number;
1718   us_number.set_country_code(1);
1719   us_number.set_national_number(uint64{2530000});
1720   EXPECT_FALSE(phone_util_.IsValidNumber(us_number));
1721 
1722   PhoneNumber it_number;
1723   it_number.set_country_code(39);
1724   it_number.set_national_number(uint64{23661830000});
1725   it_number.set_italian_leading_zero(true);
1726   EXPECT_FALSE(phone_util_.IsValidNumber(it_number));
1727 
1728   PhoneNumber gb_number;
1729   gb_number.set_country_code(44);
1730   gb_number.set_national_number(uint64{791234567});
1731   EXPECT_FALSE(phone_util_.IsValidNumber(gb_number));
1732 
1733   PhoneNumber de_number;
1734   de_number.set_country_code(49);
1735   de_number.set_national_number(uint64{1234});
1736   EXPECT_FALSE(phone_util_.IsValidNumber(de_number));
1737 
1738   PhoneNumber nz_number;
1739   nz_number.set_country_code(64);
1740   nz_number.set_national_number(uint64{3316005});
1741   EXPECT_FALSE(phone_util_.IsValidNumber(nz_number));
1742 
1743   PhoneNumber invalid_number;
1744   // Invalid country calling codes.
1745   invalid_number.set_country_code(3923);
1746   invalid_number.set_national_number(uint64{2366});
1747   EXPECT_FALSE(phone_util_.IsValidNumber(invalid_number));
1748   invalid_number.set_country_code(0);
1749   EXPECT_FALSE(phone_util_.IsValidNumber(invalid_number));
1750 
1751   PhoneNumber intl_toll_free_number_too_long;
1752   intl_toll_free_number_too_long.set_country_code(800);
1753   intl_toll_free_number_too_long.set_national_number(uint64{123456789});
1754   EXPECT_FALSE(phone_util_.IsValidNumber(intl_toll_free_number_too_long));
1755 }
1756 
TEST_F(PhoneNumberUtilTest,GetRegionCodeForCountryCode)1757 TEST_F(PhoneNumberUtilTest, GetRegionCodeForCountryCode) {
1758   string region_code;
1759   phone_util_.GetRegionCodeForCountryCode(1, &region_code);
1760   EXPECT_EQ(RegionCode::US(), region_code);
1761   phone_util_.GetRegionCodeForCountryCode(44, &region_code);
1762   EXPECT_EQ(RegionCode::GB(), region_code);
1763   phone_util_.GetRegionCodeForCountryCode(49, &region_code);
1764   EXPECT_EQ(RegionCode::DE(), region_code);
1765   phone_util_.GetRegionCodeForCountryCode(800, &region_code);
1766   EXPECT_EQ(RegionCode::UN001(), region_code);
1767   phone_util_.GetRegionCodeForCountryCode(979, &region_code);
1768   EXPECT_EQ(RegionCode::UN001(), region_code);
1769 }
1770 
TEST_F(PhoneNumberUtilTest,GetRegionCodeForNumber)1771 TEST_F(PhoneNumberUtilTest, GetRegionCodeForNumber) {
1772   string region_code;
1773   PhoneNumber bs_number;
1774   bs_number.set_country_code(1);
1775   bs_number.set_national_number(uint64{2423232345});
1776   phone_util_.GetRegionCodeForNumber(bs_number, &region_code);
1777   EXPECT_EQ(RegionCode::BS(), region_code);
1778 
1779   PhoneNumber us_number;
1780   us_number.set_country_code(1);
1781   us_number.set_national_number(uint64{4241231234});
1782   phone_util_.GetRegionCodeForNumber(us_number, &region_code);
1783   EXPECT_EQ(RegionCode::US(), region_code);
1784 
1785   PhoneNumber gb_mobile;
1786   gb_mobile.set_country_code(44);
1787   gb_mobile.set_national_number(uint64{7912345678});
1788   phone_util_.GetRegionCodeForNumber(gb_mobile, &region_code);
1789   EXPECT_EQ(RegionCode::GB(), region_code);
1790 
1791   PhoneNumber intl_toll_free_number;
1792   intl_toll_free_number.set_country_code(800);
1793   intl_toll_free_number.set_national_number(uint64{12345678});
1794   phone_util_.GetRegionCodeForNumber(intl_toll_free_number, &region_code);
1795   EXPECT_EQ(RegionCode::UN001(), region_code);
1796 
1797   PhoneNumber universal_premium_rate;
1798   universal_premium_rate.set_country_code(979);
1799   universal_premium_rate.set_national_number(uint64{123456789});
1800   phone_util_.GetRegionCodeForNumber(universal_premium_rate, &region_code);
1801   EXPECT_EQ(RegionCode::UN001(), region_code);
1802 }
1803 
TEST_F(PhoneNumberUtilTest,IsPossibleNumber)1804 TEST_F(PhoneNumberUtilTest, IsPossibleNumber) {
1805   PhoneNumber number;
1806   number.set_country_code(1);
1807   number.set_national_number(uint64{6502530000});
1808   EXPECT_TRUE(phone_util_.IsPossibleNumber(number));
1809 
1810   number.set_country_code(1);
1811   number.set_national_number(uint64{2530000});
1812   EXPECT_TRUE(phone_util_.IsPossibleNumber(number));
1813 
1814   number.set_country_code(44);
1815   number.set_national_number(uint64{2070313000});
1816   EXPECT_TRUE(phone_util_.IsPossibleNumber(number));
1817 
1818   number.set_country_code(800);
1819   number.set_national_number(uint64{12345678});
1820   EXPECT_TRUE(phone_util_.IsPossibleNumber(number));
1821 
1822   EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 253 0000",
1823                                                     RegionCode::US()));
1824   EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 GOO OGLE",
1825                                                     RegionCode::US()));
1826   EXPECT_TRUE(phone_util_.IsPossibleNumberForString("(650) 253-0000",
1827                                                     RegionCode::US()));
1828   EXPECT_TRUE(
1829       phone_util_.IsPossibleNumberForString("253-0000", RegionCode::US()));
1830   EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 253 0000",
1831                                                     RegionCode::GB()));
1832   EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+44 20 7031 3000",
1833                                                     RegionCode::GB()));
1834   EXPECT_TRUE(phone_util_.IsPossibleNumberForString("(020) 7031 300",
1835                                                     RegionCode::GB()));
1836   EXPECT_TRUE(
1837       phone_util_.IsPossibleNumberForString("7031 3000", RegionCode::GB()));
1838   EXPECT_TRUE(
1839       phone_util_.IsPossibleNumberForString("3331 6005", RegionCode::NZ()));
1840   EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+800 1234 5678",
1841                                                     RegionCode::UN001()));
1842 }
1843 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForType_DifferentTypeLengths)1844 TEST_F(PhoneNumberUtilTest, IsPossibleNumberForType_DifferentTypeLengths) {
1845   // We use Argentinian numbers since they have different possible lengths for
1846   // different types.
1847   PhoneNumber number;
1848   number.set_country_code(54);
1849   number.set_national_number(uint64{12345});
1850   // Too short for any Argentinian number, including fixed-line.
1851   EXPECT_FALSE(
1852       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1853   EXPECT_FALSE(
1854       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
1855 
1856   // 6-digit numbers are okay for fixed-line.
1857   number.set_national_number(uint64{123456});
1858   EXPECT_TRUE(
1859       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
1860   EXPECT_TRUE(
1861       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1862   // But too short for mobile.
1863   EXPECT_FALSE(
1864       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
1865   // And too short for toll-free.
1866   EXPECT_FALSE(
1867       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::TOLL_FREE));
1868 
1869   // The same applies to 9-digit numbers.
1870   number.set_national_number(uint64{123456789});
1871   EXPECT_TRUE(
1872       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
1873   EXPECT_TRUE(
1874       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1875   EXPECT_FALSE(
1876       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
1877   EXPECT_FALSE(
1878       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::TOLL_FREE));
1879 
1880   // 10-digit numbers are universally possible.
1881   number.set_national_number(uint64{1234567890});
1882   EXPECT_TRUE(
1883       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
1884   EXPECT_TRUE(
1885       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1886   EXPECT_TRUE(
1887       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
1888   EXPECT_TRUE(
1889       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::TOLL_FREE));
1890 
1891   // 11-digit numbers are only possible for mobile numbers. Note we don't
1892   // require the leading 9, which all mobile numbers start with, and would be
1893   // required for a valid mobile number.
1894   number.set_national_number(uint64{12345678901});
1895   EXPECT_TRUE(
1896       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
1897   EXPECT_FALSE(
1898       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1899   EXPECT_TRUE(
1900       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
1901   EXPECT_FALSE(
1902       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::TOLL_FREE));
1903 }
1904 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForType_LocalOnly)1905 TEST_F(PhoneNumberUtilTest, IsPossibleNumberForType_LocalOnly) {
1906   PhoneNumber number;
1907   // Here we test a number length which matches a local-only length.
1908   number.set_country_code(49);
1909   number.set_national_number(uint64{12});
1910   EXPECT_TRUE(
1911       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
1912   EXPECT_TRUE(
1913       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1914   // Mobile numbers must be 10 or 11 digits, and there are no local-only
1915   // lengths.
1916   EXPECT_FALSE(
1917       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
1918 }
1919 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForType_DataMissingForSizeReasons)1920 TEST_F(PhoneNumberUtilTest, IsPossibleNumberForType_DataMissingForSizeReasons) {
1921   PhoneNumber number;
1922   // Here we test something where the possible lengths match the possible
1923   // lengths of the country as a whole, and hence aren't present in the binary
1924   // for size reasons - this should still work.
1925   // Local-only number.
1926   number.set_country_code(55);
1927   number.set_national_number(uint64{12345678});
1928   EXPECT_TRUE(
1929       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
1930   EXPECT_TRUE(
1931       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1932   number.set_national_number(uint64{1234567890});
1933   EXPECT_TRUE(
1934       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
1935   EXPECT_TRUE(
1936       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1937 }
1938 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForType_NumberTypeNotSupportedForRegion)1939 TEST_F(PhoneNumberUtilTest,
1940        IsPossibleNumberForType_NumberTypeNotSupportedForRegion) {
1941   PhoneNumber number;
1942   // There are *no* mobile numbers for this region at all, so we return false.
1943   number.set_country_code(55);
1944   number.set_national_number(12345678L);
1945   EXPECT_FALSE(
1946       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
1947   // This matches a fixed-line length though.
1948   EXPECT_TRUE(
1949       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1950   EXPECT_TRUE(phone_util_.IsPossibleNumberForType(
1951       number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
1952 
1953   // There are *no* fixed-line OR mobile numbers for this country calling code
1954   // at all, so we return false for these.
1955   number.set_country_code(979);
1956   number.set_national_number(123456789L);
1957   EXPECT_FALSE(
1958       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
1959   EXPECT_FALSE(
1960       phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
1961   EXPECT_FALSE(phone_util_.IsPossibleNumberForType(
1962       number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
1963   EXPECT_TRUE(phone_util_.IsPossibleNumberForType(
1964       number, PhoneNumberUtil::PREMIUM_RATE));
1965 }
1966 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberWithReason)1967 TEST_F(PhoneNumberUtilTest, IsPossibleNumberWithReason) {
1968   // FYI, national numbers for country code +1 that are within 7 to 10 digits
1969   // are possible.
1970   PhoneNumber number;
1971   number.set_country_code(1);
1972   number.set_national_number(uint64{6502530000});
1973   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
1974             phone_util_.IsPossibleNumberWithReason(number));
1975 
1976   number.set_country_code(1);
1977   number.set_national_number(uint64{2530000});
1978   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
1979             phone_util_.IsPossibleNumberWithReason(number));
1980 
1981   number.set_country_code(0);
1982   number.set_national_number(uint64{2530000});
1983   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE,
1984             phone_util_.IsPossibleNumberWithReason(number));
1985 
1986   number.set_country_code(1);
1987   number.set_national_number(uint64{253000});
1988   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
1989             phone_util_.IsPossibleNumberWithReason(number));
1990 
1991   number.set_country_code(1);
1992   number.set_national_number(uint64{65025300000});
1993   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
1994             phone_util_.IsPossibleNumberWithReason(number));
1995 
1996   number.set_country_code(44);
1997   number.set_national_number(uint64{2070310000});
1998   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
1999             phone_util_.IsPossibleNumberWithReason(number));
2000 
2001   number.set_country_code(49);
2002   number.set_national_number(uint64{30123456});
2003   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2004             phone_util_.IsPossibleNumberWithReason(number));
2005 
2006   number.set_country_code(65);
2007   number.set_national_number(uint64{1234567890});
2008   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2009             phone_util_.IsPossibleNumberWithReason(number));
2010 
2011   number.set_country_code(800);
2012   number.set_national_number(uint64{123456789});
2013   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2014             phone_util_.IsPossibleNumberWithReason(number));
2015 }
2016 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForTypeWithReason_DifferentTypeLengths)2017 TEST_F(PhoneNumberUtilTest,
2018        IsPossibleNumberForTypeWithReason_DifferentTypeLengths) {
2019   // We use Argentinian numbers since they have different possible lengths for
2020   // different types.
2021   PhoneNumber number;
2022   number.set_country_code(54);
2023   number.set_national_number(uint64{12345});
2024   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2025             phone_util_.IsPossibleNumberForTypeWithReason(
2026                 number, PhoneNumberUtil::UNKNOWN));
2027   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2028             phone_util_.IsPossibleNumberForTypeWithReason(
2029                 number, PhoneNumberUtil::FIXED_LINE));
2030 
2031   // 6-digit numbers are okay for fixed-line.
2032   number.set_national_number(uint64{123456});
2033   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2034             phone_util_.IsPossibleNumberForTypeWithReason(
2035                 number, PhoneNumberUtil::UNKNOWN));
2036   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2037             phone_util_.IsPossibleNumberForTypeWithReason(
2038                 number, PhoneNumberUtil::FIXED_LINE));
2039   // But too short for mobile.
2040   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2041             phone_util_.IsPossibleNumberForTypeWithReason(
2042                 number, PhoneNumberUtil::MOBILE));
2043   // And too short for toll-free.
2044   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2045             phone_util_.IsPossibleNumberForTypeWithReason(
2046                 number, PhoneNumberUtil::TOLL_FREE));
2047   // The same applies to 9-digit numbers.
2048   number.set_national_number(uint64{123456789});
2049   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2050             phone_util_.IsPossibleNumberForTypeWithReason(
2051                 number, PhoneNumberUtil::UNKNOWN));
2052   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2053             phone_util_.IsPossibleNumberForTypeWithReason(
2054                 number, PhoneNumberUtil::FIXED_LINE));
2055   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2056             phone_util_.IsPossibleNumberForTypeWithReason(
2057                 number, PhoneNumberUtil::MOBILE));
2058   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2059             phone_util_.IsPossibleNumberForTypeWithReason(
2060                 number, PhoneNumberUtil::TOLL_FREE));
2061   // 10-digit numbers are universally possible.
2062   number.set_national_number(uint64{1234567890});
2063   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2064             phone_util_.IsPossibleNumberForTypeWithReason(
2065                 number, PhoneNumberUtil::UNKNOWN));
2066   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2067             phone_util_.IsPossibleNumberForTypeWithReason(
2068                 number, PhoneNumberUtil::FIXED_LINE));
2069   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2070             phone_util_.IsPossibleNumberForTypeWithReason(
2071                 number, PhoneNumberUtil::MOBILE));
2072   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2073             phone_util_.IsPossibleNumberForTypeWithReason(
2074                 number, PhoneNumberUtil::TOLL_FREE));
2075   // 11-digit numbers are possible for mobile numbers. Note we don't require the
2076   // leading 9, which all mobile numbers start with, and would be required for a
2077   // valid mobile number.
2078   number.set_national_number(uint64{12345678901});
2079   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2080             phone_util_.IsPossibleNumberForTypeWithReason(
2081                 number, PhoneNumberUtil::UNKNOWN));
2082   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2083             phone_util_.IsPossibleNumberForTypeWithReason(
2084                 number, PhoneNumberUtil::FIXED_LINE));
2085   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2086             phone_util_.IsPossibleNumberForTypeWithReason(
2087                 number, PhoneNumberUtil::MOBILE));
2088   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2089             phone_util_.IsPossibleNumberForTypeWithReason(
2090                 number, PhoneNumberUtil::TOLL_FREE));
2091 }
2092 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForTypeWithReason_LocalOnly)2093 TEST_F(PhoneNumberUtilTest, IsPossibleNumberForTypeWithReason_LocalOnly) {
2094   PhoneNumber number;
2095   // Here we test a number length which matches a local-only length.
2096   number.set_country_code(49);
2097   number.set_national_number(uint64{12});
2098   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
2099             phone_util_.IsPossibleNumberForTypeWithReason(
2100                 number, PhoneNumberUtil::UNKNOWN));
2101   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
2102             phone_util_.IsPossibleNumberForTypeWithReason(
2103                 number, PhoneNumberUtil::FIXED_LINE));
2104   // Mobile numbers must be 10 or 11 digits, and there are no local-only
2105   // lengths.
2106   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2107             phone_util_.IsPossibleNumberForTypeWithReason(
2108                 number, PhoneNumberUtil::MOBILE));
2109 }
2110 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForTypeWithReason_DataMissingForSizeReasons)2111 TEST_F(PhoneNumberUtilTest,
2112        IsPossibleNumberForTypeWithReason_DataMissingForSizeReasons) {
2113   PhoneNumber number;
2114   // Here we test something where the possible lengths match the possible
2115   // lengths of the country as a whole, and hence aren't present in the binary
2116   // for size reasons - this should still work.
2117   // Local-only number.
2118   number.set_country_code(55);
2119   number.set_national_number(uint64{12345678});
2120   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
2121             phone_util_.IsPossibleNumberForTypeWithReason(
2122                 number, PhoneNumberUtil::UNKNOWN));
2123   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
2124             phone_util_.IsPossibleNumberForTypeWithReason(
2125                 number, PhoneNumberUtil::FIXED_LINE));
2126   // Normal-length number.
2127   number.set_national_number(uint64{1234567890});
2128   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2129             phone_util_.IsPossibleNumberForTypeWithReason(
2130                 number, PhoneNumberUtil::UNKNOWN));
2131   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2132             phone_util_.IsPossibleNumberForTypeWithReason(
2133                 number, PhoneNumberUtil::FIXED_LINE));
2134 }
2135 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForTypeWithReason_NumberTypeNotSupportedForRegion)2136 TEST_F(PhoneNumberUtilTest,
2137        IsPossibleNumberForTypeWithReason_NumberTypeNotSupportedForRegion) {
2138   PhoneNumber number;
2139   // There are *no* mobile numbers for this region at all, so we return
2140   // INVALID_LENGTH.
2141   number.set_country_code(55);
2142   number.set_national_number(uint64{12345678});
2143   EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
2144             phone_util_.IsPossibleNumberForTypeWithReason(
2145                 number, PhoneNumberUtil::MOBILE));
2146   // This matches a fixed-line length though.
2147   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
2148             phone_util_.IsPossibleNumberForTypeWithReason(
2149                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2150   // This is too short for fixed-line, and no mobile numbers exist.
2151   number.set_national_number(uint64{1234567});
2152   EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
2153             phone_util_.IsPossibleNumberForTypeWithReason(
2154                 number, PhoneNumberUtil::MOBILE));
2155   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2156             phone_util_.IsPossibleNumberForTypeWithReason(
2157                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2158   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2159             phone_util_.IsPossibleNumberForTypeWithReason(
2160                 number, PhoneNumberUtil::FIXED_LINE));
2161   // This is too short for mobile, and no fixed-line number exist.
2162   number.set_country_code(882);
2163   number.set_national_number(uint64{1234567});
2164   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2165             phone_util_.IsPossibleNumberForTypeWithReason(
2166                 number, PhoneNumberUtil::MOBILE));
2167   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2168             phone_util_.IsPossibleNumberForTypeWithReason(
2169                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2170   EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
2171             phone_util_.IsPossibleNumberForTypeWithReason(
2172                 number, PhoneNumberUtil::FIXED_LINE));
2173 
2174   // There are *no* fixed-line OR mobile numbers for this country calling code
2175   // at all, so we return INVALID_LENGTH.
2176   number.set_country_code(979);
2177   number.set_national_number(uint64{123456789});
2178   EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
2179             phone_util_.IsPossibleNumberForTypeWithReason(
2180                 number, PhoneNumberUtil::MOBILE));
2181   EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
2182             phone_util_.IsPossibleNumberForTypeWithReason(
2183                 number, PhoneNumberUtil::FIXED_LINE));
2184   EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
2185             phone_util_.IsPossibleNumberForTypeWithReason(
2186                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2187   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2188             phone_util_.IsPossibleNumberForTypeWithReason(
2189                 number, PhoneNumberUtil::PREMIUM_RATE));
2190 }
2191 
TEST_F(PhoneNumberUtilTest,IsPossibleNumberForTypeWithReason_FixedLineOrMobile)2192 TEST_F(PhoneNumberUtilTest,
2193        IsPossibleNumberForTypeWithReason_FixedLineOrMobile) {
2194   PhoneNumber number;
2195   // For FIXED_LINE_OR_MOBILE, a number should be considered valid if it matches
2196   // the possible lengths for mobile *or* fixed-line numbers.
2197   number.set_country_code(290);
2198   number.set_national_number(uint64{1234});
2199   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2200             phone_util_.IsPossibleNumberForTypeWithReason(
2201                 number, PhoneNumberUtil::FIXED_LINE));
2202   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2203             phone_util_.IsPossibleNumberForTypeWithReason(
2204                 number, PhoneNumberUtil::MOBILE));
2205   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2206             phone_util_.IsPossibleNumberForTypeWithReason(
2207                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2208 
2209   number.set_national_number(uint64{12345});
2210   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
2211             phone_util_.IsPossibleNumberForTypeWithReason(
2212                 number, PhoneNumberUtil::FIXED_LINE));
2213   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2214             phone_util_.IsPossibleNumberForTypeWithReason(
2215                 number, PhoneNumberUtil::MOBILE));
2216   EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
2217             phone_util_.IsPossibleNumberForTypeWithReason(
2218                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2219 
2220   number.set_national_number(uint64{123456});
2221   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2222             phone_util_.IsPossibleNumberForTypeWithReason(
2223                 number, PhoneNumberUtil::FIXED_LINE));
2224   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2225             phone_util_.IsPossibleNumberForTypeWithReason(
2226                 number, PhoneNumberUtil::MOBILE));
2227   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2228             phone_util_.IsPossibleNumberForTypeWithReason(
2229                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2230 
2231   number.set_national_number(uint64{1234567});
2232   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2233             phone_util_.IsPossibleNumberForTypeWithReason(
2234                 number, PhoneNumberUtil::FIXED_LINE));
2235   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2236             phone_util_.IsPossibleNumberForTypeWithReason(
2237                 number, PhoneNumberUtil::MOBILE));
2238   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2239             phone_util_.IsPossibleNumberForTypeWithReason(
2240                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2241 
2242   number.set_national_number(uint64{12345678});
2243   EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
2244             phone_util_.IsPossibleNumberForTypeWithReason(
2245                 number, PhoneNumberUtil::TOLL_FREE));
2246   EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
2247             phone_util_.IsPossibleNumberForTypeWithReason(
2248                 number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
2249 }
2250 
TEST_F(PhoneNumberUtilTest,IsNotPossibleNumber)2251 TEST_F(PhoneNumberUtilTest, IsNotPossibleNumber) {
2252   PhoneNumber number;
2253   number.set_country_code(1);
2254   number.set_national_number(uint64{65025300000});
2255   EXPECT_FALSE(phone_util_.IsPossibleNumber(number));
2256 
2257   number.set_country_code(800);
2258   number.set_national_number(uint64{123456789});
2259   EXPECT_FALSE(phone_util_.IsPossibleNumber(number));
2260 
2261   number.set_country_code(1);
2262   number.set_national_number(uint64{253000});
2263   EXPECT_FALSE(phone_util_.IsPossibleNumber(number));
2264 
2265   number.set_country_code(44);
2266   number.set_national_number(uint64{300});
2267   EXPECT_FALSE(phone_util_.IsPossibleNumber(number));
2268 
2269   EXPECT_FALSE(phone_util_.IsPossibleNumberForString("+1 650 253 00000",
2270                                                      RegionCode::US()));
2271   EXPECT_FALSE(phone_util_.IsPossibleNumberForString("(650) 253-00000",
2272                                                      RegionCode::US()));
2273   EXPECT_FALSE(phone_util_.IsPossibleNumberForString("I want a Pizza",
2274                                                      RegionCode::US()));
2275   EXPECT_FALSE(phone_util_.IsPossibleNumberForString("253-000",
2276                                                      RegionCode::US()));
2277   EXPECT_FALSE(phone_util_.IsPossibleNumberForString("1 3000",
2278                                                      RegionCode::GB()));
2279   EXPECT_FALSE(phone_util_.IsPossibleNumberForString("+44 300",
2280                                                      RegionCode::GB()));
2281   EXPECT_FALSE(phone_util_.IsPossibleNumberForString("+800 1234 5678 9",
2282                                                      RegionCode::UN001()));
2283 }
2284 
TEST_F(PhoneNumberUtilTest,TruncateTooLongNumber)2285 TEST_F(PhoneNumberUtilTest, TruncateTooLongNumber) {
2286   // US number 650-253-0000, but entered with one additional digit at the end.
2287   PhoneNumber too_long_number;
2288   too_long_number.set_country_code(1);
2289   too_long_number.set_national_number(uint64{65025300001});
2290   PhoneNumber valid_number;
2291   valid_number.set_country_code(1);
2292   valid_number.set_national_number(uint64{6502530000});
2293   EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number));
2294   EXPECT_EQ(valid_number, too_long_number);
2295 
2296   too_long_number.set_country_code(800);
2297   too_long_number.set_national_number(uint64{123456789});
2298   valid_number.set_country_code(800);
2299   valid_number.set_national_number(uint64{12345678});
2300   EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number));
2301   EXPECT_EQ(valid_number, too_long_number);
2302 
2303   // GB number 080 1234 5678, but entered with 4 extra digits at the end.
2304   too_long_number.set_country_code(44);
2305   too_long_number.set_national_number(uint64{80123456780123});
2306   valid_number.set_country_code(44);
2307   valid_number.set_national_number(uint64{8012345678});
2308   EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number));
2309   EXPECT_EQ(valid_number, too_long_number);
2310 
2311   // IT number 022 3456 7890, but entered with 3 extra digits at the end.
2312   too_long_number.set_country_code(39);
2313   too_long_number.set_national_number(uint64{2234567890123});
2314   too_long_number.set_italian_leading_zero(true);
2315   valid_number.set_country_code(39);
2316   valid_number.set_national_number(uint64{2234567890});
2317   valid_number.set_italian_leading_zero(true);
2318   EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number));
2319   EXPECT_EQ(valid_number, too_long_number);
2320 
2321   // Tests what happens when a valid number is passed in.
2322   PhoneNumber valid_number_copy(valid_number);
2323   EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&valid_number));
2324   // Tests the number is not modified.
2325   EXPECT_EQ(valid_number_copy, valid_number);
2326 
2327   // Tests what happens when a number with invalid prefix is passed in.
2328   PhoneNumber number_with_invalid_prefix;
2329   number_with_invalid_prefix.set_country_code(1);
2330   // The test metadata says US numbers cannot have prefix 240.
2331   number_with_invalid_prefix.set_national_number(uint64{2401234567});
2332   PhoneNumber invalid_number_copy(number_with_invalid_prefix);
2333   EXPECT_FALSE(phone_util_.TruncateTooLongNumber(&number_with_invalid_prefix));
2334   // Tests the number is not modified.
2335   EXPECT_EQ(invalid_number_copy, number_with_invalid_prefix);
2336 
2337   // Tests what happens when a too short number is passed in.
2338   PhoneNumber too_short_number;
2339   too_short_number.set_country_code(1);
2340   too_short_number.set_national_number(uint64{1234});
2341   PhoneNumber too_short_number_copy(too_short_number);
2342   EXPECT_FALSE(phone_util_.TruncateTooLongNumber(&too_short_number));
2343   // Tests the number is not modified.
2344   EXPECT_EQ(too_short_number_copy, too_short_number);
2345 }
2346 
TEST_F(PhoneNumberUtilTest,IsNumberGeographical)2347 TEST_F(PhoneNumberUtilTest, IsNumberGeographical) {
2348   PhoneNumber number;
2349 
2350   // Bahamas, mobile phone number.
2351   number.set_country_code(1);
2352   number.set_national_number(uint64{2423570000});
2353   EXPECT_FALSE(phone_util_.IsNumberGeographical(number));
2354 
2355   // Australian fixed line number.
2356   number.set_country_code(61);
2357   number.set_national_number(uint64{236618300});
2358   EXPECT_TRUE(phone_util_.IsNumberGeographical(number));
2359 
2360   // International toll free number.
2361   number.set_country_code(800);
2362   number.set_national_number(uint64{12345678});
2363   EXPECT_FALSE(phone_util_.IsNumberGeographical(number));
2364 
2365   // We test that mobile phone numbers in relevant regions are indeed considered
2366   // geographical.
2367 
2368   // Argentina, mobile phone number.
2369   number.set_country_code(54);
2370   number.set_national_number(uint64{91187654321});
2371   EXPECT_TRUE(phone_util_.IsNumberGeographical(number));
2372 
2373   // Mexico, mobile phone number.
2374   number.set_country_code(52);
2375   number.set_national_number(uint64{12345678900});
2376   EXPECT_TRUE(phone_util_.IsNumberGeographical(number));
2377 
2378   // Mexico, another mobile phone number.
2379   number.set_country_code(52);
2380   number.set_national_number(uint64{15512345678});
2381   EXPECT_TRUE(phone_util_.IsNumberGeographical(number));
2382 }
2383 
TEST_F(PhoneNumberUtilTest,FormatInOriginalFormat)2384 TEST_F(PhoneNumberUtilTest, FormatInOriginalFormat) {
2385   PhoneNumber phone_number;
2386   string formatted_number;
2387 
2388   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2389             phone_util_.ParseAndKeepRawInput("+442087654321", RegionCode::GB(),
2390                                              &phone_number));
2391   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
2392                                      &formatted_number);
2393   EXPECT_EQ("+44 20 8765 4321", formatted_number);
2394 
2395   phone_number.Clear();
2396   formatted_number.clear();
2397   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2398             phone_util_.ParseAndKeepRawInput("02087654321", RegionCode::GB(),
2399                                              &phone_number));
2400   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
2401                                      &formatted_number);
2402   EXPECT_EQ("(020) 8765 4321", formatted_number);
2403 
2404   phone_number.Clear();
2405   formatted_number.clear();
2406   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2407             phone_util_.ParseAndKeepRawInput("011442087654321",
2408                                              RegionCode::US(), &phone_number));
2409   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
2410                                      &formatted_number);
2411   EXPECT_EQ("011 44 20 8765 4321", formatted_number);
2412 
2413   phone_number.Clear();
2414   formatted_number.clear();
2415   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2416             phone_util_.ParseAndKeepRawInput("442087654321", RegionCode::GB(),
2417                                              &phone_number));
2418   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
2419                                      &formatted_number);
2420   EXPECT_EQ("44 20 8765 4321", formatted_number);
2421 
2422   phone_number.Clear();
2423   formatted_number.clear();
2424   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2425             phone_util_.Parse("+442087654321", RegionCode::GB(),
2426                               &phone_number));
2427   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
2428                                      &formatted_number);
2429   EXPECT_EQ("(020) 8765 4321", formatted_number);
2430 
2431   // Invalid numbers that we have a formatting pattern for should be formatted
2432   // properly.  Note area codes starting with 7 are intentionally excluded in
2433   // the test metadata for testing purposes.
2434   phone_number.Clear();
2435   formatted_number.clear();
2436   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2437             phone_util_.ParseAndKeepRawInput("7345678901", RegionCode::US(),
2438                                              &phone_number));
2439   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
2440                                      &formatted_number);
2441   EXPECT_EQ("734 567 8901", formatted_number);
2442 
2443   // US is not a leading zero country, and the presence of the leading zero
2444   // leads us to format the number using raw_input.
2445   phone_number.Clear();
2446   formatted_number.clear();
2447   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2448             phone_util_.ParseAndKeepRawInput("0734567 8901", RegionCode::US(),
2449                                              &phone_number));
2450   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
2451                                      &formatted_number);
2452   EXPECT_EQ("0734567 8901", formatted_number);
2453 
2454   // This number is valid, but we don't have a formatting pattern for it. Fall
2455   // back to the raw input.
2456   phone_number.Clear();
2457   formatted_number.clear();
2458   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2459             phone_util_.ParseAndKeepRawInput("02-4567-8900", RegionCode::KR(),
2460                                              &phone_number));
2461   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::KR(),
2462                                      &formatted_number);
2463   EXPECT_EQ("02-4567-8900", formatted_number);
2464 
2465   phone_number.Clear();
2466   formatted_number.clear();
2467   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2468             phone_util_.ParseAndKeepRawInput("01180012345678",
2469                                              RegionCode::US(), &phone_number));
2470   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
2471                                      &formatted_number);
2472   EXPECT_EQ("011 800 1234 5678", formatted_number);
2473 
2474   phone_number.Clear();
2475   formatted_number.clear();
2476   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2477             phone_util_.ParseAndKeepRawInput("+80012345678", RegionCode::KR(),
2478                                              &phone_number));
2479   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::KR(),
2480                                      &formatted_number);
2481   EXPECT_EQ("+800 1234 5678", formatted_number);
2482 
2483   // US local numbers are formatted correctly, as we have formatting patterns
2484   // for them.
2485   phone_number.Clear();
2486   formatted_number.clear();
2487   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2488             phone_util_.ParseAndKeepRawInput("2530000", RegionCode::US(),
2489                                              &phone_number));
2490   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
2491                                      &formatted_number);
2492   EXPECT_EQ("253 0000", formatted_number);
2493 
2494   phone_number.Clear();
2495   formatted_number.clear();
2496   // Number with national prefix in the US.
2497   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2498             phone_util_.ParseAndKeepRawInput("18003456789", RegionCode::US(),
2499                                              &phone_number));
2500   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
2501                                      &formatted_number);
2502   EXPECT_EQ("1 800 345 6789", formatted_number);
2503 
2504   phone_number.Clear();
2505   formatted_number.clear();
2506   // Number without national prefix in the UK.
2507   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2508             phone_util_.ParseAndKeepRawInput("2087654321", RegionCode::GB(),
2509                                              &phone_number));
2510   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
2511                                      &formatted_number);
2512   EXPECT_EQ("20 8765 4321", formatted_number);
2513   // Make sure no metadata is modified as a result of the previous function
2514   // call.
2515   phone_number.Clear();
2516   formatted_number.clear();
2517   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2518             phone_util_.Parse("+442087654321", RegionCode::GB(),
2519                               &phone_number));
2520   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
2521                                      &formatted_number);
2522   EXPECT_EQ("(020) 8765 4321", formatted_number);
2523 
2524   phone_number.Clear();
2525   formatted_number.clear();
2526   // Number with national prefix in Mexico.
2527   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2528             phone_util_.ParseAndKeepRawInput("013312345678", RegionCode::MX(),
2529                                              &phone_number));
2530   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::MX(),
2531                                      &formatted_number);
2532   EXPECT_EQ("01 33 1234 5678", formatted_number);
2533 
2534   phone_number.Clear();
2535   formatted_number.clear();
2536   // Number without national prefix in Mexico.
2537   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2538             phone_util_.ParseAndKeepRawInput("3312345678", RegionCode::MX(),
2539                                              &phone_number));
2540   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::MX(),
2541                                      &formatted_number);
2542   EXPECT_EQ("33 1234 5678", formatted_number);
2543 
2544   phone_number.Clear();
2545   formatted_number.clear();
2546   // Italian fixed-line number.
2547   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2548             phone_util_.ParseAndKeepRawInput("0212345678", RegionCode::IT(),
2549                                              &phone_number));
2550   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::IT(),
2551                                      &formatted_number);
2552   EXPECT_EQ("02 1234 5678", formatted_number);
2553 
2554   phone_number.Clear();
2555   formatted_number.clear();
2556   // Number with national prefix in Japan.
2557   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2558             phone_util_.ParseAndKeepRawInput("00777012", RegionCode::JP(),
2559                                              &phone_number));
2560   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::JP(),
2561                                      &formatted_number);
2562   EXPECT_EQ("0077-7012", formatted_number);
2563 
2564   phone_number.Clear();
2565   formatted_number.clear();
2566   // Number without national prefix in Japan.
2567   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2568             phone_util_.ParseAndKeepRawInput("0777012", RegionCode::JP(),
2569                                              &phone_number));
2570   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::JP(),
2571                                      &formatted_number);
2572   EXPECT_EQ("0777012", formatted_number);
2573 
2574   phone_number.Clear();
2575   formatted_number.clear();
2576   // Number with carrier code in Brazil.
2577   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2578             phone_util_.ParseAndKeepRawInput("012 3121286979", RegionCode::BR(),
2579                                              &phone_number));
2580   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::BR(),
2581                                      &formatted_number);
2582   EXPECT_EQ("012 3121286979", formatted_number);
2583 
2584   phone_number.Clear();
2585   formatted_number.clear();
2586   // The default national prefix used in this case is 045. When a number with
2587   // national prefix 044 is entered, we return the raw input as we don't want to
2588   // change the number entered.
2589   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2590             phone_util_.ParseAndKeepRawInput("044(33)1234-5678",
2591                                              RegionCode::MX(),
2592                                              &phone_number));
2593   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::MX(),
2594                                      &formatted_number);
2595   EXPECT_EQ("044(33)1234-5678", formatted_number);
2596 
2597   phone_number.Clear();
2598   formatted_number.clear();
2599   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2600             phone_util_.ParseAndKeepRawInput("045(33)1234-5678",
2601                                              RegionCode::MX(),
2602                                              &phone_number));
2603   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::MX(),
2604                                      &formatted_number);
2605   EXPECT_EQ("045 33 1234 5678", formatted_number);
2606 
2607   // The default international prefix used in this case is 0011. When a number
2608   // with international prefix 0012 is entered, we return the raw input as we
2609   // don't want to change the number entered.
2610   phone_number.Clear();
2611   formatted_number.clear();
2612   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2613             phone_util_.ParseAndKeepRawInput("0012 16502530000",
2614                                              RegionCode::AU(),
2615                                              &phone_number));
2616   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::AU(),
2617                                      &formatted_number);
2618   EXPECT_EQ("0012 16502530000", formatted_number);
2619 
2620   phone_number.Clear();
2621   formatted_number.clear();
2622   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2623             phone_util_.ParseAndKeepRawInput("0011 16502530000",
2624                                              RegionCode::AU(),
2625                                              &phone_number));
2626   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::AU(),
2627                                      &formatted_number);
2628   EXPECT_EQ("0011 1 650 253 0000", formatted_number);
2629 
2630   // Test the star sign is not removed from or added to the original input by
2631   // this method.
2632   phone_number.Clear();
2633   formatted_number.clear();
2634   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2635             phone_util_.ParseAndKeepRawInput("*1234",
2636                                              RegionCode::JP(),
2637                                              &phone_number));
2638   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::JP(),
2639                                      &formatted_number);
2640   EXPECT_EQ("*1234", formatted_number);
2641   phone_number.Clear();
2642   formatted_number.clear();
2643   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
2644             phone_util_.ParseAndKeepRawInput("1234",
2645                                              RegionCode::JP(),
2646                                              &phone_number));
2647   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::JP(),
2648                                      &formatted_number);
2649   EXPECT_EQ("1234", formatted_number);
2650 
2651   // Test that an invalid national number without raw input is just formatted
2652   // as the national number.
2653   phone_number.Clear();
2654   formatted_number.clear();
2655   phone_number.set_country_code_source(PhoneNumber::FROM_DEFAULT_COUNTRY);
2656   phone_number.set_country_code(1);
2657   phone_number.set_national_number(uint64{650253000});
2658   phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
2659                                      &formatted_number);
2660   EXPECT_EQ("650253000", formatted_number);
2661 }
2662 
TEST_F(PhoneNumberUtilTest,IsPremiumRate)2663 TEST_F(PhoneNumberUtilTest, IsPremiumRate) {
2664   PhoneNumber number;
2665   number.set_country_code(1);
2666   number.set_national_number(uint64{9004433030});
2667   EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
2668 
2669   number.set_country_code(39);
2670   number.set_national_number(uint64{892123});
2671   EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
2672 
2673   number.set_country_code(44);
2674   number.set_national_number(uint64{9187654321});
2675   EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
2676 
2677   number.set_country_code(49);
2678   number.set_national_number(uint64{9001654321});
2679   EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
2680 
2681   number.set_country_code(49);
2682   number.set_national_number(uint64{90091234567});
2683   EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
2684 
2685   number.set_country_code(979);
2686   number.set_national_number(uint64{123456789});
2687   EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
2688 }
2689 
TEST_F(PhoneNumberUtilTest,IsTollFree)2690 TEST_F(PhoneNumberUtilTest, IsTollFree) {
2691   PhoneNumber number;
2692   number.set_country_code(1);
2693   number.set_national_number(uint64{8881234567});
2694   EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
2695 
2696   number.set_country_code(39);
2697   number.set_national_number(uint64{803123});
2698   EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
2699 
2700   number.set_country_code(44);
2701   number.set_national_number(uint64{8012345678});
2702   EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
2703 
2704   number.set_country_code(49);
2705   number.set_national_number(uint64{8001234567});
2706   EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
2707 
2708   number.set_country_code(800);
2709   number.set_national_number(uint64{12345678});
2710   EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
2711 }
2712 
TEST_F(PhoneNumberUtilTest,IsMobile)2713 TEST_F(PhoneNumberUtilTest, IsMobile) {
2714   PhoneNumber number;
2715   // A Bahama mobile number
2716   number.set_country_code(1);
2717   number.set_national_number(uint64{2423570000});
2718   EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
2719 
2720   number.set_country_code(39);
2721   number.set_national_number(uint64{312345678});
2722   EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
2723 
2724   number.set_country_code(44);
2725   number.set_national_number(uint64{7912345678});
2726   EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
2727 
2728   number.set_country_code(49);
2729   number.set_national_number(uint64{15123456789});
2730   EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
2731 
2732   number.set_country_code(54);
2733   number.set_national_number(uint64{91187654321});
2734   EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
2735 }
2736 
TEST_F(PhoneNumberUtilTest,IsFixedLine)2737 TEST_F(PhoneNumberUtilTest, IsFixedLine) {
2738   PhoneNumber number;
2739   // A Bahama fixed-line number
2740   number.set_country_code(1);
2741   number.set_national_number(uint64{2423651234});
2742   EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number));
2743 
2744   // An Italian fixed-line number
2745   number.Clear();
2746   number.set_country_code(39);
2747   number.set_national_number(uint64{236618300});
2748   number.set_italian_leading_zero(true);
2749   EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number));
2750 
2751   number.Clear();
2752   number.set_country_code(44);
2753   number.set_national_number(uint64{2012345678});
2754   EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number));
2755 
2756   number.set_country_code(49);
2757   number.set_national_number(uint64{301234});
2758   EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number));
2759 }
2760 
TEST_F(PhoneNumberUtilTest,IsFixedLineAndMobile)2761 TEST_F(PhoneNumberUtilTest, IsFixedLineAndMobile) {
2762   PhoneNumber number;
2763   number.set_country_code(1);
2764   number.set_national_number(uint64{6502531111});
2765   EXPECT_EQ(PhoneNumberUtil::FIXED_LINE_OR_MOBILE,
2766             phone_util_.GetNumberType(number));
2767 
2768   number.set_country_code(54);
2769   number.set_national_number(uint64{1987654321});
2770   EXPECT_EQ(PhoneNumberUtil::FIXED_LINE_OR_MOBILE,
2771             phone_util_.GetNumberType(number));
2772 }
2773 
TEST_F(PhoneNumberUtilTest,IsSharedCost)2774 TEST_F(PhoneNumberUtilTest, IsSharedCost) {
2775   PhoneNumber number;
2776   number.set_country_code(44);
2777   number.set_national_number(uint64{8431231234});
2778   EXPECT_EQ(PhoneNumberUtil::SHARED_COST, phone_util_.GetNumberType(number));
2779 }
2780 
TEST_F(PhoneNumberUtilTest,IsVoip)2781 TEST_F(PhoneNumberUtilTest, IsVoip) {
2782   PhoneNumber number;
2783   number.set_country_code(44);
2784   number.set_national_number(uint64{5631231234});
2785   EXPECT_EQ(PhoneNumberUtil::VOIP, phone_util_.GetNumberType(number));
2786 }
2787 
TEST_F(PhoneNumberUtilTest,IsPersonalNumber)2788 TEST_F(PhoneNumberUtilTest, IsPersonalNumber) {
2789   PhoneNumber number;
2790   number.set_country_code(44);
2791   number.set_national_number(uint64{7031231234});
2792   EXPECT_EQ(PhoneNumberUtil::PERSONAL_NUMBER,
2793             phone_util_.GetNumberType(number));
2794 }
2795 
TEST_F(PhoneNumberUtilTest,IsUnknown)2796 TEST_F(PhoneNumberUtilTest, IsUnknown) {
2797   PhoneNumber number;
2798   number.set_country_code(1);
2799   number.set_national_number(uint64{65025311111});
2800   EXPECT_EQ(PhoneNumberUtil::UNKNOWN, phone_util_.GetNumberType(number));
2801 }
2802 
TEST_F(PhoneNumberUtilTest,GetCountryCodeForRegion)2803 TEST_F(PhoneNumberUtilTest, GetCountryCodeForRegion) {
2804   EXPECT_EQ(1, phone_util_.GetCountryCodeForRegion(RegionCode::US()));
2805   EXPECT_EQ(64, phone_util_.GetCountryCodeForRegion(RegionCode::NZ()));
2806   EXPECT_EQ(0, phone_util_.GetCountryCodeForRegion(RegionCode::GetUnknown()));
2807   EXPECT_EQ(0, phone_util_.GetCountryCodeForRegion(RegionCode::UN001()));
2808   // CS is already deprecated so the library doesn't support it.
2809   EXPECT_EQ(0, phone_util_.GetCountryCodeForRegion(RegionCode::CS()));
2810 }
2811 
TEST_F(PhoneNumberUtilTest,GetNationalDiallingPrefixForRegion)2812 TEST_F(PhoneNumberUtilTest, GetNationalDiallingPrefixForRegion) {
2813   string ndd_prefix;
2814   phone_util_.GetNddPrefixForRegion(RegionCode::US(), false, &ndd_prefix);
2815   EXPECT_EQ("1", ndd_prefix);
2816 
2817   // Test non-main country to see it gets the national dialling prefix for the
2818   // main country with that country calling code.
2819   ndd_prefix.clear();
2820   phone_util_.GetNddPrefixForRegion(RegionCode::BS(), false, &ndd_prefix);
2821   EXPECT_EQ("1", ndd_prefix);
2822 
2823   ndd_prefix.clear();
2824   phone_util_.GetNddPrefixForRegion(RegionCode::NZ(), false, &ndd_prefix);
2825   EXPECT_EQ("0", ndd_prefix);
2826 
2827   ndd_prefix.clear();
2828   // Test case with non digit in the national prefix.
2829   phone_util_.GetNddPrefixForRegion(RegionCode::AO(), false, &ndd_prefix);
2830   EXPECT_EQ("0~0", ndd_prefix);
2831 
2832   ndd_prefix.clear();
2833   phone_util_.GetNddPrefixForRegion(RegionCode::AO(), true, &ndd_prefix);
2834   EXPECT_EQ("00", ndd_prefix);
2835 
2836   // Test cases with invalid regions.
2837   ndd_prefix.clear();
2838   phone_util_.GetNddPrefixForRegion(RegionCode::GetUnknown(), false,
2839                                     &ndd_prefix);
2840   EXPECT_EQ("", ndd_prefix);
2841 
2842   ndd_prefix.clear();
2843   phone_util_.GetNddPrefixForRegion(RegionCode::UN001(), false, &ndd_prefix);
2844   EXPECT_EQ("", ndd_prefix);
2845 
2846   // CS is already deprecated so the library doesn't support it.
2847   ndd_prefix.clear();
2848   phone_util_.GetNddPrefixForRegion(RegionCode::CS(), false, &ndd_prefix);
2849   EXPECT_EQ("", ndd_prefix);
2850 }
2851 
TEST_F(PhoneNumberUtilTest,IsViablePhoneNumber)2852 TEST_F(PhoneNumberUtilTest, IsViablePhoneNumber) {
2853   EXPECT_FALSE(IsViablePhoneNumber("1"));
2854   // Only one or two digits before strange non-possible punctuation.
2855   EXPECT_FALSE(IsViablePhoneNumber("1+1+1"));
2856   EXPECT_FALSE(IsViablePhoneNumber("80+0"));
2857   // Two digits is viable.
2858   EXPECT_TRUE(IsViablePhoneNumber("00"));
2859   EXPECT_TRUE(IsViablePhoneNumber("111"));
2860   // Alpha numbers.
2861   EXPECT_TRUE(IsViablePhoneNumber("0800-4-pizza"));
2862   EXPECT_TRUE(IsViablePhoneNumber("0800-4-PIZZA"));
2863   // We need at least three digits before any alpha characters.
2864   EXPECT_FALSE(IsViablePhoneNumber("08-PIZZA"));
2865   EXPECT_FALSE(IsViablePhoneNumber("8-PIZZA"));
2866   EXPECT_FALSE(IsViablePhoneNumber("12. March"));
2867 }
2868 
TEST_F(PhoneNumberUtilTest,IsViablePhoneNumberNonAscii)2869 TEST_F(PhoneNumberUtilTest, IsViablePhoneNumberNonAscii) {
2870   // Only one or two digits before possible punctuation followed by more digits.
2871   // The punctuation used here is the unicode character u+3000.
2872   EXPECT_TRUE(IsViablePhoneNumber("1\xE3\x80\x80" "34" /* "1 34" */));
2873   EXPECT_FALSE(IsViablePhoneNumber("1\xE3\x80\x80" "3+4" /* "1 3+4" */));
2874   // Unicode variants of possible starting character and other allowed
2875   // punctuation/digits.
2876   EXPECT_TRUE(IsViablePhoneNumber("\xEF\xBC\x88" "1\xEF\xBC\x89\xE3\x80\x80"
2877                                   "3456789" /* "(1) 3456789" */));
2878   // Testing a leading + is okay.
2879   EXPECT_TRUE(IsViablePhoneNumber("+1\xEF\xBC\x89\xE3\x80\x80"
2880                                   "3456789" /* "+1) 3456789" */));
2881 }
2882 
TEST_F(PhoneNumberUtilTest,ConvertAlphaCharactersInNumber)2883 TEST_F(PhoneNumberUtilTest, ConvertAlphaCharactersInNumber) {
2884   string input("1800-ABC-DEF");
2885   phone_util_.ConvertAlphaCharactersInNumber(&input);
2886   // Alpha chars are converted to digits; everything else is left untouched.
2887   static const string kExpectedOutput = "1800-222-333";
2888   EXPECT_EQ(kExpectedOutput, input);
2889 
2890   // Try with some non-ASCII characters.
2891   input.assign("1\xE3\x80\x80\xEF\xBC\x88" "800) ABC-DEF"
2892                /* "1 (800) ABC-DEF" */);
2893   static const string kExpectedFullwidthOutput =
2894       "1\xE3\x80\x80\xEF\xBC\x88" "800) 222-333" /* "1 (800) 222-333" */;
2895   phone_util_.ConvertAlphaCharactersInNumber(&input);
2896   EXPECT_EQ(kExpectedFullwidthOutput, input);
2897 }
2898 
TEST_F(PhoneNumberUtilTest,NormaliseRemovePunctuation)2899 TEST_F(PhoneNumberUtilTest, NormaliseRemovePunctuation) {
2900   string input_number("034-56&+#2" "\xC2\xAD" "34");
2901   Normalize(&input_number);
2902   static const string kExpectedOutput("03456234");
2903   EXPECT_EQ(kExpectedOutput, input_number)
2904       << "Conversion did not correctly remove punctuation";
2905 }
2906 
TEST_F(PhoneNumberUtilTest,NormaliseReplaceAlphaCharacters)2907 TEST_F(PhoneNumberUtilTest, NormaliseReplaceAlphaCharacters) {
2908   string input_number("034-I-am-HUNGRY");
2909   Normalize(&input_number);
2910   static const string kExpectedOutput("034426486479");
2911   EXPECT_EQ(kExpectedOutput, input_number)
2912       << "Conversion did not correctly replace alpha characters";
2913 }
2914 
TEST_F(PhoneNumberUtilTest,NormaliseOtherDigits)2915 TEST_F(PhoneNumberUtilTest, NormaliseOtherDigits) {
2916   // The first digit is a full-width 2, the last digit is an Arabic-indic digit
2917   // 5.
2918   string input_number("\xEF\xBC\x92" "5\xD9\xA5" /* "25٥" */);
2919   Normalize(&input_number);
2920   static const string kExpectedOutput("255");
2921   EXPECT_EQ(kExpectedOutput, input_number)
2922       << "Conversion did not correctly replace non-latin digits";
2923   // The first digit is an Eastern-Arabic 5, the latter an Eastern-Arabic 0.
2924   string eastern_arabic_input_number("\xDB\xB5" "2\xDB\xB0" /* "۵2۰" */);
2925   Normalize(&eastern_arabic_input_number);
2926   static const string kExpectedOutput2("520");
2927   EXPECT_EQ(kExpectedOutput2, eastern_arabic_input_number)
2928       << "Conversion did not correctly replace non-latin digits";
2929 }
2930 
TEST_F(PhoneNumberUtilTest,NormaliseStripAlphaCharacters)2931 TEST_F(PhoneNumberUtilTest, NormaliseStripAlphaCharacters) {
2932   string input_number("034-56&+a#234");
2933   phone_util_.NormalizeDigitsOnly(&input_number);
2934   static const string kExpectedOutput("03456234");
2935   EXPECT_EQ(kExpectedOutput, input_number)
2936       << "Conversion did not correctly remove alpha characters";
2937 }
2938 
TEST_F(PhoneNumberUtilTest,NormaliseStripNonDiallableCharacters)2939 TEST_F(PhoneNumberUtilTest, NormaliseStripNonDiallableCharacters) {
2940   string input_number("03*4-56&+1a#234");
2941   phone_util_.NormalizeDiallableCharsOnly(&input_number);
2942   static const string kExpectedOutput("03*456+1#234");
2943   EXPECT_EQ(kExpectedOutput, input_number)
2944       << "Conversion did not correctly remove non-diallable characters";
2945 }
2946 
TEST_F(PhoneNumberUtilTest,MaybeStripInternationalPrefix)2947 TEST_F(PhoneNumberUtilTest, MaybeStripInternationalPrefix) {
2948   string international_prefix("00[39]");
2949   string number_to_strip("0034567700-3898003");
2950   // Note the dash is removed as part of the normalization.
2951   string stripped_number("45677003898003");
2952   EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD,
2953       MaybeStripInternationalPrefixAndNormalize(international_prefix,
2954                                                 &number_to_strip));
2955   EXPECT_EQ(stripped_number, number_to_strip)
2956       << "The number was not stripped of its international prefix.";
2957 
2958   // Now the number no longer starts with an IDD prefix, so it should now report
2959   // FROM_DEFAULT_COUNTRY.
2960   EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY,
2961       MaybeStripInternationalPrefixAndNormalize(international_prefix,
2962                                                 &number_to_strip));
2963 
2964   number_to_strip.assign("00945677003898003");
2965   EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD,
2966       MaybeStripInternationalPrefixAndNormalize(international_prefix,
2967                                                 &number_to_strip));
2968   EXPECT_EQ(stripped_number, number_to_strip)
2969       << "The number was not stripped of its international prefix.";
2970 
2971   // Test it works when the international prefix is broken up by spaces.
2972   number_to_strip.assign("00 9 45677003898003");
2973   EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD,
2974       MaybeStripInternationalPrefixAndNormalize(international_prefix,
2975                                                 &number_to_strip));
2976   EXPECT_EQ(stripped_number, number_to_strip)
2977       << "The number was not stripped of its international prefix.";
2978   // Now the number no longer starts with an IDD prefix, so it should now report
2979   // FROM_DEFAULT_COUNTRY.
2980   EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY,
2981       MaybeStripInternationalPrefixAndNormalize(international_prefix,
2982                                                 &number_to_strip));
2983 
2984   // Test the + symbol is also recognised and stripped.
2985   number_to_strip.assign("+45677003898003");
2986   stripped_number.assign("45677003898003");
2987   EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN,
2988       MaybeStripInternationalPrefixAndNormalize(international_prefix,
2989                                                 &number_to_strip));
2990   EXPECT_EQ(stripped_number, number_to_strip)
2991       << "The number supplied was not stripped of the plus symbol.";
2992 
2993   // If the number afterwards is a zero, we should not strip this - no country
2994   // code begins with 0.
2995   number_to_strip.assign("0090112-3123");
2996   stripped_number.assign("00901123123");
2997   EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY,
2998       MaybeStripInternationalPrefixAndNormalize(international_prefix,
2999                                                 &number_to_strip));
3000   EXPECT_EQ(stripped_number, number_to_strip)
3001       << "The number had a 0 after the match so shouldn't be stripped.";
3002   // Here the 0 is separated by a space from the IDD.
3003   number_to_strip.assign("009 0-112-3123");
3004   EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY,
3005       MaybeStripInternationalPrefixAndNormalize(international_prefix,
3006                                                 &number_to_strip));
3007 }
3008 
TEST_F(PhoneNumberUtilTest,MaybeStripNationalPrefixAndCarrierCode)3009 TEST_F(PhoneNumberUtilTest, MaybeStripNationalPrefixAndCarrierCode) {
3010   PhoneMetadata metadata;
3011   metadata.set_national_prefix_for_parsing("34");
3012   metadata.mutable_general_desc()->set_national_number_pattern("\\d{4,8}");
3013   string number_to_strip("34356778");
3014   string stripped_number("356778");
3015   string carrier_code;
3016   MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
3017                                          &carrier_code);
3018   EXPECT_EQ(stripped_number, number_to_strip)
3019       << "Should have had national prefix stripped.";
3020   EXPECT_EQ("", carrier_code) << "Should have had no carrier code stripped.";
3021   // Retry stripping - now the number should not start with the national prefix,
3022   // so no more stripping should occur.
3023   MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
3024                                          &carrier_code);
3025   EXPECT_EQ(stripped_number, number_to_strip)
3026       << "Should have had no change - no national prefix present.";
3027   // Some countries have no national prefix. Repeat test with none specified.
3028   metadata.clear_national_prefix_for_parsing();
3029   MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
3030                                          &carrier_code);
3031   EXPECT_EQ(stripped_number, number_to_strip)
3032       << "Should have had no change - empty national prefix.";
3033   // If the resultant number doesn't match the national rule, it shouldn't be
3034   // stripped.
3035   metadata.set_national_prefix_for_parsing("3");
3036   number_to_strip.assign("3123");
3037   stripped_number.assign("3123");
3038   MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
3039                                          &carrier_code);
3040   EXPECT_EQ(stripped_number, number_to_strip)
3041       << "Should have had no change - after stripping, it wouldn't have "
3042       << "matched the national rule.";
3043   // Test extracting carrier selection code.
3044   metadata.set_national_prefix_for_parsing("0(81)?");
3045   number_to_strip.assign("08122123456");
3046   stripped_number.assign("22123456");
3047   MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
3048                                          &carrier_code);
3049   EXPECT_EQ("81", carrier_code) << "Should have had carrier code stripped.";
3050   EXPECT_EQ(stripped_number, number_to_strip)
3051       << "Should have had national prefix and carrier code stripped.";
3052   // If there was a transform rule, check it was applied.
3053   metadata.set_national_prefix_transform_rule("5$15");
3054   // Note that a capturing group is present here.
3055   metadata.set_national_prefix_for_parsing("0(\\d{2})");
3056   number_to_strip.assign("031123");
3057   string transformed_number("5315123");
3058   MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
3059                                          &carrier_code);
3060   EXPECT_EQ(transformed_number, number_to_strip)
3061       << "Was not successfully transformed.";
3062 }
3063 
TEST_F(PhoneNumberUtilTest,MaybeStripExtension)3064 TEST_F(PhoneNumberUtilTest, MaybeStripExtension) {
3065   // One with extension.
3066   string number("1234576 ext. 1234");
3067   string extension;
3068   string expected_extension("1234");
3069   string stripped_number("1234576");
3070   EXPECT_TRUE(MaybeStripExtension(&number, &extension));
3071   EXPECT_EQ(stripped_number, number);
3072   EXPECT_EQ(expected_extension, extension);
3073 
3074   // One without extension.
3075   number.assign("1234-576");
3076   extension.clear();
3077   stripped_number.assign("1234-576");
3078   EXPECT_FALSE(MaybeStripExtension(&number, &extension));
3079   EXPECT_EQ(stripped_number, number);
3080   EXPECT_TRUE(extension.empty());
3081 
3082   // One with an extension caught by the second capturing group in
3083   // kKnownExtnPatterns.
3084   number.assign("1234576-123#");
3085   extension.clear();
3086   expected_extension.assign("123");
3087   stripped_number.assign("1234576");
3088   EXPECT_TRUE(MaybeStripExtension(&number, &extension));
3089   EXPECT_EQ(stripped_number, number);
3090   EXPECT_EQ(expected_extension, extension);
3091 
3092   number.assign("1234576 ext.123#");
3093   extension.clear();
3094   EXPECT_TRUE(MaybeStripExtension(&number, &extension));
3095   EXPECT_EQ(stripped_number, number);
3096   EXPECT_EQ(expected_extension, extension);
3097 }
3098 
TEST_F(PhoneNumberUtilTest,MaybeExtractCountryCode)3099 TEST_F(PhoneNumberUtilTest, MaybeExtractCountryCode) {
3100   PhoneNumber number;
3101   const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::US());
3102   // Note that for the US, the IDD is 011.
3103   string phone_number("011112-3456789");
3104   string stripped_number("123456789");
3105   int expected_country_code = 1;
3106   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3107             MaybeExtractCountryCode(metadata, true, &phone_number, &number));
3108   EXPECT_EQ(expected_country_code, number.country_code());
3109   EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD, number.country_code_source());
3110   EXPECT_EQ(stripped_number, phone_number);
3111 
3112   number.Clear();
3113   phone_number.assign("+80012345678");
3114   stripped_number.assign("12345678");
3115   expected_country_code = 800;
3116   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3117             MaybeExtractCountryCode(metadata, true, &phone_number, &number));
3118   EXPECT_EQ(expected_country_code, number.country_code());
3119   EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN,
3120             number.country_code_source());
3121   EXPECT_EQ(stripped_number, phone_number);
3122 
3123   number.Clear();
3124   phone_number.assign("+6423456789");
3125   stripped_number.assign("23456789");
3126   expected_country_code = 64;
3127   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3128             MaybeExtractCountryCode(metadata, true, &phone_number, &number));
3129   EXPECT_EQ(expected_country_code, number.country_code());
3130   EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN,
3131             number.country_code_source());
3132   EXPECT_EQ(stripped_number, phone_number);
3133 
3134   // Should not have extracted a country code - no international prefix present.
3135   number.Clear();
3136   expected_country_code = 0;
3137   phone_number.assign("2345-6789");
3138   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3139             MaybeExtractCountryCode(metadata, true, &phone_number, &number));
3140   EXPECT_EQ(expected_country_code, number.country_code());
3141   EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, number.country_code_source());
3142   EXPECT_EQ(stripped_number, phone_number);
3143 
3144   expected_country_code = 0;
3145   phone_number.assign("0119991123456789");
3146   stripped_number.assign(phone_number);
3147   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
3148             MaybeExtractCountryCode(metadata, true, &phone_number, &number));
3149 
3150   number.Clear();
3151   phone_number.assign("(1 610) 619 4466");
3152   stripped_number.assign("6106194466");
3153   expected_country_code = 1;
3154   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3155             MaybeExtractCountryCode(metadata, true, &phone_number, &number));
3156   EXPECT_EQ(expected_country_code, number.country_code());
3157   EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITHOUT_PLUS_SIGN,
3158             number.country_code_source());
3159   EXPECT_EQ(stripped_number, phone_number);
3160 
3161   number.Clear();
3162   phone_number.assign("(1 610) 619 4466");
3163   stripped_number.assign("6106194466");
3164   expected_country_code = 1;
3165   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3166             MaybeExtractCountryCode(metadata, false, &phone_number, &number));
3167   EXPECT_EQ(expected_country_code, number.country_code());
3168   EXPECT_FALSE(number.has_country_code_source());
3169   EXPECT_EQ(stripped_number, phone_number);
3170 
3171   // Should not have extracted a country code - invalid number after extraction
3172   // of uncertain country code.
3173   number.Clear();
3174   phone_number.assign("(1 610) 619 446");
3175   stripped_number.assign("1610619446");
3176   expected_country_code = 0;
3177   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3178             MaybeExtractCountryCode(metadata, false, &phone_number, &number));
3179   EXPECT_EQ(expected_country_code, number.country_code());
3180   EXPECT_FALSE(number.has_country_code_source());
3181   EXPECT_EQ(stripped_number, phone_number);
3182 
3183   number.Clear();
3184   phone_number.assign("(1 610) 619");
3185   stripped_number.assign("1610619");
3186   expected_country_code = 0;
3187   // Should not have extracted a country code - invalid number both before and
3188   // after extraction of uncertain country code.
3189   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3190             MaybeExtractCountryCode(metadata, true, &phone_number, &number));
3191   EXPECT_EQ(expected_country_code, number.country_code());
3192   EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, number.country_code_source());
3193   EXPECT_EQ(stripped_number, phone_number);
3194 }
3195 
TEST_F(PhoneNumberUtilTest,CountryWithNoNumberDesc)3196 TEST_F(PhoneNumberUtilTest, CountryWithNoNumberDesc) {
3197   string formatted_number;
3198   // Andorra is a country where we don't have PhoneNumberDesc info in the
3199   // metadata.
3200   PhoneNumber ad_number;
3201   ad_number.set_country_code(376);
3202   ad_number.set_national_number(uint64{12345});
3203   phone_util_.Format(ad_number, PhoneNumberUtil::INTERNATIONAL,
3204                      &formatted_number);
3205   EXPECT_EQ("+376 12345", formatted_number);
3206   phone_util_.Format(ad_number, PhoneNumberUtil::E164, &formatted_number);
3207   EXPECT_EQ("+37612345", formatted_number);
3208   phone_util_.Format(ad_number, PhoneNumberUtil::NATIONAL, &formatted_number);
3209   EXPECT_EQ("12345", formatted_number);
3210   EXPECT_EQ(PhoneNumberUtil::UNKNOWN, phone_util_.GetNumberType(ad_number));
3211   EXPECT_FALSE(phone_util_.IsValidNumber(ad_number));
3212 
3213   // Test dialing a US number from within Andorra.
3214   PhoneNumber us_number;
3215   us_number.set_country_code(1);
3216   us_number.set_national_number(uint64{6502530000});
3217   phone_util_.FormatOutOfCountryCallingNumber(us_number, RegionCode::AD(),
3218                                               &formatted_number);
3219   EXPECT_EQ("00 1 650 253 0000", formatted_number);
3220 }
3221 
TEST_F(PhoneNumberUtilTest,UnknownCountryCallingCode)3222 TEST_F(PhoneNumberUtilTest, UnknownCountryCallingCode) {
3223   PhoneNumber invalid_number;
3224   invalid_number.set_country_code(kInvalidCountryCode);
3225   invalid_number.set_national_number(uint64{12345});
3226 
3227   EXPECT_FALSE(phone_util_.IsValidNumber(invalid_number));
3228 
3229   // It's not very well defined as to what the E164 representation for a number
3230   // with an invalid country calling code is, but just prefixing the country
3231   // code and national number is about the best we can do.
3232   string formatted_number;
3233   phone_util_.Format(invalid_number, PhoneNumberUtil::E164, &formatted_number);
3234   EXPECT_EQ("+212345", formatted_number);
3235 }
3236 
TEST_F(PhoneNumberUtilTest,IsNumberMatchMatches)3237 TEST_F(PhoneNumberUtilTest, IsNumberMatchMatches) {
3238   // Test simple matches where formatting is different, or leading zeros, or
3239   // country code has been specified.
3240   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3241             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331 6005",
3242                                                     "+64 03 331 6005"));
3243   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3244             phone_util_.IsNumberMatchWithTwoStrings("+800 1234 5678",
3245                                                     "+80012345678"));
3246   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3247             phone_util_.IsNumberMatchWithTwoStrings("+64 03 331-6005",
3248                                                     "+64 03331 6005"));
3249   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3250             phone_util_.IsNumberMatchWithTwoStrings("+643 331-6005",
3251                                                     "+64033316005"));
3252   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3253             phone_util_.IsNumberMatchWithTwoStrings("+643 331-6005",
3254                                                     "+6433316005"));
3255   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3256             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
3257                                                     "+6433316005"));
3258   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3259             phone_util_.IsNumberMatchWithTwoStrings(
3260                 "+64 3 331-6005", "tel:+64-3-331-6005;isub=123"));
3261   // Test alpha numbers.
3262   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3263             phone_util_.IsNumberMatchWithTwoStrings("+1800 siX-Flags",
3264                                                     "+1 800 7493 5247"));
3265   // Test numbers with extensions.
3266   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3267             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 extn 1234",
3268                                                     "+6433316005#1234"));
3269   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3270             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 extn 1234",
3271                                                     "+6433316005;1234"));
3272   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3273             phone_util_.IsNumberMatchWithTwoStrings(
3274 "+7 423 202-25-11 ext 100",
3275 "+7 4232022511 \xd0\xb4\xd0\xbe\xd0\xb1. 100"));
3276 
3277   // Test proto buffers.
3278   PhoneNumber nz_number;
3279   nz_number.set_country_code(64);
3280   nz_number.set_national_number(uint64{33316005});
3281   nz_number.set_extension("3456");
3282   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3283             phone_util_.IsNumberMatchWithOneString(nz_number,
3284                                                    "+643 331 6005 ext 3456"));
3285   nz_number.clear_extension();
3286   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3287             phone_util_.IsNumberMatchWithOneString(nz_number,
3288                                                    "+643 331 6005"));
3289   // Check empty extensions are ignored.
3290   nz_number.set_extension("");
3291   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3292             phone_util_.IsNumberMatchWithOneString(nz_number,
3293                                                    "+643 331 6005"));
3294   // Check variant with two proto buffers.
3295   PhoneNumber nz_number_2;
3296   nz_number_2.set_country_code(64);
3297   nz_number_2.set_national_number(uint64{33316005});
3298   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3299             phone_util_.IsNumberMatch(nz_number, nz_number_2));
3300 }
3301 
TEST_F(PhoneNumberUtilTest,IsNumberMatchShortMatchIfDiffNumLeadingZeros)3302 TEST_F(PhoneNumberUtilTest, IsNumberMatchShortMatchIfDiffNumLeadingZeros) {
3303   PhoneNumber nz_number_one;
3304   nz_number_one.set_country_code(64);
3305   nz_number_one.set_national_number(uint64{33316005});
3306   nz_number_one.set_italian_leading_zero(true);
3307 
3308   PhoneNumber nz_number_two;
3309   nz_number_two.set_country_code(64);
3310   nz_number_two.set_national_number(uint64{33316005});
3311   nz_number_two.set_italian_leading_zero(true);
3312   nz_number_two.set_number_of_leading_zeros(2);
3313 
3314   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3315             phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
3316 
3317   nz_number_one.set_italian_leading_zero(false);
3318   nz_number_one.set_number_of_leading_zeros(1);
3319   nz_number_two.set_italian_leading_zero(true);
3320   nz_number_two.set_number_of_leading_zeros(1);
3321   // Since one doesn't have the "italian_leading_zero" set to true, we ignore
3322   // the number of leading zeros present (1 is in any case the default value).
3323   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3324             phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
3325 }
3326 
TEST_F(PhoneNumberUtilTest,IsNumberMatchAcceptsProtoDefaultsAsMatch)3327 TEST_F(PhoneNumberUtilTest, IsNumberMatchAcceptsProtoDefaultsAsMatch) {
3328   PhoneNumber nz_number_one;
3329   nz_number_one.set_country_code(64);
3330   nz_number_one.set_national_number(uint64{33316005});
3331   nz_number_one.set_italian_leading_zero(true);
3332 
3333   PhoneNumber nz_number_two;
3334   nz_number_two.set_country_code(64);
3335   nz_number_two.set_national_number(uint64{33316005});
3336   nz_number_two.set_italian_leading_zero(true);
3337   // The default for number_of_leading_zeros is 1, so it shouldn't normally be
3338   // set, however if it is it should be considered equivalent.
3339   nz_number_two.set_number_of_leading_zeros(1);
3340   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3341             phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
3342 }
3343 
TEST_F(PhoneNumberUtilTest,IsNumberMatchMatchesDiffLeadingZerosIfItalianLeadingZeroFalse)3344 TEST_F(PhoneNumberUtilTest,
3345        IsNumberMatchMatchesDiffLeadingZerosIfItalianLeadingZeroFalse) {
3346   PhoneNumber nz_number_one;
3347   nz_number_one.set_country_code(64);
3348   nz_number_one.set_national_number(uint64{33316005});
3349 
3350   PhoneNumber nz_number_two;
3351   nz_number_two.set_country_code(64);
3352   nz_number_two.set_national_number(uint64{33316005});
3353   // The default for number_of_leading_zeros is 1, so it shouldn't normally be
3354   // set, however if it is it should be considered equivalent.
3355   nz_number_two.set_number_of_leading_zeros(1);
3356   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3357             phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
3358   // Even if it is set to ten, it is still equivalent because in both cases
3359   // italian_leading_zero is not true.
3360   nz_number_two.set_number_of_leading_zeros(10);
3361   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3362             phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
3363 }
3364 
TEST_F(PhoneNumberUtilTest,IsNumberMatchIgnoresSomeFields)3365 TEST_F(PhoneNumberUtilTest, IsNumberMatchIgnoresSomeFields) {
3366   // Check raw_input, country_code_source and preferred_domestic_carrier_code
3367   // are ignored.
3368   PhoneNumber br_number_1;
3369   PhoneNumber br_number_2;
3370   br_number_1.set_country_code(55);
3371   br_number_1.set_national_number(uint64{3121286979});
3372   br_number_1.set_country_code_source(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN);
3373   br_number_1.set_preferred_domestic_carrier_code("12");
3374   br_number_1.set_raw_input("012 3121286979");
3375   br_number_2.set_country_code(55);
3376   br_number_2.set_national_number(uint64{3121286979});
3377   br_number_2.set_country_code_source(PhoneNumber::FROM_DEFAULT_COUNTRY);
3378   br_number_2.set_preferred_domestic_carrier_code("14");
3379   br_number_2.set_raw_input("143121286979");
3380   EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
3381             phone_util_.IsNumberMatch(br_number_1, br_number_2));
3382 }
3383 
TEST_F(PhoneNumberUtilTest,IsNumberMatchNonMatches)3384 TEST_F(PhoneNumberUtilTest, IsNumberMatchNonMatches) {
3385   // NSN matches.
3386   EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
3387             phone_util_.IsNumberMatchWithTwoStrings("03 331 6005",
3388                                                     "03 331 6006"));
3389   EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
3390             phone_util_.IsNumberMatchWithTwoStrings("+800 1234 5678",
3391                                                     "+1 800 1234 5678"));
3392   // Different country code, partial number match.
3393   EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
3394             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
3395                                                     "+16433316005"));
3396   // Different country code, same number.
3397   EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
3398             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
3399                                                     "+6133316005"));
3400   // Extension different, all else the same.
3401   EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
3402             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 extn 1234",
3403                                                     "+0116433316005#1235"));
3404   EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
3405             phone_util_.IsNumberMatchWithTwoStrings(
3406                 "+64 3 331-6005 extn 1234", "tel:+64-3-331-6005;ext=1235"));
3407   // NSN matches, but extension is different - not the same number.
3408   EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
3409             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 ext.1235",
3410                                                     "3 331 6005#1234"));
3411   // Invalid numbers that can't be parsed.
3412   EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER,
3413             phone_util_.IsNumberMatchWithTwoStrings("4", "3 331 6043"));
3414   // Invalid numbers that can't be parsed.
3415   EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER,
3416             phone_util_.IsNumberMatchWithTwoStrings("+43", "+64 3 331 6005"));
3417   EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER,
3418             phone_util_.IsNumberMatchWithTwoStrings("+43", "64 3 331 6005"));
3419   EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER,
3420             phone_util_.IsNumberMatchWithTwoStrings("Dog", "64 3 331 6005"));
3421 }
3422 
TEST_F(PhoneNumberUtilTest,IsNumberMatchNsnMatches)3423 TEST_F(PhoneNumberUtilTest, IsNumberMatchNsnMatches) {
3424   // NSN matches.
3425   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3426             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
3427                                                     "03 331 6005"));
3428   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3429             phone_util_.IsNumberMatchWithTwoStrings(
3430                 "+64 3 331-6005",
3431                 "tel:03-331-6005;isub=1234;phone-context=abc.nz"));
3432 
3433   PhoneNumber nz_number;
3434   nz_number.set_country_code(64);
3435   nz_number.set_national_number(uint64{33316005});
3436   nz_number.set_extension("");
3437   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3438             phone_util_.IsNumberMatchWithOneString(nz_number, "03 331 6005"));
3439   // Here the second number possibly starts with the country code for New
3440   // Zealand, although we are unsure.
3441   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3442             phone_util_.IsNumberMatchWithOneString(nz_number,
3443                                                    "(64-3) 331 6005"));
3444 
3445   // Here, the 1 might be a national prefix, if we compare it to the US number,
3446   // so the resultant match is an NSN match.
3447   PhoneNumber us_number;
3448   us_number.set_country_code(1);
3449   us_number.set_national_number(uint64{2345678901});
3450   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3451             phone_util_.IsNumberMatchWithOneString(us_number,
3452                                                    "1-234-567-8901"));
3453   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3454             phone_util_.IsNumberMatchWithOneString(us_number, "2345678901"));
3455   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3456             phone_util_.IsNumberMatchWithTwoStrings("+1 234-567 8901",
3457                                                     "1 234 567 8901"));
3458   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3459             phone_util_.IsNumberMatchWithTwoStrings("1 234-567 8901",
3460                                                     "1 234 567 8901"));
3461   EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
3462             phone_util_.IsNumberMatchWithTwoStrings("1 234-567 8901",
3463                                                     "+1 234 567 8901"));
3464   // For this case, the match will be a short NSN match, because we cannot
3465   // assume that the 1 might be a national prefix, so don't remove it when
3466   // parsing.
3467   PhoneNumber random_number;
3468   random_number.set_country_code(41);
3469   random_number.set_national_number(uint64{2345678901});
3470   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3471             phone_util_.IsNumberMatchWithOneString(random_number,
3472                                                    "1-234-567-8901"));
3473 }
3474 
TEST_F(PhoneNumberUtilTest,IsNumberMatchShortNsnMatches)3475 TEST_F(PhoneNumberUtilTest, IsNumberMatchShortNsnMatches) {
3476   // Short NSN matches with the country not specified for either one or both
3477   // numbers.
3478   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3479             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
3480                                                     "331 6005"));
3481   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3482             phone_util_.IsNumberMatchWithTwoStrings(
3483                 "+64 3 331-6005", "tel:331-6005;phone-context=abc.nz"));
3484   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3485               phone_util_.IsNumberMatchWithTwoStrings(
3486                   "+64 3 331-6005",
3487                   "tel:331-6005;isub=1234;phone-context=abc.nz"));
3488   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3489               phone_util_.IsNumberMatchWithTwoStrings(
3490                   "+64 3 331-6005",
3491                   "tel:331-6005;isub=1234;phone-context=abc.nz;a=%A1"));
3492 
3493   // We did not know that the "0" was a national prefix since neither number has
3494   // a country code, so this is considered a SHORT_NSN_MATCH.
3495   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3496             phone_util_.IsNumberMatchWithTwoStrings("3 331-6005",
3497                                                     "03 331 6005"));
3498 
3499   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3500               phone_util_.IsNumberMatchWithTwoStrings("3 331-6005",
3501                                                       "331 6005"));
3502 
3503   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3504               phone_util_.IsNumberMatchWithTwoStrings(
3505                   "3 331-6005", "tel:331-6005;phone-context=abc.nz"));
3506   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3507             phone_util_.IsNumberMatchWithTwoStrings("3 331-6005",
3508                                                     "+64 331 6005"));
3509 
3510   // Short NSN match with the country specified.
3511   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3512             phone_util_.IsNumberMatchWithTwoStrings("03 331-6005",
3513                                                     "331 6005"));
3514 
3515   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3516               phone_util_.IsNumberMatchWithTwoStrings("1 234 345 6789",
3517                                                       "345 6789"));
3518 
3519   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3520             phone_util_.IsNumberMatchWithTwoStrings("+1 (234) 345 6789",
3521                                                     "345 6789"));
3522 
3523   // NSN matches, country code omitted for one number, extension missing for
3524   // one.
3525   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3526             phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
3527                                                     "3 331 6005#1234"));
3528 
3529   // One has Italian leading zero, one does not.
3530   PhoneNumber it_number_1, it_number_2;
3531   it_number_1.set_country_code(39);
3532   it_number_1.set_national_number(uint64{1234});
3533   it_number_1.set_italian_leading_zero(true);
3534   it_number_2.set_country_code(39);
3535   it_number_2.set_national_number(uint64{1234});
3536   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3537             phone_util_.IsNumberMatch(it_number_1, it_number_2));
3538 
3539   // One has an extension, the other has an extension of "".
3540   it_number_1.set_extension("1234");
3541   it_number_1.clear_italian_leading_zero();
3542   it_number_2.set_extension("");
3543   EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
3544             phone_util_.IsNumberMatch(it_number_1, it_number_2));
3545 }
3546 
TEST_F(PhoneNumberUtilTest,ParseNationalNumber)3547 TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
3548   PhoneNumber nz_number;
3549   nz_number.set_country_code(64);
3550   nz_number.set_national_number(uint64{33316005});
3551   PhoneNumber test_number;
3552   // National prefix attached.
3553   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3554             phone_util_.Parse("033316005", RegionCode::NZ(), &test_number));
3555   EXPECT_EQ(nz_number, test_number);
3556   // Some fields are not filled in by Parse, but only by ParseAndKeepRawInput.
3557   EXPECT_FALSE(nz_number.has_country_code_source());
3558   EXPECT_EQ(PhoneNumber::UNSPECIFIED, nz_number.country_code_source());
3559 
3560   // National prefix missing.
3561   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3562             phone_util_.Parse("33316005", RegionCode::NZ(), &test_number));
3563   EXPECT_EQ(nz_number, test_number);
3564   // National prefix attached and some formatting present.
3565   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3566             phone_util_.Parse("03-331 6005", RegionCode::NZ(), &test_number));
3567   EXPECT_EQ(nz_number, test_number);
3568   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3569             phone_util_.Parse("03 331 6005", RegionCode::NZ(), &test_number));
3570   EXPECT_EQ(nz_number, test_number);
3571   // Test parsing RFC3966 format with a phone context.
3572   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3573             phone_util_.Parse("tel:03-331-6005;phone-context=+64",
3574                               RegionCode::NZ(), &test_number));
3575   EXPECT_EQ(nz_number, test_number);
3576   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3577             phone_util_.Parse("tel:331-6005;phone-context=+64-3",
3578                               RegionCode::NZ(), &test_number));
3579   EXPECT_EQ(nz_number, test_number);
3580   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3581             phone_util_.Parse("tel:331-6005;phone-context=+64-3",
3582                               RegionCode::US(), &test_number));
3583   EXPECT_EQ(nz_number, test_number);
3584   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3585             phone_util_.Parse("My number is tel:03-331-6005;phone-context=+64",
3586                               RegionCode::NZ(), &test_number));
3587   EXPECT_EQ(nz_number, test_number);
3588   // Test parsing RFC3966 format with optional user-defined parameters. The
3589   // parameters will appear after the context if present.
3590   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3591             phone_util_.Parse("tel:03-331-6005;phone-context=+64;a=%A1",
3592                               RegionCode::NZ(), &test_number));
3593   EXPECT_EQ(nz_number, test_number);
3594   // Test parsing RFC3966 with an ISDN subaddress.
3595   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3596             phone_util_.Parse("tel:03-331-6005;isub=12345;phone-context=+64",
3597                               RegionCode::NZ(), &test_number));
3598   EXPECT_EQ(nz_number, test_number);
3599   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3600             phone_util_.Parse("tel:+64-3-331-6005;isub=12345",
3601                               RegionCode::US(), &test_number));
3602   EXPECT_EQ(nz_number, test_number);
3603   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3604             phone_util_.Parse("03-331-6005;phone-context=+64",
3605                               RegionCode::NZ(), &test_number));
3606   EXPECT_EQ(nz_number, test_number);
3607   // Testing international prefixes.
3608   // Should strip country code.
3609   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3610             phone_util_.Parse("0064 3 331 6005",
3611                               RegionCode::NZ(), &test_number));
3612   EXPECT_EQ(nz_number, test_number);
3613   // Try again, but this time we have an international number with Region Code
3614   // US. It should recognise the country code and parse accordingly.
3615   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3616             phone_util_.Parse("01164 3 331 6005",
3617                               RegionCode::US(), &test_number));
3618   EXPECT_EQ(nz_number, test_number);
3619   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3620             phone_util_.Parse("+64 3 331 6005",
3621                               RegionCode::US(), &test_number));
3622   EXPECT_EQ(nz_number, test_number);
3623   // We should ignore the leading plus here, since it is not followed by a valid
3624   // country code but instead is followed by the IDD for the US.
3625   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3626             phone_util_.Parse("+01164 3 331 6005",
3627                               RegionCode::US(), &test_number));
3628   EXPECT_EQ(nz_number, test_number);
3629   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3630             phone_util_.Parse("+0064 3 331 6005",
3631                               RegionCode::NZ(), &test_number));
3632   EXPECT_EQ(nz_number, test_number);
3633   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3634             phone_util_.Parse("+ 00 64 3 331 6005",
3635                               RegionCode::NZ(), &test_number));
3636   EXPECT_EQ(nz_number, test_number);
3637 
3638   PhoneNumber us_local_number;
3639   us_local_number.set_country_code(1);
3640   us_local_number.set_national_number(uint64{2530000});
3641   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3642             phone_util_.Parse("tel:253-0000;phone-context=www.google.com",
3643                               RegionCode::US(), &test_number));
3644   EXPECT_EQ(us_local_number, test_number);
3645   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3646             phone_util_.Parse(
3647                 "tel:253-0000;isub=12345;phone-context=www.google.com",
3648                 RegionCode::US(), &test_number));
3649   EXPECT_EQ(us_local_number, test_number);
3650   // This is invalid because no "+" sign is present as part of phone-context.
3651   // The phone context is simply ignored in this case just as if it contains a
3652   // domain.
3653   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3654             phone_util_.Parse("tel:2530000;isub=12345;phone-context=1-650",
3655                               RegionCode::US(), &test_number));
3656   EXPECT_EQ(us_local_number, test_number);
3657   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3658             phone_util_.Parse("tel:2530000;isub=12345;phone-context=1234.com",
3659                               RegionCode::US(), &test_number));
3660   EXPECT_EQ(us_local_number, test_number);
3661 
3662   // Test for http://b/issue?id=2247493
3663   nz_number.Clear();
3664   nz_number.set_country_code(64);
3665   nz_number.set_national_number(uint64{64123456});
3666   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3667             phone_util_.Parse("+64(0)64123456",
3668                               RegionCode::US(), &test_number));
3669   EXPECT_EQ(nz_number, test_number);
3670 
3671   // Check that using a "/" is fine in a phone number.
3672   PhoneNumber de_number;
3673   de_number.set_country_code(49);
3674   de_number.set_national_number(uint64{12345678});
3675   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3676             phone_util_.Parse("123/45678", RegionCode::DE(), &test_number));
3677   EXPECT_EQ(de_number, test_number);
3678 
3679   PhoneNumber us_number;
3680   us_number.set_country_code(1);
3681   // Check it doesn't use the '1' as a country code when parsing if the phone
3682   // number was already possible.
3683   us_number.set_national_number(uint64{1234567890});
3684   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3685             phone_util_.Parse("123-456-7890", RegionCode::US(), &test_number));
3686   EXPECT_EQ(us_number, test_number);
3687 
3688   // Test star numbers. Although this is not strictly valid, we would like to
3689   // make sure we can parse the output we produce when formatting the number.
3690   PhoneNumber star_number;
3691   star_number.set_country_code(81);
3692   star_number.set_national_number(uint64{2345});
3693   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3694             phone_util_.Parse("+81 *2345", RegionCode::JP(), &test_number));
3695   EXPECT_EQ(star_number, test_number);
3696 
3697   PhoneNumber short_number;
3698   short_number.set_country_code(64);
3699   short_number.set_national_number(uint64{12});
3700   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3701             phone_util_.Parse("12", RegionCode::NZ(), &test_number));
3702   EXPECT_EQ(short_number, test_number);
3703 
3704   // Test for short-code with leading zero for a country which has 0 as
3705   // national prefix. Ensure it's not interpreted as national prefix if the
3706   // remaining number length is local-only in terms of length. Example: In GB,
3707   // length 6-7 are only possible local-only.
3708   short_number.set_country_code(44);
3709   short_number.set_national_number(123456);
3710   short_number.set_italian_leading_zero(true);
3711   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3712             phone_util_.Parse("0123456", RegionCode::GB(), &test_number));
3713   EXPECT_EQ(short_number, test_number);
3714 }
3715 
TEST_F(PhoneNumberUtilTest,ParseNumberWithAlphaCharacters)3716 TEST_F(PhoneNumberUtilTest, ParseNumberWithAlphaCharacters) {
3717   // Test case with alpha characters.
3718   PhoneNumber test_number;
3719   PhoneNumber tollfree_number;
3720   tollfree_number.set_country_code(64);
3721   tollfree_number.set_national_number(uint64{800332005});
3722   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3723             phone_util_.Parse("0800 DDA 005", RegionCode::NZ(), &test_number));
3724   EXPECT_EQ(tollfree_number, test_number);
3725 
3726   PhoneNumber premium_number;
3727   premium_number.set_country_code(64);
3728   premium_number.set_national_number(uint64{9003326005});
3729   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3730             phone_util_.Parse("0900 DDA 6005", RegionCode::NZ(), &test_number));
3731   EXPECT_EQ(premium_number, test_number);
3732 
3733   // Not enough alpha characters for them to be considered intentional, so they
3734   // are stripped.
3735   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3736             phone_util_.Parse("0900 332 6005a",
3737                               RegionCode::NZ(), &test_number));
3738   EXPECT_EQ(premium_number, test_number);
3739   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3740             phone_util_.Parse("0900 332 600a5",
3741                               RegionCode::NZ(), &test_number));
3742   EXPECT_EQ(premium_number, test_number);
3743 
3744   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3745             phone_util_.Parse("0900 332 600A5",
3746                               RegionCode::NZ(), &test_number));
3747   EXPECT_EQ(premium_number, test_number);
3748 
3749   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3750             phone_util_.Parse("0900 a332 600A5",
3751                               RegionCode::NZ(), &test_number));
3752   EXPECT_EQ(premium_number, test_number);
3753 }
3754 
TEST_F(PhoneNumberUtilTest,ParseWithInternationalPrefixes)3755 TEST_F(PhoneNumberUtilTest, ParseWithInternationalPrefixes) {
3756   PhoneNumber us_number;
3757   us_number.set_country_code(1);
3758   us_number.set_national_number(uint64{6503336000});
3759   PhoneNumber test_number;
3760   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3761             phone_util_.Parse("+1 (650) 333-6000",
3762                               RegionCode::US(), &test_number));
3763   EXPECT_EQ(us_number, test_number);
3764   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3765             phone_util_.Parse("+1-650-333-6000",
3766                               RegionCode::US(), &test_number));
3767   EXPECT_EQ(us_number, test_number);
3768 
3769   // Calling the US number from Singapore by using different service providers
3770   // 1st test: calling using SingTel IDD service (IDD is 001)
3771   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3772             phone_util_.Parse("0011-650-333-6000",
3773                               RegionCode::SG(), &test_number));
3774   EXPECT_EQ(us_number, test_number);
3775   // 2nd test: calling using StarHub IDD service (IDD is 008)
3776   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3777             phone_util_.Parse("0081-650-333-6000",
3778                               RegionCode::SG(), &test_number));
3779   EXPECT_EQ(us_number, test_number);
3780   // 3rd test: calling using SingTel V019 service (IDD is 019)
3781   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3782             phone_util_.Parse("0191-650-333-6000",
3783                               RegionCode::SG(), &test_number));
3784   EXPECT_EQ(us_number, test_number);
3785   // Calling the US number from Poland
3786   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3787             phone_util_.Parse("0~01-650-333-6000",
3788                               RegionCode::PL(), &test_number));
3789   EXPECT_EQ(us_number, test_number);
3790 
3791   // Using "++" at the start.
3792   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3793             phone_util_.Parse("++1 (650) 333-6000",
3794                               RegionCode::PL(), &test_number));
3795   EXPECT_EQ(us_number, test_number);
3796   // Using a full-width plus sign.
3797   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3798             phone_util_.Parse("\xEF\xBC\x8B" "1 (650) 333-6000",
3799                               /* "+1 (650) 333-6000" */
3800                               RegionCode::SG(), &test_number));
3801   EXPECT_EQ(us_number, test_number);
3802   // Using a soft hyphen U+00AD.
3803   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3804             phone_util_.Parse("1 (650) 333" "\xC2\xAD" "-6000",
3805                               /* "1 (650) 333­-6000­" */
3806                               RegionCode::US(), &test_number));
3807   EXPECT_EQ(us_number, test_number);
3808   // The whole number, including punctuation, is here represented in full-width
3809   // form.
3810   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3811             phone_util_.Parse("\xEF\xBC\x8B\xEF\xBC\x91\xE3\x80\x80\xEF\xBC\x88"
3812                               "\xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90\xEF\xBC\x89"
3813                               "\xE3\x80\x80\xEF\xBC\x93\xEF\xBC\x93\xEF\xBC\x93"
3814                               "\xEF\xBC\x8D\xEF\xBC\x96\xEF\xBC\x90\xEF\xBC\x90"
3815                               "\xEF\xBC\x90",
3816                               /* "+1 (650) 333-6000" */
3817                               RegionCode::SG(), &test_number));
3818   EXPECT_EQ(us_number, test_number);
3819 
3820   // Using the U+30FC dash.
3821   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3822             phone_util_.Parse("\xEF\xBC\x8B\xEF\xBC\x91\xE3\x80\x80\xEF\xBC\x88"
3823                               "\xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90\xEF\xBC\x89"
3824                               "\xE3\x80\x80\xEF\xBC\x93\xEF\xBC\x93\xEF\xBC\x93"
3825                               "\xE3\x83\xBC\xEF\xBC\x96\xEF\xBC\x90\xEF\xBC\x90"
3826                               "\xEF\xBC\x90",
3827                               /* "+1 (650) 333ー6000" */
3828                               RegionCode::SG(), &test_number));
3829   EXPECT_EQ(us_number, test_number);
3830 
3831   PhoneNumber toll_free_number;
3832   toll_free_number.set_country_code(800);
3833   toll_free_number.set_national_number(uint64{12345678});
3834   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3835             phone_util_.Parse("011 800 1234 5678",
3836                               RegionCode::US(), &test_number));
3837   EXPECT_EQ(toll_free_number, test_number);
3838 }
3839 
TEST_F(PhoneNumberUtilTest,ParseWithLeadingZero)3840 TEST_F(PhoneNumberUtilTest, ParseWithLeadingZero) {
3841   PhoneNumber it_number;
3842   it_number.set_country_code(39);
3843   it_number.set_national_number(uint64{236618300});
3844   it_number.set_italian_leading_zero(true);
3845   PhoneNumber test_number;
3846   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3847             phone_util_.Parse("+39 02-36618 300",
3848                               RegionCode::NZ(), &test_number));
3849   EXPECT_EQ(it_number, test_number);
3850   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3851             phone_util_.Parse("02-36618 300", RegionCode::IT(), &test_number));
3852   EXPECT_EQ(it_number, test_number);
3853 
3854   it_number.Clear();
3855   it_number.set_country_code(39);
3856   it_number.set_national_number(uint64{312345678});
3857   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3858             phone_util_.Parse("312 345 678", RegionCode::IT(), &test_number));
3859   EXPECT_EQ(it_number, test_number);
3860 }
3861 
TEST_F(PhoneNumberUtilTest,ParseNationalNumberArgentina)3862 TEST_F(PhoneNumberUtilTest, ParseNationalNumberArgentina) {
3863   // Test parsing mobile numbers of Argentina.
3864   PhoneNumber ar_number;
3865   ar_number.set_country_code(54);
3866   ar_number.set_national_number(uint64{93435551212});
3867   PhoneNumber test_number;
3868   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3869             phone_util_.Parse("+54 9 343 555 1212", RegionCode::AR(),
3870                               &test_number));
3871   EXPECT_EQ(ar_number, test_number);
3872   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3873             phone_util_.Parse("0343 15 555 1212", RegionCode::AR(),
3874                               &test_number));
3875   EXPECT_EQ(ar_number, test_number);
3876 
3877   ar_number.set_national_number(uint64{93715654320});
3878   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3879             phone_util_.Parse("+54 9 3715 65 4320", RegionCode::AR(),
3880                               &test_number));
3881   EXPECT_EQ(ar_number, test_number);
3882   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3883             phone_util_.Parse("03715 15 65 4320", RegionCode::AR(),
3884                               &test_number));
3885   EXPECT_EQ(ar_number, test_number);
3886 
3887   // Test parsing fixed-line numbers of Argentina.
3888   ar_number.set_national_number(uint64{1137970000});
3889   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3890             phone_util_.Parse("+54 11 3797 0000", RegionCode::AR(),
3891                               &test_number));
3892   EXPECT_EQ(ar_number, test_number);
3893   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3894             phone_util_.Parse("011 3797 0000", RegionCode::AR(), &test_number));
3895   EXPECT_EQ(ar_number, test_number);
3896 
3897   ar_number.set_national_number(uint64{3715654321});
3898   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3899             phone_util_.Parse("+54 3715 65 4321", RegionCode::AR(),
3900                               &test_number));
3901   EXPECT_EQ(ar_number, test_number);
3902   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3903             phone_util_.Parse("03715 65 4321", RegionCode::AR(), &test_number));
3904   EXPECT_EQ(ar_number, test_number);
3905 
3906   ar_number.set_national_number(uint64{2312340000});
3907   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3908             phone_util_.Parse("+54 23 1234 0000", RegionCode::AR(),
3909                               &test_number));
3910   EXPECT_EQ(ar_number, test_number);
3911   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3912             phone_util_.Parse("023 1234 0000", RegionCode::AR(), &test_number));
3913   EXPECT_EQ(ar_number, test_number);
3914 }
3915 
TEST_F(PhoneNumberUtilTest,ParseWithXInNumber)3916 TEST_F(PhoneNumberUtilTest, ParseWithXInNumber) {
3917   // Test that having an 'x' in the phone number at the start is ok and that it
3918   // just gets removed.
3919   PhoneNumber ar_number;
3920   ar_number.set_country_code(54);
3921   ar_number.set_national_number(uint64{123456789});
3922   PhoneNumber test_number;
3923   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3924             phone_util_.Parse("0123456789", RegionCode::AR(), &test_number));
3925   EXPECT_EQ(ar_number, test_number);
3926   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3927             phone_util_.Parse("(0) 123456789", RegionCode::AR(), &test_number));
3928   EXPECT_EQ(ar_number, test_number);
3929   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3930             phone_util_.Parse("0 123456789", RegionCode::AR(), &test_number));
3931   EXPECT_EQ(ar_number, test_number);
3932   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3933             phone_util_.Parse("(0xx) 123456789", RegionCode::AR(),
3934                               &test_number));
3935   EXPECT_EQ(ar_number, test_number);
3936 
3937   PhoneNumber ar_from_us;
3938   ar_from_us.set_country_code(54);
3939   ar_from_us.set_national_number(uint64{81429712});
3940   // This test is intentionally constructed such that the number of digit after
3941   // xx is larger than 7, so that the number won't be mistakenly treated as an
3942   // extension, as we allow extensions up to 7 digits. This assumption is okay
3943   // for now as all the countries where a carrier selection code is written in
3944   // the form of xx have a national significant number of length larger than 7.
3945   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3946             phone_util_.Parse("011xx5481429712", RegionCode::US(),
3947                               &test_number));
3948   EXPECT_EQ(ar_from_us, test_number);
3949 }
3950 
TEST_F(PhoneNumberUtilTest,ParseNumbersMexico)3951 TEST_F(PhoneNumberUtilTest, ParseNumbersMexico) {
3952   // Test parsing fixed-line numbers of Mexico.
3953   PhoneNumber mx_number;
3954 
3955   mx_number.set_country_code(52);
3956   mx_number.set_national_number(uint64{4499780001});
3957   PhoneNumber test_number;
3958   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3959             phone_util_.Parse("+52 (449)978-0001", RegionCode::MX(),
3960                               &test_number));
3961   EXPECT_EQ(mx_number, test_number);
3962   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3963             phone_util_.Parse("01 (449)978-0001", RegionCode::MX(),
3964                               &test_number));
3965   EXPECT_EQ(mx_number, test_number);
3966   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3967             phone_util_.Parse("(449)978-0001", RegionCode::MX(),
3968                               &test_number));
3969   EXPECT_EQ(mx_number, test_number);
3970 
3971   // Test parsing mobile numbers of Mexico.
3972   mx_number.Clear();
3973   mx_number.set_country_code(52);
3974   mx_number.set_national_number(uint64{13312345678});
3975   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3976             phone_util_.Parse("+52 1 33 1234-5678", RegionCode::MX(),
3977                               &test_number));
3978   EXPECT_EQ(mx_number, test_number);
3979   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3980             phone_util_.Parse("044 (33) 1234-5678", RegionCode::MX(),
3981                               &test_number));
3982   EXPECT_EQ(mx_number, test_number);
3983   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
3984             phone_util_.Parse("045 33 1234-5678", RegionCode::MX(),
3985                               &test_number));
3986   EXPECT_EQ(mx_number, test_number);
3987 }
3988 
TEST_F(PhoneNumberUtilTest,FailedParseOnInvalidNumbers)3989 TEST_F(PhoneNumberUtilTest, FailedParseOnInvalidNumbers) {
3990   PhoneNumber test_number;
3991   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
3992             phone_util_.Parse("This is not a phone number", RegionCode::NZ(),
3993                               &test_number));
3994   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
3995 
3996   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
3997             phone_util_.Parse("1 Still not a number", RegionCode::NZ(),
3998                               &test_number));
3999   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4000 
4001   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4002             phone_util_.Parse("1 MICROSOFT", RegionCode::NZ(),
4003                               &test_number));
4004   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4005 
4006   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4007             phone_util_.Parse("12 MICROSOFT", RegionCode::NZ(),
4008                               &test_number));
4009   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4010 
4011   EXPECT_EQ(PhoneNumberUtil::TOO_LONG_NSN,
4012             phone_util_.Parse("01495 72553301873 810104", RegionCode::GB(),
4013                               &test_number));
4014   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4015 
4016   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4017             phone_util_.Parse("+---", RegionCode::DE(),
4018                               &test_number));
4019   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4020 
4021   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4022             phone_util_.Parse("+***", RegionCode::DE(),
4023                               &test_number));
4024   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4025 
4026   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4027             phone_util_.Parse("+*******91", RegionCode::DE(),
4028                               &test_number));
4029   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4030 
4031   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_NSN,
4032             phone_util_.Parse("+49 0", RegionCode::DE(),
4033                               &test_number));
4034   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4035 
4036   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
4037             phone_util_.Parse("+210 3456 56789", RegionCode::NZ(),
4038                               &test_number));
4039   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4040 
4041   // 00 is a correct IDD, but 210 is not a valid country code.
4042   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
4043             phone_util_.Parse("+ 00 210 3 331 6005", RegionCode::NZ(),
4044                               &test_number));
4045   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4046 
4047   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
4048             phone_util_.Parse("123 456 7890", RegionCode::GetUnknown(),
4049                               &test_number));
4050   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4051 
4052   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
4053             phone_util_.Parse("123 456 7890", RegionCode::CS(),
4054                               &test_number));
4055   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4056 
4057   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD,
4058             phone_util_.Parse("0044-----", RegionCode::GB(),
4059                               &test_number));
4060   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4061   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD,
4062             phone_util_.Parse("0044", RegionCode::GB(),
4063                               &test_number));
4064   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4065 
4066   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD,
4067             phone_util_.Parse("011", RegionCode::US(),
4068                               &test_number));
4069   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4070   EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD,
4071             phone_util_.Parse("0119", RegionCode::US(),
4072                               &test_number));
4073   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4074 
4075   // RFC3966 phone-context is a website.
4076   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
4077             phone_util_.Parse("tel:555-1234;phone-context=www.google.com",
4078                               RegionCode::ZZ(), &test_number));
4079   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4080   // This is invalid because no "+" sign is present as part of phone-context.
4081   // This should not succeed in being parsed.
4082   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
4083             phone_util_.Parse("tel:555-1234;phone-context=1-331",
4084                               RegionCode::ZZ(), &test_number));
4085   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4086 
4087   // Only the phone-context symbol is present, but no data.
4088   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4089             phone_util_.Parse(";phone-context=",
4090                               RegionCode::ZZ(), &test_number));
4091   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4092 }
4093 
TEST_F(PhoneNumberUtilTest,ParseNumbersWithPlusWithNoRegion)4094 TEST_F(PhoneNumberUtilTest, ParseNumbersWithPlusWithNoRegion) {
4095   PhoneNumber nz_number;
4096   nz_number.set_country_code(64);
4097   nz_number.set_national_number(uint64{33316005});
4098   // RegionCode::GetUnknown() is allowed only if the number starts with a '+' -
4099   // then the country code can be calculated.
4100   PhoneNumber result_proto;
4101   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4102             phone_util_.Parse("+64 3 331 6005", RegionCode::GetUnknown(),
4103                               &result_proto));
4104   EXPECT_EQ(nz_number, result_proto);
4105 
4106   // Test with full-width plus.
4107   result_proto.Clear();
4108   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4109             phone_util_.Parse("\xEF\xBC\x8B" "64 3 331 6005",
4110                               /* "+64 3 331 6005" */
4111                               RegionCode::GetUnknown(), &result_proto));
4112   EXPECT_EQ(nz_number, result_proto);
4113   // Test with normal plus but leading characters that need to be stripped.
4114   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4115             phone_util_.Parse("  +64 3 331 6005", RegionCode::GetUnknown(),
4116                               &result_proto));
4117   EXPECT_EQ(nz_number, result_proto);
4118 
4119   PhoneNumber toll_free_number;
4120   toll_free_number.set_country_code(800);
4121   toll_free_number.set_national_number(uint64{12345678});
4122   result_proto.Clear();
4123   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4124             phone_util_.Parse("+800 1234 5678",
4125                               RegionCode::GetUnknown(), &result_proto));
4126   EXPECT_EQ(toll_free_number, result_proto);
4127 
4128   PhoneNumber universal_premium_rate;
4129   universal_premium_rate.set_country_code(979);
4130   universal_premium_rate.set_national_number(uint64{123456789});
4131   result_proto.Clear();
4132   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4133             phone_util_.Parse("+979 123 456 789",
4134                               RegionCode::GetUnknown(), &result_proto));
4135   EXPECT_EQ(universal_premium_rate, result_proto);
4136 
4137   result_proto.Clear();
4138   // Test parsing RFC3966 format with a phone context.
4139   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4140             phone_util_.Parse("tel:03-331-6005;phone-context=+64",
4141                               RegionCode::GetUnknown(), &result_proto));
4142   EXPECT_EQ(nz_number, result_proto);
4143   result_proto.Clear();
4144   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4145             phone_util_.Parse("  tel:03-331-6005;phone-context=+64",
4146                               RegionCode::GetUnknown(), &result_proto));
4147   EXPECT_EQ(nz_number, result_proto);
4148   result_proto.Clear();
4149   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4150             phone_util_.Parse("tel:03-331-6005;isub=12345;phone-context=+64",
4151                               RegionCode::GetUnknown(), &result_proto));
4152   EXPECT_EQ(nz_number, result_proto);
4153 
4154   nz_number.set_raw_input("+64 3 331 6005");
4155   nz_number.set_country_code_source(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN);
4156   result_proto.Clear();
4157   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4158             phone_util_.ParseAndKeepRawInput("+64 3 331 6005",
4159                                              RegionCode::GetUnknown(),
4160                                              &result_proto));
4161   EXPECT_EQ(nz_number, result_proto);
4162 }
4163 
TEST_F(PhoneNumberUtilTest,ParseNumberTooShortIfNationalPrefixStripped)4164 TEST_F(PhoneNumberUtilTest, ParseNumberTooShortIfNationalPrefixStripped) {
4165   PhoneNumber test_number;
4166 
4167   // Test that a number whose first digits happen to coincide with the national
4168   // prefix does not get them stripped if doing so would result in a number too
4169   // short to be a possible (regular length) phone number for that region.
4170   PhoneNumber by_number;
4171   by_number.set_country_code(375);
4172   by_number.set_national_number(8123L);
4173   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4174             phone_util_.Parse("8123", RegionCode::BY(),
4175                               &test_number));
4176   EXPECT_EQ(by_number, test_number);
4177   by_number.set_national_number(81234L);
4178   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4179             phone_util_.Parse("81234", RegionCode::BY(),
4180                               &test_number));
4181   EXPECT_EQ(by_number, test_number);
4182 
4183   // The prefix doesn't get stripped, since the input is a viable 6-digit
4184   // number, whereas the result of stripping is only 5 digits.
4185   by_number.set_national_number(812345L);
4186   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4187             phone_util_.Parse("812345", RegionCode::BY(),
4188                               &test_number));
4189   EXPECT_EQ(by_number, test_number);
4190 
4191   // The prefix gets stripped, since only 6-digit numbers are possible.
4192   by_number.set_national_number(123456L);
4193   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4194             phone_util_.Parse("8123456", RegionCode::BY(),
4195                               &test_number));
4196   EXPECT_EQ(by_number, test_number);
4197 }
4198 
TEST_F(PhoneNumberUtilTest,ParseExtensions)4199 TEST_F(PhoneNumberUtilTest, ParseExtensions) {
4200   PhoneNumber nz_number;
4201   nz_number.set_country_code(64);
4202   nz_number.set_national_number(uint64{33316005});
4203   nz_number.set_extension("3456");
4204   PhoneNumber test_number;
4205   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4206             phone_util_.Parse("03 331 6005 ext 3456", RegionCode::NZ(),
4207                               &test_number));
4208   EXPECT_EQ(nz_number, test_number);
4209   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4210             phone_util_.Parse("03 331 6005x3456", RegionCode::NZ(),
4211                               &test_number));
4212   EXPECT_EQ(nz_number, test_number);
4213   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4214             phone_util_.Parse("03-331 6005 int.3456", RegionCode::NZ(),
4215                               &test_number));
4216   EXPECT_EQ(nz_number, test_number);
4217   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4218             phone_util_.Parse("03 331 6005 #3456", RegionCode::NZ(),
4219                               &test_number));
4220   EXPECT_EQ(nz_number, test_number);
4221 
4222   // Test the following do not extract extensions:
4223   PhoneNumber non_extn_number;
4224   non_extn_number.set_country_code(1);
4225   non_extn_number.set_national_number(uint64{80074935247});
4226   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4227             phone_util_.Parse("1800 six-flags", RegionCode::US(),
4228                               &test_number));
4229   EXPECT_EQ(non_extn_number, test_number);
4230   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4231             phone_util_.Parse("1800 SIX-FLAGS", RegionCode::US(),
4232                               &test_number));
4233   EXPECT_EQ(non_extn_number, test_number);
4234   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4235             phone_util_.Parse("0~0 1800 7493 5247", RegionCode::PL(),
4236                               &test_number));
4237   EXPECT_EQ(non_extn_number, test_number);
4238   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4239             phone_util_.Parse("(1800) 7493.5247", RegionCode::US(),
4240                               &test_number));
4241   EXPECT_EQ(non_extn_number, test_number);
4242 
4243   // Check that the last instance of an extension token is matched.
4244   PhoneNumber extn_number;
4245   extn_number.set_country_code(1);
4246   extn_number.set_national_number(uint64{80074935247});
4247   extn_number.set_extension("1234");
4248   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4249             phone_util_.Parse("0~0 1800 7493 5247 ~1234", RegionCode::PL(),
4250                               &test_number));
4251   EXPECT_EQ(extn_number, test_number);
4252 
4253   // Verifying bug-fix where the last digit of a number was previously omitted
4254   // if it was a 0 when extracting the extension. Also verifying a few different
4255   // cases of extensions.
4256   PhoneNumber uk_number;
4257   uk_number.set_country_code(44);
4258   uk_number.set_national_number(uint64{2034567890});
4259   uk_number.set_extension("456");
4260   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4261             phone_util_.Parse("+44 2034567890x456", RegionCode::NZ(),
4262                               &test_number));
4263   EXPECT_EQ(uk_number, test_number);
4264   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4265             phone_util_.Parse("+44 2034567890x456", RegionCode::GB(),
4266                               &test_number));
4267   EXPECT_EQ(uk_number, test_number);
4268   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4269             phone_util_.Parse("+44 2034567890 x456", RegionCode::GB(),
4270                               &test_number));
4271   EXPECT_EQ(uk_number, test_number);
4272   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4273             phone_util_.Parse("+44 2034567890 X456", RegionCode::GB(),
4274                               &test_number));
4275   EXPECT_EQ(uk_number, test_number);
4276   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4277             phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(),
4278                               &test_number));
4279   EXPECT_EQ(uk_number, test_number);
4280   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4281             phone_util_.Parse("+44 2034567890 X   456", RegionCode::GB(),
4282                               &test_number));
4283   EXPECT_EQ(uk_number, test_number);
4284   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4285             phone_util_.Parse("+44 2034567890 x 456  ", RegionCode::GB(),
4286                               &test_number));
4287   EXPECT_EQ(uk_number, test_number);
4288   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4289             phone_util_.Parse("+44 2034567890  X 456", RegionCode::GB(),
4290                               &test_number));
4291   EXPECT_EQ(uk_number, test_number);
4292   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4293             phone_util_.Parse("+44-2034567890;ext=456", RegionCode::GB(),
4294                               &test_number));
4295   EXPECT_EQ(uk_number, test_number);
4296   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4297             phone_util_.Parse("tel:2034567890;ext=456;phone-context=+44",
4298                               RegionCode::ZZ(), &test_number));
4299   EXPECT_EQ(uk_number, test_number);
4300 
4301   // Full-width extension, "extn" only.
4302   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4303             phone_util_.Parse(
4304                 "+442034567890\xEF\xBD\x85\xEF\xBD\x98\xEF\xBD\x94\xEF\xBD\x8E"
4305                 "456", RegionCode::GB(), &test_number));
4306   EXPECT_EQ(uk_number, test_number);
4307   // "xtn" only.
4308   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4309             phone_util_.Parse(
4310                 "+44-2034567890\xEF\xBD\x98\xEF\xBD\x94\xEF\xBD\x8E""456",
4311                 RegionCode::GB(), &test_number));
4312   EXPECT_EQ(uk_number, test_number);
4313   // "xt" only.
4314   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4315             phone_util_.Parse("+44-2034567890\xEF\xBD\x98\xEF\xBD\x94""456",
4316                               RegionCode::GB(), &test_number));
4317   EXPECT_EQ(uk_number, test_number);
4318 
4319   PhoneNumber us_with_extension;
4320   us_with_extension.set_country_code(1);
4321   us_with_extension.set_national_number(uint64{8009013355});
4322   us_with_extension.set_extension("7246433");
4323   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4324             phone_util_.Parse("(800) 901-3355 x 7246433", RegionCode::US(),
4325                               &test_number));
4326   EXPECT_EQ(us_with_extension, test_number);
4327   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4328             phone_util_.Parse("(800) 901-3355 , ext 7246433", RegionCode::US(),
4329                               &test_number));
4330   EXPECT_EQ(us_with_extension, test_number);
4331   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4332             phone_util_.Parse("(800) 901-3355 ; 7246433", RegionCode::US(),
4333                               &test_number));
4334   EXPECT_EQ(us_with_extension, test_number);
4335   // To test an extension character without surrounding spaces.
4336   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4337             phone_util_.Parse("(800) 901-3355;7246433", RegionCode::US(),
4338                               &test_number));
4339   EXPECT_EQ(us_with_extension, test_number);
4340   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4341             phone_util_.Parse("(800) 901-3355 ,extension 7246433",
4342                               RegionCode::US(),
4343                               &test_number));
4344   EXPECT_EQ(us_with_extension, test_number);
4345   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4346             phone_util_.Parse("(800) 901-3355 ,extensi\xC3\xB3n 7246433",
4347                               /* "(800) 901-3355 ,extensión 7246433" */
4348                               RegionCode::US(),
4349                               &test_number));
4350   EXPECT_EQ(us_with_extension, test_number);
4351   // Repeat with the small letter o with acute accent created by combining
4352   // characters.
4353   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4354             phone_util_.Parse("(800) 901-3355 ,extensio\xCC\x81n 7246433",
4355                               /* "(800) 901-3355 ,extensión 7246433" */
4356                               RegionCode::US(),
4357                               &test_number));
4358   EXPECT_EQ(us_with_extension, test_number);
4359   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4360             phone_util_.Parse("(800) 901-3355 , 7246433", RegionCode::US(),
4361                               &test_number));
4362   EXPECT_EQ(us_with_extension, test_number);
4363   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4364             phone_util_.Parse("(800) 901-3355 ext: 7246433", RegionCode::US(),
4365                               &test_number));
4366   EXPECT_EQ(us_with_extension, test_number);
4367   // Testing Russian extension "доб" with variants found onli
4368   PhoneNumber ru_with_extension;
4369   ru_with_extension.set_country_code(7);
4370   ru_with_extension.set_national_number(4232022511L);
4371   ru_with_extension.set_extension("100");
4372   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4373             phone_util_.Parse(
4374                 "8 (423) 202-25-11, \xd0\xb4\xd0\xbe\xd0\xb1. 100",
4375                 RegionCode::RU(), &test_number));
4376   EXPECT_EQ(ru_with_extension, test_number);
4377   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4378             phone_util_.Parse(
4379                 "8 (423) 202-25-11 \xd0\xb4\xd0\xbe\xd0\xb1. 100",
4380                 RegionCode::RU(), &test_number));
4381   EXPECT_EQ(ru_with_extension, test_number);
4382   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4383             phone_util_.Parse(
4384                 "8 (423) 202-25-11, \xd0\xb4\xd0\xbe\xd0\xb1 100",
4385                 RegionCode::RU(), &test_number));
4386   EXPECT_EQ(ru_with_extension, test_number);
4387   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4388             phone_util_.Parse(
4389                 "8 (423) 202-25-11 \xd0\xb4\xd0\xbe\xd0\xb1 100",
4390                 RegionCode::RU(), &test_number));
4391   EXPECT_EQ(ru_with_extension, test_number);
4392   // We are suppose to test input without spaces before and after this extension
4393   // character. As hex escape sequence becomes out of range, postfixed a space
4394   // to extension character here.
4395   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4396             phone_util_.Parse(
4397                 "8 (423) 202-25-11\xd0\xb4\xd0\xbe\xd0\xb1 100",
4398                 RegionCode::RU(), &test_number));
4399   // In upper case
4400   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4401             phone_util_.Parse(
4402                 "8 (423) 202-25-11 \xd0\x94\xd0\x9e\xd0\x91 100",
4403                 RegionCode::RU(), &test_number));
4404   EXPECT_EQ(ru_with_extension, test_number);
4405 
4406   // Test that if a number has two extensions specified, we ignore the second.
4407   PhoneNumber us_with_two_extensions_number;
4408   us_with_two_extensions_number.set_country_code(1);
4409   us_with_two_extensions_number.set_national_number(uint64{2121231234});
4410   us_with_two_extensions_number.set_extension("508");
4411   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4412             phone_util_.Parse("(212)123-1234 x508/x1234", RegionCode::US(),
4413                               &test_number));
4414   EXPECT_EQ(us_with_two_extensions_number, test_number);
4415   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4416             phone_util_.Parse("(212)123-1234 x508/ x1234", RegionCode::US(),
4417                               &test_number));
4418   EXPECT_EQ(us_with_two_extensions_number, test_number);
4419   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4420             phone_util_.Parse("(212)123-1234 x508\\x1234", RegionCode::US(),
4421                               &test_number));
4422   EXPECT_EQ(us_with_two_extensions_number, test_number);
4423 
4424   // Test parsing numbers in the form (645) 123-1234-910# works, where the last
4425   // 3 digits before the # are an extension.
4426   us_with_extension.Clear();
4427   us_with_extension.set_country_code(1);
4428   us_with_extension.set_national_number(uint64{6451231234});
4429   us_with_extension.set_extension("910");
4430   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4431             phone_util_.Parse("+1 (645) 123 1234-910#", RegionCode::US(),
4432                               &test_number));
4433   EXPECT_EQ(us_with_extension, test_number);
4434 }
4435 
TEST_F(PhoneNumberUtilTest,TestParseHandlesLongExtensionsWithExplicitLabels)4436 TEST_F(PhoneNumberUtilTest, TestParseHandlesLongExtensionsWithExplicitLabels) {
4437   // Test lower and upper limits of extension lengths for each type of label.
4438   PhoneNumber nz_number;
4439   nz_number.set_country_code(64);
4440   nz_number.set_national_number(33316005ULL);
4441   PhoneNumber test_number;
4442 
4443   // Firstly, when in RFC format: ext_limit_after_explicit_label
4444   nz_number.set_extension("0");
4445   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4446             phone_util_.Parse("tel:+6433316005;ext=0", RegionCode::NZ(),
4447                               &test_number));
4448   EXPECT_EQ(nz_number, test_number);
4449 
4450   nz_number.set_extension("01234567890123456789");
4451   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4452             phone_util_.Parse("tel:+6433316005;ext=01234567890123456789",
4453                               RegionCode::NZ(), &test_number));
4454   EXPECT_EQ(nz_number, test_number);
4455 
4456   // Extension too long.
4457   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4458             phone_util_.Parse("tel:+6433316005;ext=012345678901234567890",
4459                               RegionCode::NZ(), &test_number));
4460 
4461   // Explicit extension label: ext_limit_after_explicit_label
4462   nz_number.set_extension("1");
4463   EXPECT_EQ(
4464       PhoneNumberUtil::NO_PARSING_ERROR,
4465       phone_util_.Parse("03 3316005ext:1", RegionCode::NZ(), &test_number));
4466   EXPECT_EQ(nz_number, test_number);
4467 
4468   nz_number.set_extension("12345678901234567890");
4469   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4470             phone_util_.Parse("03 3316005 xtn:12345678901234567890",
4471                               RegionCode::NZ(), &test_number));
4472   EXPECT_EQ(nz_number, test_number);
4473 
4474   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4475             phone_util_.Parse("03 3316005 extension\t12345678901234567890",
4476                               RegionCode::NZ(), &test_number));
4477   EXPECT_EQ(nz_number, test_number);
4478 
4479   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4480             phone_util_.Parse("03 3316005 xtensio:12345678901234567890",
4481                               RegionCode::NZ(), &test_number));
4482   EXPECT_EQ(nz_number, test_number);
4483 
4484   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4485             phone_util_.Parse("03 3316005 xtensión, 12345678901234567890#",
4486                               RegionCode::NZ(), &test_number));
4487   EXPECT_EQ(nz_number, test_number);
4488 
4489   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4490             phone_util_.Parse("03 3316005extension.12345678901234567890",
4491                               RegionCode::NZ(), &test_number));
4492   EXPECT_EQ(nz_number, test_number);
4493 
4494   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4495             phone_util_.Parse("03 3316005 доб:12345678901234567890",
4496                               RegionCode::NZ(), &test_number));
4497   EXPECT_EQ(nz_number, test_number);
4498 
4499   // Extension too long.
4500   EXPECT_EQ(PhoneNumberUtil::TOO_LONG_NSN,
4501             phone_util_.Parse("03 3316005 extension 123456789012345678901",
4502                               RegionCode::NZ(), &test_number));
4503 }
4504 
TEST_F(PhoneNumberUtilTest,TestParseHandlesLongExtensionsWithAutoDiallingLabels)4505 TEST_F(PhoneNumberUtilTest,
4506        TestParseHandlesLongExtensionsWithAutoDiallingLabels) {
4507   // Secondly, cases of auto-dialling and other standard extension labels:
4508   // ext_limit_after_likely_label
4509   PhoneNumber us_number_user_input;
4510   us_number_user_input.set_country_code(1);
4511   us_number_user_input.set_national_number(2679000000ULL);
4512   PhoneNumber test_number;
4513   us_number_user_input.set_extension("123456789012345");
4514 
4515   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4516             phone_util_.Parse("+12679000000,,123456789012345#",
4517                               RegionCode::US(), &test_number));
4518   EXPECT_EQ(us_number_user_input, test_number);
4519 
4520   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4521             phone_util_.Parse("+12679000000;123456789012345#", RegionCode::US(),
4522                               &test_number));
4523   EXPECT_EQ(us_number_user_input, test_number);
4524 
4525   PhoneNumber uk_number_user_input;
4526   uk_number_user_input.set_country_code(44);
4527   uk_number_user_input.set_national_number(2034000000ULL);
4528   uk_number_user_input.set_extension("123456789");
4529 
4530   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4531             phone_util_.Parse("+442034000000,,123456789#", RegionCode::GB(),
4532                               &test_number));
4533 
4534   // Extension too long.
4535   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4536             phone_util_.Parse("+12679000000,,1234567890123456#",
4537                               RegionCode::US(), &test_number));
4538 }
4539 
TEST_F(PhoneNumberUtilTest,TestParseHandlesShortExtensionsWithAmbiguousChar)4540 TEST_F(PhoneNumberUtilTest, TestParseHandlesShortExtensionsWithAmbiguousChar) {
4541   // Thirdly, for single and non-standard cases: ext_limit_after_ambiguous_char
4542   PhoneNumber nz_number;
4543   nz_number.set_country_code(64);
4544   nz_number.set_national_number(33316005ULL);
4545   PhoneNumber test_number;
4546   nz_number.set_extension("123456789");//
4547 
4548   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4549             phone_util_.Parse("03 3316005 x 123456789", RegionCode::NZ(),
4550                               &test_number));
4551   EXPECT_EQ(nz_number, test_number);
4552 
4553   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4554             phone_util_.Parse("03 3316005 x. 123456789", RegionCode::NZ(),
4555                               &test_number));
4556   EXPECT_EQ(nz_number, test_number);
4557 
4558   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4559             phone_util_.Parse("03 3316005 #123456789#", RegionCode::NZ(),
4560                               &test_number));
4561   EXPECT_EQ(nz_number, test_number);
4562 
4563   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4564             phone_util_.Parse("03 3316005 ~ 123456789", RegionCode::NZ(),
4565                               &test_number));
4566   EXPECT_EQ(nz_number, test_number);
4567 
4568   EXPECT_EQ(PhoneNumberUtil::TOO_LONG_NSN,
4569             phone_util_.Parse("03 3316005 ~ 1234567890", RegionCode::NZ(),
4570                               &test_number));
4571 }
4572 
TEST_F(PhoneNumberUtilTest,TestParseHandlesShortExtensionsWhenNotSureOfLabel)4573 TEST_F(PhoneNumberUtilTest, TestParseHandlesShortExtensionsWhenNotSureOfLabel) {
4574   // Thirdly, when no explicit extension label present, but denoted by
4575   // tailing #: ext_limit_when_not_sure
4576   PhoneNumber us_number;
4577   us_number.set_country_code(1);
4578   us_number.set_national_number(1234567890ULL);
4579   PhoneNumber test_number;
4580   us_number.set_extension("666666");
4581 
4582   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4583             phone_util_.Parse("+1123-456-7890 666666#", RegionCode::US(),
4584                               &test_number));
4585   EXPECT_EQ(us_number, test_number);
4586 
4587   us_number.set_extension("6");
4588   EXPECT_EQ(
4589       PhoneNumberUtil::NO_PARSING_ERROR,
4590       phone_util_.Parse("+11234567890-6#", RegionCode::US(), &test_number));
4591   EXPECT_EQ(us_number, test_number);
4592 
4593   // Extension too long.
4594   EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
4595             phone_util_.Parse("+1123-456-7890 7777777#", RegionCode::US(),
4596                               &test_number));
4597 }
4598 
TEST_F(PhoneNumberUtilTest,ParseAndKeepRaw)4599 TEST_F(PhoneNumberUtilTest, ParseAndKeepRaw) {
4600   PhoneNumber alpha_numeric_number;
4601   alpha_numeric_number.set_country_code(1);
4602   alpha_numeric_number.set_national_number(uint64{80074935247});
4603   alpha_numeric_number.set_raw_input("800 six-flags");
4604   alpha_numeric_number.set_country_code_source(
4605       PhoneNumber::FROM_DEFAULT_COUNTRY);
4606 
4607   PhoneNumber test_number;
4608   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4609             phone_util_.ParseAndKeepRawInput("800 six-flags", RegionCode::US(),
4610                                              &test_number));
4611   EXPECT_EQ(alpha_numeric_number, test_number);
4612 
4613   alpha_numeric_number.set_national_number(uint64{8007493524});
4614   alpha_numeric_number.set_raw_input("1800 six-flag");
4615   alpha_numeric_number.set_country_code_source(
4616       PhoneNumber::FROM_NUMBER_WITHOUT_PLUS_SIGN);
4617   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4618             phone_util_.ParseAndKeepRawInput("1800 six-flag", RegionCode::US(),
4619                                              &test_number));
4620   EXPECT_EQ(alpha_numeric_number, test_number);
4621 
4622   alpha_numeric_number.set_raw_input("+1800 six-flag");
4623   alpha_numeric_number.set_country_code_source(
4624       PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN);
4625   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4626             phone_util_.ParseAndKeepRawInput("+1800 six-flag", RegionCode::CN(),
4627                                              &test_number));
4628   EXPECT_EQ(alpha_numeric_number, test_number);
4629 
4630   alpha_numeric_number.set_raw_input("001800 six-flag");
4631   alpha_numeric_number.set_country_code_source(
4632       PhoneNumber::FROM_NUMBER_WITH_IDD);
4633   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4634             phone_util_.ParseAndKeepRawInput("001800 six-flag",
4635                                              RegionCode::NZ(),
4636                                              &test_number));
4637   EXPECT_EQ(alpha_numeric_number, test_number);
4638 
4639   // Try with invalid region - expect failure. We clear the test number first
4640   // because if parsing isn't successful, the number parsed in won't be changed.
4641   test_number.Clear();
4642   EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
4643             phone_util_.Parse("123 456 7890", RegionCode::CS(), &test_number));
4644   EXPECT_EQ(PhoneNumber::default_instance(), test_number);
4645 
4646   PhoneNumber korean_number;
4647   korean_number.set_country_code(82);
4648   korean_number.set_national_number(22123456);
4649   korean_number.set_raw_input("08122123456");
4650   korean_number.set_country_code_source(PhoneNumber::FROM_DEFAULT_COUNTRY);
4651   korean_number.set_preferred_domestic_carrier_code("81");
4652   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4653             phone_util_.ParseAndKeepRawInput("08122123456",
4654                                              RegionCode::KR(),
4655                                              &test_number));
4656   EXPECT_EQ(korean_number, test_number);
4657 }
4658 
TEST_F(PhoneNumberUtilTest,ParseItalianLeadingZeros)4659 TEST_F(PhoneNumberUtilTest, ParseItalianLeadingZeros) {
4660   PhoneNumber zeros_number;
4661   zeros_number.set_country_code(61);
4662   PhoneNumber test_number;
4663 
4664   // Test the number "011".
4665   zeros_number.set_national_number(11L);
4666   zeros_number.set_italian_leading_zero(true);
4667   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4668             phone_util_.Parse("011", RegionCode::AU(),
4669                               &test_number));
4670   EXPECT_EQ(zeros_number, test_number);
4671 
4672   // Test the number "001".
4673   zeros_number.set_national_number(1L);
4674   zeros_number.set_italian_leading_zero(true);
4675   zeros_number.set_number_of_leading_zeros(2);
4676   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4677             phone_util_.Parse("001", RegionCode::AU(),
4678                               &test_number));
4679   EXPECT_EQ(zeros_number, test_number);
4680 
4681   // Test the number "000". This number has 2 leading zeros.
4682   zeros_number.set_national_number(0L);
4683   zeros_number.set_italian_leading_zero(true);
4684   zeros_number.set_number_of_leading_zeros(2);
4685   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4686             phone_util_.Parse("000", RegionCode::AU(),
4687                               &test_number));
4688   EXPECT_EQ(zeros_number, test_number);
4689 
4690   // Test the number "0000". This number has 3 leading zeros.
4691   zeros_number.set_national_number(0L);
4692   zeros_number.set_italian_leading_zero(true);
4693   zeros_number.set_number_of_leading_zeros(3);
4694   EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
4695             phone_util_.Parse("0000", RegionCode::AU(),
4696                               &test_number));
4697   EXPECT_EQ(zeros_number, test_number);
4698 }
4699 
TEST_F(PhoneNumberUtilTest,CanBeInternationallyDialled)4700 TEST_F(PhoneNumberUtilTest, CanBeInternationallyDialled) {
4701   PhoneNumber test_number;
4702   test_number.set_country_code(1);
4703 
4704   // We have no-international-dialling rules for the US in our test metadata
4705   // that say that toll-free numbers cannot be dialled internationally.
4706   test_number.set_national_number(uint64{8002530000});
4707   EXPECT_FALSE(phone_util_.CanBeInternationallyDialled(test_number));
4708 
4709   // Normal US numbers can be internationally dialled.
4710   test_number.set_national_number(uint64{6502530000});
4711   EXPECT_TRUE(phone_util_.CanBeInternationallyDialled(test_number));
4712 
4713   // Invalid number.
4714   test_number.set_national_number(uint64{2530000});
4715   EXPECT_TRUE(phone_util_.CanBeInternationallyDialled(test_number));
4716 
4717   // We have no data for NZ - should return true.
4718   test_number.set_country_code(64);
4719   test_number.set_national_number(uint64{33316005});
4720   EXPECT_TRUE(phone_util_.CanBeInternationallyDialled(test_number));
4721 
4722   test_number.set_country_code(800);
4723   test_number.set_national_number(uint64{12345678});
4724   EXPECT_TRUE(phone_util_.CanBeInternationallyDialled(test_number));
4725 }
4726 
TEST_F(PhoneNumberUtilTest,IsAlphaNumber)4727 TEST_F(PhoneNumberUtilTest, IsAlphaNumber) {
4728   EXPECT_TRUE(phone_util_.IsAlphaNumber("1800 six-flags"));
4729   EXPECT_TRUE(phone_util_.IsAlphaNumber("1800 six-flags ext. 1234"));
4730   EXPECT_TRUE(phone_util_.IsAlphaNumber("+800 six-flags"));
4731   EXPECT_TRUE(phone_util_.IsAlphaNumber("180 six-flags"));
4732   EXPECT_FALSE(phone_util_.IsAlphaNumber("1800 123-1234"));
4733   EXPECT_FALSE(phone_util_.IsAlphaNumber("1 six-flags"));
4734   EXPECT_FALSE(phone_util_.IsAlphaNumber("18 six-flags"));
4735   EXPECT_FALSE(phone_util_.IsAlphaNumber("1800 123-1234 extension: 1234"));
4736   EXPECT_FALSE(phone_util_.IsAlphaNumber("+800 1234-1234"));
4737 }
4738 
4739 }  // namespace phonenumbers
4740 }  // namespace i18n
4741