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