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