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