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