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