OLD | NEW |
| (Empty) |
1 // Copyright (C) 2009 Google Inc. | |
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 #include <iostream> | |
20 #include <set> | |
21 #include <string> | |
22 | |
23 #include <gtest/gtest.h> | |
24 | |
25 #include "phonemetadata.pb.h" | |
26 #include "phonenumber.h" | |
27 #include "phonenumber.pb.h" | |
28 #include "phonenumberutil.h" | |
29 | |
30 namespace i18n { | |
31 namespace phonenumbers { | |
32 | |
33 using std::endl; | |
34 using std::make_pair; | |
35 using std::ostream; | |
36 | |
37 using google::protobuf::RepeatedPtrField; | |
38 | |
39 namespace { | |
40 | |
41 // Class containing string constants of region codes for easier testing. This is | |
42 // intended to replace region_code.h for testing in this file, with more | |
43 // constants defined. | |
44 class RegionCode { | |
45 public: | |
46 static const string& AD() { | |
47 static const string s = "AD"; | |
48 return s; | |
49 } | |
50 | |
51 static const string& AO() { | |
52 static const string s = "AO"; | |
53 return s; | |
54 } | |
55 | |
56 static const string& AR() { | |
57 static const string s = "AR"; | |
58 return s; | |
59 } | |
60 | |
61 static const string& AU() { | |
62 static const string s = "AU"; | |
63 return s; | |
64 } | |
65 | |
66 static const string& BS() { | |
67 static const string s = "BS"; | |
68 return s; | |
69 } | |
70 | |
71 static const string& CN() { | |
72 static const string s = "CN"; | |
73 return s; | |
74 } | |
75 | |
76 static const string& CS() { | |
77 static const string s = "CS"; | |
78 return s; | |
79 } | |
80 | |
81 static const string& DE() { | |
82 static const string s = "DE"; | |
83 return s; | |
84 } | |
85 | |
86 static const string& GB() { | |
87 static const string s = "GB"; | |
88 return s; | |
89 } | |
90 | |
91 static const string& IT() { | |
92 static const string s = "IT"; | |
93 return s; | |
94 } | |
95 | |
96 static const string& KR() { | |
97 static const string s = "KR"; | |
98 return s; | |
99 } | |
100 | |
101 static const string& MX() { | |
102 static const string s = "MX"; | |
103 return s; | |
104 } | |
105 | |
106 static const string& NZ() { | |
107 static const string s = "NZ"; | |
108 return s; | |
109 } | |
110 | |
111 static const string& PL() { | |
112 static const string s = "PL"; | |
113 return s; | |
114 } | |
115 | |
116 static const string& RE() { | |
117 static const string s = "RE"; | |
118 return s; | |
119 } | |
120 | |
121 static const string& SG() { | |
122 static const string s = "SG"; | |
123 return s; | |
124 } | |
125 | |
126 static const string& US() { | |
127 static const string s = "US"; | |
128 return s; | |
129 } | |
130 | |
131 static const string& YT() { | |
132 static const string s = "YT"; | |
133 return s; | |
134 } | |
135 | |
136 // Returns a region code string representing the "unknown" region. | |
137 static const string& GetUnknown() { | |
138 static const string s = "ZZ"; | |
139 return s; | |
140 } | |
141 }; | |
142 | |
143 } // namespace | |
144 | |
145 class PhoneNumberUtilTest : public testing::Test { | |
146 protected: | |
147 PhoneNumberUtilTest() : phone_util_(*PhoneNumberUtil::GetInstance()) { | |
148 } | |
149 | |
150 // Wrapper functions for private functions that we want to test. | |
151 const PhoneMetadata* GetPhoneMetadata(const string& region_code) const { | |
152 return phone_util_.GetMetadataForRegion(region_code); | |
153 } | |
154 | |
155 void GetSupportedRegions(set<string>* regions) { | |
156 phone_util_.GetSupportedRegions(regions); | |
157 } | |
158 | |
159 void ExtractPossibleNumber(const string& number, | |
160 string* extracted_number) const { | |
161 phone_util_.ExtractPossibleNumber(number, extracted_number); | |
162 } | |
163 | |
164 bool IsViablePhoneNumber(const string& number) const { | |
165 return phone_util_.IsViablePhoneNumber(number); | |
166 } | |
167 | |
168 void Normalize(string* number) const { | |
169 phone_util_.Normalize(number); | |
170 } | |
171 | |
172 bool IsLeadingZeroPossible(int country_calling_code) const { | |
173 return phone_util_.IsLeadingZeroPossible(country_calling_code); | |
174 } | |
175 | |
176 PhoneNumber::CountryCodeSource MaybeStripInternationalPrefixAndNormalize( | |
177 const string& possible_idd_prefix, | |
178 string* number) const { | |
179 return phone_util_.MaybeStripInternationalPrefixAndNormalize( | |
180 possible_idd_prefix, | |
181 number); | |
182 } | |
183 | |
184 void MaybeStripNationalPrefixAndCarrierCode(const PhoneMetadata& metadata, | |
185 string* number, | |
186 string* carrier_code) const { | |
187 phone_util_.MaybeStripNationalPrefixAndCarrierCode(metadata, number, | |
188 carrier_code); | |
189 } | |
190 | |
191 bool MaybeStripExtension(string* number, string* extension) const { | |
192 return phone_util_.MaybeStripExtension(number, extension); | |
193 } | |
194 | |
195 PhoneNumberUtil::ErrorType MaybeExtractCountryCode( | |
196 const PhoneMetadata* default_region_metadata, | |
197 bool keep_raw_input, | |
198 string* national_number, | |
199 PhoneNumber* phone_number) const { | |
200 return phone_util_.MaybeExtractCountryCode(default_region_metadata, | |
201 keep_raw_input, | |
202 national_number, | |
203 phone_number); | |
204 } | |
205 | |
206 void GetNddPrefixForRegion(const string& region, | |
207 bool strip_non_digits, | |
208 string* ndd_prefix) const { | |
209 // For testing purposes, we check this is empty first. | |
210 ndd_prefix->clear(); | |
211 phone_util_.GetNddPrefixForRegion(region, strip_non_digits, ndd_prefix); | |
212 } | |
213 | |
214 static bool Equals(const PhoneNumberDesc& expected_number, | |
215 const PhoneNumberDesc& actual_number) { | |
216 return ExactlySameAs(expected_number, actual_number); | |
217 } | |
218 | |
219 const PhoneNumberUtil& phone_util_; | |
220 }; | |
221 | |
222 // Provides PhoneNumber comparison operators to support the use of EXPECT_EQ and | |
223 // EXPECT_NE in the unittests. | |
224 bool operator==(const PhoneNumber& number1, const PhoneNumber& number2) { | |
225 return ExactlySameAs(number1, number2); | |
226 } | |
227 | |
228 bool operator!=(const PhoneNumber& number1, const PhoneNumber& number2) { | |
229 return !(number1 == number2); | |
230 } | |
231 | |
232 // Needed by Google Test to display errors. | |
233 ostream& operator<<(ostream& os, const PhoneNumber& number) { | |
234 os << endl | |
235 << "country_code: " << number.country_code() << endl | |
236 << "national_number: " << number.national_number() << endl; | |
237 if (number.has_extension()) { | |
238 os << "extension: " << number.extension() << endl; | |
239 } | |
240 if (number.has_italian_leading_zero()) { | |
241 os << "italian_leading_zero: " << number.italian_leading_zero() << endl; | |
242 } | |
243 if (number.has_raw_input()) { | |
244 os << "raw_input: " << number.raw_input() << endl; | |
245 } | |
246 if (number.has_country_code_source()) { | |
247 os << "country_code_source: " << number.country_code_source() << endl; | |
248 } | |
249 if (number.has_preferred_domestic_carrier_code()) { | |
250 os << "preferred_domestic_carrier_code: " | |
251 << number.preferred_domestic_carrier_code() << endl; | |
252 } | |
253 return os; | |
254 } | |
255 | |
256 TEST_F(PhoneNumberUtilTest, GetSupportedRegions) { | |
257 set<string> regions; | |
258 | |
259 GetSupportedRegions(®ions); | |
260 EXPECT_GT(regions.size(), 0U); | |
261 } | |
262 | |
263 TEST_F(PhoneNumberUtilTest, GetInstanceLoadUSMetadata) { | |
264 const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::US()); | |
265 EXPECT_EQ("US", metadata->id()); | |
266 EXPECT_EQ(1, metadata->country_code()); | |
267 EXPECT_EQ("011", metadata->international_prefix()); | |
268 EXPECT_TRUE(metadata->has_national_prefix()); | |
269 ASSERT_EQ(2, metadata->number_format_size()); | |
270 EXPECT_EQ("(\\d{3})(\\d{3})(\\d{4})", | |
271 metadata->number_format(1).pattern()); | |
272 EXPECT_EQ("$1 $2 $3", metadata->number_format(1).format()); | |
273 EXPECT_EQ("[13-9]\\d{9}|2[0-35-9]\\d{8}", | |
274 metadata->general_desc().national_number_pattern()); | |
275 EXPECT_EQ("\\d{7}(?:\\d{3})?", | |
276 metadata->general_desc().possible_number_pattern()); | |
277 EXPECT_TRUE(Equals(metadata->general_desc(), metadata->fixed_line())); | |
278 EXPECT_EQ("\\d{10}", metadata->toll_free().possible_number_pattern()); | |
279 EXPECT_EQ("900\\d{7}", metadata->premium_rate().national_number_pattern()); | |
280 // No shared-cost data is available, so it should be initialised to "NA". | |
281 EXPECT_EQ("NA", metadata->shared_cost().national_number_pattern()); | |
282 EXPECT_EQ("NA", metadata->shared_cost().possible_number_pattern()); | |
283 } | |
284 | |
285 TEST_F(PhoneNumberUtilTest, GetInstanceLoadDEMetadata) { | |
286 const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::DE()); | |
287 EXPECT_EQ("DE", metadata->id()); | |
288 EXPECT_EQ(49, metadata->country_code()); | |
289 EXPECT_EQ("00", metadata->international_prefix()); | |
290 EXPECT_EQ("0", metadata->national_prefix()); | |
291 ASSERT_EQ(6, metadata->number_format_size()); | |
292 EXPECT_EQ(1, metadata->number_format(5).leading_digits_pattern_size()); | |
293 EXPECT_EQ("900", metadata->number_format(5).leading_digits_pattern(0)); | |
294 EXPECT_EQ("(\\d{3})(\\d{3,4})(\\d{4})", | |
295 metadata->number_format(5).pattern()); | |
296 EXPECT_EQ("$1 $2 $3", metadata->number_format(5).format()); | |
297 EXPECT_EQ("(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:[1-9]\\d|0[2-9]))\\d{3,8}", | |
298 metadata->fixed_line().national_number_pattern()); | |
299 EXPECT_EQ("\\d{2,14}", metadata->fixed_line().possible_number_pattern()); | |
300 EXPECT_EQ("30123456", metadata->fixed_line().example_number()); | |
301 EXPECT_EQ("\\d{10}", metadata->toll_free().possible_number_pattern()); | |
302 EXPECT_EQ("900([135]\\d{6}|9\\d{7})", | |
303 metadata->premium_rate().national_number_pattern()); | |
304 } | |
305 | |
306 TEST_F(PhoneNumberUtilTest, GetInstanceLoadARMetadata) { | |
307 const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::AR()); | |
308 EXPECT_EQ("AR", metadata->id()); | |
309 EXPECT_EQ(54, metadata->country_code()); | |
310 EXPECT_EQ("00", metadata->international_prefix()); | |
311 EXPECT_EQ("0", metadata->national_prefix()); | |
312 EXPECT_EQ("0(?:(11|343|3715)15)?", metadata->national_prefix_for_parsing()); | |
313 EXPECT_EQ("9$1", metadata->national_prefix_transform_rule()); | |
314 ASSERT_EQ(5, metadata->number_format_size()); | |
315 EXPECT_EQ("$2 15 $3-$4", metadata->number_format(2).format()); | |
316 EXPECT_EQ("(9)(\\d{4})(\\d{2})(\\d{4})", | |
317 metadata->number_format(3).pattern()); | |
318 EXPECT_EQ("(9)(\\d{4})(\\d{2})(\\d{4})", | |
319 metadata->intl_number_format(3).pattern()); | |
320 EXPECT_EQ("$1 $2 $3 $4", metadata->intl_number_format(3).format()); | |
321 } | |
322 | |
323 TEST_F(PhoneNumberUtilTest, GetNationalSignificantNumber) { | |
324 PhoneNumber number; | |
325 number.set_country_code(1); | |
326 number.set_national_number(6502530000ULL); | |
327 string national_significant_number; | |
328 phone_util_.GetNationalSignificantNumber(number, | |
329 &national_significant_number); | |
330 EXPECT_EQ("6502530000", national_significant_number); | |
331 | |
332 // An Italian mobile number. | |
333 national_significant_number.clear(); | |
334 number.set_country_code(39); | |
335 number.set_national_number(312345678ULL); | |
336 phone_util_.GetNationalSignificantNumber(number, | |
337 &national_significant_number); | |
338 EXPECT_EQ("312345678", national_significant_number); | |
339 | |
340 // An Italian fixed line number. | |
341 national_significant_number.clear(); | |
342 number.set_country_code(39); | |
343 number.set_national_number(236618300ULL); | |
344 number.set_italian_leading_zero(true); | |
345 phone_util_.GetNationalSignificantNumber(number, | |
346 &national_significant_number); | |
347 EXPECT_EQ("0236618300", national_significant_number); | |
348 } | |
349 | |
350 TEST_F(PhoneNumberUtilTest, GetExampleNumber) { | |
351 PhoneNumber de_number; | |
352 de_number.set_country_code(49); | |
353 de_number.set_national_number(30123456ULL); | |
354 PhoneNumber test_number; | |
355 bool success = phone_util_.GetExampleNumber(RegionCode::DE(), &test_number); | |
356 EXPECT_TRUE(success); | |
357 EXPECT_EQ(de_number, test_number); | |
358 success = phone_util_.GetExampleNumberForType(RegionCode::DE(), | |
359 PhoneNumberUtil::FIXED_LINE, | |
360 &test_number); | |
361 EXPECT_TRUE(success); | |
362 EXPECT_EQ(de_number, test_number); | |
363 test_number.Clear(); | |
364 success = phone_util_.GetExampleNumberForType(RegionCode::DE(), | |
365 PhoneNumberUtil::MOBILE, | |
366 &test_number); | |
367 // Here we test that an example number was not returned, and that the number | |
368 // passed in was not modified. | |
369 EXPECT_FALSE(success); | |
370 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
371 // For the US, the example number is placed under general description, and | |
372 // hence should be used for both fixed line and mobile, so neither of these | |
373 // should return null. | |
374 test_number.Clear(); | |
375 success = phone_util_.GetExampleNumberForType(RegionCode::US(), | |
376 PhoneNumberUtil::FIXED_LINE, | |
377 &test_number); | |
378 // Here we test that the call to get an example number succeeded, and that the | |
379 // number passed in was modified. | |
380 EXPECT_TRUE(success); | |
381 EXPECT_NE(PhoneNumber::default_instance(), test_number); | |
382 test_number.Clear(); | |
383 success = phone_util_.GetExampleNumberForType(RegionCode::US(), | |
384 PhoneNumberUtil::MOBILE, | |
385 &test_number); | |
386 EXPECT_TRUE(success); | |
387 EXPECT_NE(PhoneNumber::default_instance(), test_number); | |
388 | |
389 test_number.Clear(); | |
390 // CS is an invalid region, so we have no data for it. We should return false. | |
391 EXPECT_FALSE(phone_util_.GetExampleNumberForType(RegionCode::CS(), | |
392 PhoneNumberUtil::MOBILE, | |
393 &test_number)); | |
394 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
395 } | |
396 | |
397 TEST_F(PhoneNumberUtilTest, FormatUSNumber) { | |
398 PhoneNumber test_number; | |
399 string formatted_number; | |
400 test_number.set_country_code(1); | |
401 test_number.set_national_number(6502530000ULL); | |
402 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
403 EXPECT_EQ("650 253 0000", formatted_number); | |
404 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
405 &formatted_number); | |
406 EXPECT_EQ("+1 650 253 0000", formatted_number); | |
407 | |
408 test_number.set_national_number(8002530000ULL); | |
409 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
410 EXPECT_EQ("800 253 0000", formatted_number); | |
411 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
412 &formatted_number); | |
413 EXPECT_EQ("+1 800 253 0000", formatted_number); | |
414 | |
415 test_number.set_national_number(9002530000ULL); | |
416 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
417 EXPECT_EQ("900 253 0000", formatted_number); | |
418 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
419 &formatted_number); | |
420 EXPECT_EQ("+1 900 253 0000", formatted_number); | |
421 phone_util_.Format(test_number, PhoneNumberUtil::RFC3966, &formatted_number); | |
422 EXPECT_EQ("+1-900-253-0000", formatted_number); | |
423 } | |
424 | |
425 TEST_F(PhoneNumberUtilTest, FormatBSNumber) { | |
426 PhoneNumber test_number; | |
427 string formatted_number; | |
428 test_number.set_country_code(1); | |
429 test_number.set_national_number(2421234567ULL); | |
430 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
431 EXPECT_EQ("242 123 4567", formatted_number); | |
432 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
433 &formatted_number); | |
434 EXPECT_EQ("+1 242 123 4567", formatted_number); | |
435 | |
436 test_number.set_national_number(8002530000ULL); | |
437 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
438 EXPECT_EQ("800 253 0000", formatted_number); | |
439 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
440 &formatted_number); | |
441 EXPECT_EQ("+1 800 253 0000", formatted_number); | |
442 | |
443 test_number.set_national_number(9002530000ULL); | |
444 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
445 EXPECT_EQ("900 253 0000", formatted_number); | |
446 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
447 &formatted_number); | |
448 EXPECT_EQ("+1 900 253 0000", formatted_number); | |
449 } | |
450 | |
451 TEST_F(PhoneNumberUtilTest, FormatGBNumber) { | |
452 PhoneNumber test_number; | |
453 string formatted_number; | |
454 test_number.set_country_code(44); | |
455 test_number.set_national_number(2087389353ULL); | |
456 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
457 EXPECT_EQ("(020) 8738 9353", formatted_number); | |
458 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
459 &formatted_number); | |
460 EXPECT_EQ("+44 20 8738 9353", formatted_number); | |
461 | |
462 test_number.set_national_number(7912345678ULL); | |
463 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
464 EXPECT_EQ("(07912) 345 678", formatted_number); | |
465 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
466 &formatted_number); | |
467 EXPECT_EQ("+44 7912 345 678", formatted_number); | |
468 } | |
469 | |
470 TEST_F(PhoneNumberUtilTest, FormatDENumber) { | |
471 PhoneNumber test_number; | |
472 string formatted_number; | |
473 test_number.set_country_code(49); | |
474 test_number.set_national_number(301234ULL); | |
475 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
476 EXPECT_EQ("030/1234", formatted_number); | |
477 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
478 &formatted_number); | |
479 EXPECT_EQ("+49 30/1234", formatted_number); | |
480 phone_util_.Format(test_number, PhoneNumberUtil::RFC3966, &formatted_number); | |
481 EXPECT_EQ("+49-30-1234", formatted_number); | |
482 | |
483 test_number.set_national_number(291123ULL); | |
484 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
485 EXPECT_EQ("0291 123", formatted_number); | |
486 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
487 &formatted_number); | |
488 EXPECT_EQ("+49 291 123", formatted_number); | |
489 | |
490 test_number.set_national_number(29112345678ULL); | |
491 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
492 EXPECT_EQ("0291 12345678", formatted_number); | |
493 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
494 &formatted_number); | |
495 EXPECT_EQ("+49 291 12345678", formatted_number); | |
496 | |
497 test_number.set_national_number(9123123ULL); | |
498 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
499 EXPECT_EQ("09123 123", formatted_number); | |
500 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
501 &formatted_number); | |
502 EXPECT_EQ("+49 9123 123", formatted_number); | |
503 | |
504 test_number.set_national_number(80212345ULL); | |
505 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
506 EXPECT_EQ("08021 2345", formatted_number); | |
507 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
508 &formatted_number); | |
509 EXPECT_EQ("+49 8021 2345", formatted_number); | |
510 | |
511 test_number.set_national_number(1234ULL); | |
512 // Note this number is correctly formatted without national prefix. Most of | |
513 // the numbers that are treated as invalid numbers by the library are short | |
514 // numbers, and they are usually not dialed with national prefix. | |
515 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
516 EXPECT_EQ("1234", formatted_number); | |
517 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
518 &formatted_number); | |
519 EXPECT_EQ("+49 1234", formatted_number); | |
520 } | |
521 | |
522 TEST_F(PhoneNumberUtilTest, FormatITNumber) { | |
523 PhoneNumber test_number; | |
524 string formatted_number; | |
525 test_number.set_country_code(39); | |
526 test_number.set_national_number(236618300ULL); | |
527 test_number.set_italian_leading_zero(true); | |
528 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
529 EXPECT_EQ("02 3661 8300", formatted_number); | |
530 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
531 &formatted_number); | |
532 EXPECT_EQ("+39 02 3661 8300", formatted_number); | |
533 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
534 &formatted_number); | |
535 EXPECT_EQ("+390236618300", formatted_number); | |
536 | |
537 test_number.set_national_number(345678901ULL); | |
538 test_number.set_italian_leading_zero(false); | |
539 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
540 EXPECT_EQ("345 678 901", formatted_number); | |
541 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
542 &formatted_number); | |
543 EXPECT_EQ("+39 345 678 901", formatted_number); | |
544 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
545 &formatted_number); | |
546 EXPECT_EQ("+39345678901", formatted_number); | |
547 } | |
548 | |
549 TEST_F(PhoneNumberUtilTest, FormatAUNumber) { | |
550 PhoneNumber test_number; | |
551 string formatted_number; | |
552 test_number.set_country_code(61); | |
553 test_number.set_national_number(236618300ULL); | |
554 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
555 EXPECT_EQ("02 3661 8300", formatted_number); | |
556 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
557 &formatted_number); | |
558 EXPECT_EQ("+61 2 3661 8300", formatted_number); | |
559 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
560 &formatted_number); | |
561 EXPECT_EQ("+61236618300", formatted_number); | |
562 | |
563 test_number.set_national_number(1800123456ULL); | |
564 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
565 EXPECT_EQ("1800 123 456", formatted_number); | |
566 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
567 &formatted_number); | |
568 EXPECT_EQ("+61 1800 123 456", formatted_number); | |
569 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
570 &formatted_number); | |
571 EXPECT_EQ("+611800123456", formatted_number); | |
572 } | |
573 | |
574 TEST_F(PhoneNumberUtilTest, FormatARNumber) { | |
575 PhoneNumber test_number; | |
576 string formatted_number; | |
577 test_number.set_country_code(54); | |
578 test_number.set_national_number(1187654321ULL); | |
579 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
580 EXPECT_EQ("011 8765-4321", formatted_number); | |
581 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
582 &formatted_number); | |
583 EXPECT_EQ("+54 11 8765-4321", formatted_number); | |
584 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
585 &formatted_number); | |
586 EXPECT_EQ("+541187654321", formatted_number); | |
587 | |
588 test_number.set_national_number(91187654321ULL); | |
589 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
590 EXPECT_EQ("011 15 8765-4321", formatted_number); | |
591 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
592 &formatted_number); | |
593 EXPECT_EQ("+54 9 11 8765 4321", formatted_number); | |
594 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
595 &formatted_number); | |
596 EXPECT_EQ("+5491187654321", formatted_number); | |
597 } | |
598 | |
599 TEST_F(PhoneNumberUtilTest, FormatMXNumber) { | |
600 PhoneNumber test_number; | |
601 string formatted_number; | |
602 test_number.set_country_code(52); | |
603 test_number.set_national_number(12345678900ULL); | |
604 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
605 EXPECT_EQ("045 234 567 8900", formatted_number); | |
606 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
607 &formatted_number); | |
608 EXPECT_EQ("+52 1 234 567 8900", formatted_number); | |
609 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
610 &formatted_number); | |
611 EXPECT_EQ("+5212345678900", formatted_number); | |
612 | |
613 test_number.set_national_number(15512345678ULL); | |
614 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
615 EXPECT_EQ("045 55 1234 5678", formatted_number); | |
616 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
617 &formatted_number); | |
618 EXPECT_EQ("+52 1 55 1234 5678", formatted_number); | |
619 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
620 &formatted_number); | |
621 EXPECT_EQ("+5215512345678", formatted_number); | |
622 | |
623 test_number.set_national_number(3312345678LL); | |
624 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
625 EXPECT_EQ("01 33 1234 5678", formatted_number); | |
626 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
627 &formatted_number); | |
628 EXPECT_EQ("+52 33 1234 5678", formatted_number); | |
629 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
630 &formatted_number); | |
631 EXPECT_EQ("+523312345678", formatted_number); | |
632 | |
633 test_number.set_national_number(8211234567LL); | |
634 phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
635 EXPECT_EQ("01 821 123 4567", formatted_number); | |
636 phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL, | |
637 &formatted_number); | |
638 EXPECT_EQ("+52 821 123 4567", formatted_number); | |
639 phone_util_.Format(test_number, PhoneNumberUtil::E164, | |
640 &formatted_number); | |
641 EXPECT_EQ("+528211234567", formatted_number); | |
642 } | |
643 | |
644 TEST_F(PhoneNumberUtilTest, FormatOutOfCountryCallingNumber) { | |
645 PhoneNumber test_number; | |
646 string formatted_number; | |
647 test_number.set_country_code(1); | |
648 test_number.set_national_number(9002530000ULL); | |
649 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::DE(), | |
650 &formatted_number); | |
651 EXPECT_EQ("00 1 900 253 0000", formatted_number); | |
652 | |
653 test_number.set_national_number(6502530000ULL); | |
654 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::BS(), | |
655 &formatted_number); | |
656 EXPECT_EQ("1 650 253 0000", formatted_number); | |
657 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::PL(), | |
658 &formatted_number); | |
659 EXPECT_EQ("0~0 1 650 253 0000", formatted_number); | |
660 | |
661 test_number.set_country_code(44); | |
662 test_number.set_national_number(7912345678ULL); | |
663 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(), | |
664 &formatted_number); | |
665 EXPECT_EQ("011 44 7912 345 678", formatted_number); | |
666 | |
667 test_number.set_country_code(49); | |
668 test_number.set_national_number(1234ULL); | |
669 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::GB(), | |
670 &formatted_number); | |
671 EXPECT_EQ("00 49 1234", formatted_number); | |
672 // Note this number is correctly formatted without national prefix. Most of | |
673 // the numbers that are treated as invalid numbers by the library are short | |
674 // numbers, and they are usually not dialed with national prefix. | |
675 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::DE(), | |
676 &formatted_number); | |
677 EXPECT_EQ("1234", formatted_number); | |
678 | |
679 test_number.set_country_code(39); | |
680 test_number.set_national_number(236618300ULL); | |
681 test_number.set_italian_leading_zero(true); | |
682 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(), | |
683 &formatted_number); | |
684 EXPECT_EQ("011 39 02 3661 8300", formatted_number); | |
685 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::IT(), | |
686 &formatted_number); | |
687 EXPECT_EQ("02 3661 8300", formatted_number); | |
688 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::SG(), | |
689 &formatted_number); | |
690 EXPECT_EQ("+39 02 3661 8300", formatted_number); | |
691 | |
692 test_number.set_country_code(65); | |
693 test_number.set_national_number(94777892ULL); | |
694 test_number.set_italian_leading_zero(false); | |
695 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::SG(), | |
696 &formatted_number); | |
697 EXPECT_EQ("9477 7892", formatted_number); | |
698 | |
699 test_number.set_country_code(54); | |
700 test_number.set_national_number(91187654321ULL); | |
701 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(), | |
702 &formatted_number); | |
703 EXPECT_EQ("011 54 9 11 8765 4321", formatted_number); | |
704 | |
705 test_number.set_extension("1234"); | |
706 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(), | |
707 &formatted_number); | |
708 EXPECT_EQ("011 54 9 11 8765 4321 ext. 1234", formatted_number); | |
709 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AU(), | |
710 &formatted_number); | |
711 EXPECT_EQ("0011 54 9 11 8765 4321 ext. 1234", formatted_number); | |
712 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AR(), | |
713 &formatted_number); | |
714 EXPECT_EQ("011 15 8765-4321 ext. 1234", formatted_number); | |
715 } | |
716 | |
717 TEST_F(PhoneNumberUtilTest, FormatOutOfCountryWithPreferredIntlPrefix) { | |
718 PhoneNumber test_number; | |
719 string formatted_number; | |
720 test_number.set_country_code(39); | |
721 test_number.set_national_number(236618300ULL); | |
722 test_number.set_italian_leading_zero(true); | |
723 // This should use 0011, since that is the preferred international prefix | |
724 // (both 0011 and 0012 are accepted as possible international prefixes in our | |
725 // test metadta.) | |
726 phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AU(), | |
727 &formatted_number); | |
728 EXPECT_EQ("0011 39 02 3661 8300", formatted_number); | |
729 } | |
730 | |
731 TEST_F(PhoneNumberUtilTest, FormatOutOfCountryKeepingAlphaChars) { | |
732 PhoneNumber alpha_numeric_number; | |
733 string formatted_number; | |
734 alpha_numeric_number.set_country_code(1); | |
735 alpha_numeric_number.set_national_number(8007493524ULL); | |
736 alpha_numeric_number.set_raw_input("1800 six-flag"); | |
737 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
738 RegionCode::AU(), | |
739 &formatted_number); | |
740 EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number); | |
741 | |
742 formatted_number.clear(); | |
743 alpha_numeric_number.set_raw_input("1-800-SIX-flag"); | |
744 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
745 RegionCode::AU(), | |
746 &formatted_number); | |
747 EXPECT_EQ("0011 1 800-SIX-FLAG", formatted_number); | |
748 | |
749 formatted_number.clear(); | |
750 alpha_numeric_number.set_raw_input("Call us from UK: 00 1 800 SIX-flag"); | |
751 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
752 RegionCode::AU(), | |
753 &formatted_number); | |
754 EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number); | |
755 | |
756 formatted_number.clear(); | |
757 alpha_numeric_number.set_raw_input("800 SIX-flag"); | |
758 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
759 RegionCode::AU(), | |
760 &formatted_number); | |
761 EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number); | |
762 | |
763 // Formatting from within the NANPA region. | |
764 formatted_number.clear(); | |
765 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
766 RegionCode::US(), | |
767 &formatted_number); | |
768 EXPECT_EQ("1 800 SIX-FLAG", formatted_number); | |
769 formatted_number.clear(); | |
770 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
771 RegionCode::BS(), | |
772 &formatted_number); | |
773 EXPECT_EQ("1 800 SIX-FLAG", formatted_number); | |
774 | |
775 // Testing that if the raw input doesn't exist, it is formatted using | |
776 // FormatOutOfCountryCallingNumber. | |
777 alpha_numeric_number.clear_raw_input(); | |
778 formatted_number.clear(); | |
779 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
780 RegionCode::DE(), | |
781 &formatted_number); | |
782 EXPECT_EQ("00 1 800 749 3524", formatted_number); | |
783 | |
784 // Testing AU alpha number formatted from Australia. | |
785 alpha_numeric_number.set_country_code(61); | |
786 alpha_numeric_number.set_national_number(827493524ULL); | |
787 alpha_numeric_number.set_raw_input("+61 82749-FLAG"); | |
788 formatted_number.clear(); | |
789 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
790 RegionCode::AU(), | |
791 &formatted_number); | |
792 // This number should have the national prefix prefixed. | |
793 EXPECT_EQ("082749-FLAG", formatted_number); | |
794 | |
795 alpha_numeric_number.set_raw_input("082749-FLAG"); | |
796 formatted_number.clear(); | |
797 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
798 RegionCode::AU(), | |
799 &formatted_number); | |
800 EXPECT_EQ("082749-FLAG", formatted_number); | |
801 | |
802 alpha_numeric_number.set_national_number(18007493524ULL); | |
803 alpha_numeric_number.set_raw_input("1-800-SIX-flag"); | |
804 formatted_number.clear(); | |
805 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
806 RegionCode::AU(), | |
807 &formatted_number); | |
808 // This number should not have the national prefix prefixed, in accordance | |
809 // with the override for this specific formatting rule. | |
810 EXPECT_EQ("1-800-SIX-FLAG", formatted_number); | |
811 // The metadata should not be permanently changed, since we copied it before | |
812 // modifying patterns. Here we check this. | |
813 formatted_number.clear(); | |
814 alpha_numeric_number.set_national_number(1800749352ULL); | |
815 phone_util_.FormatOutOfCountryCallingNumber(alpha_numeric_number, | |
816 RegionCode::AU(), | |
817 &formatted_number); | |
818 EXPECT_EQ("1800 749 352", formatted_number); | |
819 | |
820 // Testing a country with multiple international prefixes. | |
821 formatted_number.clear(); | |
822 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
823 RegionCode::SG(), | |
824 &formatted_number); | |
825 EXPECT_EQ("+61 1-800-SIX-FLAG", formatted_number); | |
826 | |
827 // Testing the case with an invalid country code. | |
828 formatted_number.clear(); | |
829 alpha_numeric_number.set_country_code(0); | |
830 alpha_numeric_number.set_national_number(18007493524ULL); | |
831 alpha_numeric_number.set_raw_input("1-800-SIX-flag"); | |
832 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
833 RegionCode::DE(), | |
834 &formatted_number); | |
835 // Uses the raw input only. | |
836 EXPECT_EQ("1-800-SIX-flag", formatted_number); | |
837 | |
838 // Testing the case of an invalid alpha number. | |
839 formatted_number.clear(); | |
840 alpha_numeric_number.set_country_code(1); | |
841 alpha_numeric_number.set_national_number(80749ULL); | |
842 alpha_numeric_number.set_raw_input("180-SIX"); | |
843 phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number, | |
844 RegionCode::DE(), | |
845 &formatted_number); | |
846 // No country-code stripping can be done. | |
847 EXPECT_EQ("00 1 180-SIX", formatted_number); | |
848 } | |
849 | |
850 TEST_F(PhoneNumberUtilTest, FormatWithCarrierCode) { | |
851 // We only support this for AR in our test metadata. | |
852 PhoneNumber ar_number; | |
853 string formatted_number; | |
854 ar_number.set_country_code(54); | |
855 ar_number.set_national_number(91234125678ULL); | |
856 phone_util_.Format(ar_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
857 EXPECT_EQ("01234 12-5678", formatted_number); | |
858 // Test formatting with a carrier code. | |
859 phone_util_.FormatNationalNumberWithCarrierCode(ar_number, "15", | |
860 &formatted_number); | |
861 EXPECT_EQ("01234 15 12-5678", formatted_number); | |
862 phone_util_.FormatNationalNumberWithCarrierCode(ar_number, "", | |
863 &formatted_number); | |
864 EXPECT_EQ("01234 12-5678", formatted_number); | |
865 // Here the international rule is used, so no carrier code should be present. | |
866 phone_util_.Format(ar_number, PhoneNumberUtil::E164, &formatted_number); | |
867 EXPECT_EQ("+5491234125678", formatted_number); | |
868 // We don't support this for the US so there should be no change. | |
869 PhoneNumber us_number; | |
870 us_number.set_country_code(1); | |
871 us_number.set_national_number(4241231234ULL); | |
872 phone_util_.Format(us_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
873 EXPECT_EQ("424 123 1234", formatted_number); | |
874 phone_util_.FormatNationalNumberWithCarrierCode(us_number, "15", | |
875 &formatted_number); | |
876 EXPECT_EQ("424 123 1234", formatted_number); | |
877 } | |
878 | |
879 TEST_F(PhoneNumberUtilTest, FormatWithPreferredCarrierCode) { | |
880 // We only support this for AR in our test metadata. | |
881 PhoneNumber ar_number; | |
882 string formatted_number; | |
883 ar_number.set_country_code(54); | |
884 ar_number.set_national_number(91234125678ULL); | |
885 // Test formatting with no preferred carrier code stored in the number itself. | |
886 phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15", | |
887 &formatted_number); | |
888 EXPECT_EQ("01234 15 12-5678", formatted_number); | |
889 phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "", | |
890 &formatted_number); | |
891 EXPECT_EQ("01234 12-5678", formatted_number); | |
892 // Test formatting with preferred carrier code present. | |
893 ar_number.set_preferred_domestic_carrier_code("19"); | |
894 phone_util_.Format(ar_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
895 EXPECT_EQ("01234 12-5678", formatted_number); | |
896 phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15", | |
897 &formatted_number); | |
898 EXPECT_EQ("01234 19 12-5678", formatted_number); | |
899 phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "", | |
900 &formatted_number); | |
901 EXPECT_EQ("01234 19 12-5678", formatted_number); | |
902 // When the preferred_domestic_carrier_code is present (even when it contains | |
903 // an empty string), use it instead of the default carrier code passed in. | |
904 ar_number.set_preferred_domestic_carrier_code(""); | |
905 phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15", | |
906 &formatted_number); | |
907 EXPECT_EQ("01234 12-5678", formatted_number); | |
908 // We don't support this for the US so there should be no change. | |
909 PhoneNumber us_number; | |
910 us_number.set_country_code(1); | |
911 us_number.set_national_number(4241231234ULL); | |
912 us_number.set_preferred_domestic_carrier_code("99"); | |
913 phone_util_.Format(us_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
914 EXPECT_EQ("424 123 1234", formatted_number); | |
915 phone_util_.FormatNationalNumberWithPreferredCarrierCode(us_number, "15", | |
916 &formatted_number); | |
917 EXPECT_EQ("424 123 1234", formatted_number); | |
918 } | |
919 | |
920 TEST_F(PhoneNumberUtilTest, FormatByPattern) { | |
921 PhoneNumber test_number; | |
922 string formatted_number; | |
923 test_number.set_country_code(1); | |
924 test_number.set_national_number(6502530000ULL); | |
925 | |
926 RepeatedPtrField<NumberFormat> number_formats; | |
927 NumberFormat* number_format = number_formats.Add(); | |
928 number_format->set_pattern("(\\d{3})(\\d{3})(\\d{4})"); | |
929 number_format->set_format("($1) $2-$3"); | |
930 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL, | |
931 number_formats, | |
932 &formatted_number); | |
933 EXPECT_EQ("(650) 253-0000", formatted_number); | |
934 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL, | |
935 number_formats, | |
936 &formatted_number); | |
937 EXPECT_EQ("+1 (650) 253-0000", formatted_number); | |
938 | |
939 // $NP is set to '1' for the US. Here we check that for other NANPA countries | |
940 // the US rules are followed. | |
941 number_format->set_national_prefix_formatting_rule("$NP ($FG)"); | |
942 number_format->set_format("$1 $2-$3"); | |
943 test_number.set_country_code(1); | |
944 test_number.set_national_number(4168819999ULL); | |
945 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL, | |
946 number_formats, | |
947 &formatted_number); | |
948 EXPECT_EQ("1 (416) 881-9999", formatted_number); | |
949 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL, | |
950 number_formats, | |
951 &formatted_number); | |
952 EXPECT_EQ("+1 416 881-9999", formatted_number); | |
953 | |
954 test_number.set_country_code(39); | |
955 test_number.set_national_number(236618300ULL); | |
956 test_number.set_italian_leading_zero(true); | |
957 number_format->set_pattern("(\\d{2})(\\d{5})(\\d{3})"); | |
958 number_format->set_format("$1-$2 $3"); | |
959 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL, | |
960 number_formats, | |
961 &formatted_number); | |
962 EXPECT_EQ("02-36618 300", formatted_number); | |
963 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL, | |
964 number_formats, | |
965 &formatted_number); | |
966 EXPECT_EQ("+39 02-36618 300", formatted_number); | |
967 | |
968 test_number.set_country_code(44); | |
969 test_number.set_national_number(2012345678ULL); | |
970 test_number.set_italian_leading_zero(false); | |
971 number_format->set_national_prefix_formatting_rule("$NP$FG"); | |
972 number_format->set_pattern("(\\d{2})(\\d{4})(\\d{4})"); | |
973 number_format->set_format("$1 $2 $3"); | |
974 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL, | |
975 number_formats, | |
976 &formatted_number); | |
977 EXPECT_EQ("020 1234 5678", formatted_number); | |
978 | |
979 number_format->set_national_prefix_formatting_rule("($NP$FG)"); | |
980 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL, | |
981 number_formats, | |
982 &formatted_number); | |
983 EXPECT_EQ("(020) 1234 5678", formatted_number); | |
984 number_format->set_national_prefix_formatting_rule(""); | |
985 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL, | |
986 number_formats, | |
987 &formatted_number); | |
988 EXPECT_EQ("20 1234 5678", formatted_number); | |
989 number_format->set_national_prefix_formatting_rule(""); | |
990 phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL, | |
991 number_formats, | |
992 &formatted_number); | |
993 EXPECT_EQ("+44 20 1234 5678", formatted_number); | |
994 } | |
995 | |
996 TEST_F(PhoneNumberUtilTest, FormatE164Number) { | |
997 PhoneNumber test_number; | |
998 string formatted_number; | |
999 test_number.set_country_code(1); | |
1000 test_number.set_national_number(6502530000ULL); | |
1001 phone_util_.Format(test_number, PhoneNumberUtil::E164, &formatted_number); | |
1002 EXPECT_EQ("+16502530000", formatted_number); | |
1003 | |
1004 test_number.set_country_code(49); | |
1005 test_number.set_national_number(301234ULL); | |
1006 phone_util_.Format(test_number, PhoneNumberUtil::E164, &formatted_number); | |
1007 EXPECT_EQ("+49301234", formatted_number); | |
1008 } | |
1009 | |
1010 TEST_F(PhoneNumberUtilTest, FormatNumberWithExtension) { | |
1011 PhoneNumber nz_number; | |
1012 nz_number.set_country_code(64); | |
1013 nz_number.set_national_number(33316005ULL); | |
1014 nz_number.set_extension("1234"); | |
1015 string formatted_number; | |
1016 // Uses default extension prefix: | |
1017 phone_util_.Format(nz_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
1018 EXPECT_EQ("03-331 6005 ext. 1234", formatted_number); | |
1019 // Uses RFC 3966 syntax. | |
1020 phone_util_.Format(nz_number, PhoneNumberUtil::RFC3966, &formatted_number); | |
1021 EXPECT_EQ("+64-3-331-6005;ext=1234", formatted_number); | |
1022 // Extension prefix overridden in the territory information for the US: | |
1023 PhoneNumber us_number_with_extension; | |
1024 us_number_with_extension.set_country_code(1); | |
1025 us_number_with_extension.set_national_number(6502530000ULL); | |
1026 us_number_with_extension.set_extension("4567"); | |
1027 phone_util_.Format(us_number_with_extension, | |
1028 PhoneNumberUtil::NATIONAL, &formatted_number); | |
1029 EXPECT_EQ("650 253 0000 extn. 4567", formatted_number); | |
1030 } | |
1031 | |
1032 TEST_F(PhoneNumberUtilTest, GetLengthOfGeographicalAreaCode) { | |
1033 PhoneNumber number; | |
1034 // Google MTV, which has area code "650". | |
1035 number.set_country_code(1); | |
1036 number.set_national_number(6502530000ULL); | |
1037 EXPECT_EQ(3, phone_util_.GetLengthOfGeographicalAreaCode(number)); | |
1038 | |
1039 // A North America toll-free number, which has no area code. | |
1040 number.set_country_code(1); | |
1041 number.set_national_number(8002530000ULL); | |
1042 EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number)); | |
1043 | |
1044 // An invalid US number (1 digit shorter), which has no area code. | |
1045 number.set_country_code(1); | |
1046 number.set_national_number(650253000ULL); | |
1047 EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number)); | |
1048 | |
1049 // Google London, which has area code "20". | |
1050 number.set_country_code(44); | |
1051 number.set_national_number(2070313000ULL); | |
1052 EXPECT_EQ(2, phone_util_.GetLengthOfGeographicalAreaCode(number)); | |
1053 | |
1054 // A UK mobile phone, which has no area code. | |
1055 number.set_country_code(44); | |
1056 number.set_national_number(7123456789ULL); | |
1057 EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number)); | |
1058 | |
1059 // Google Buenos Aires, which has area code "11". | |
1060 number.set_country_code(54); | |
1061 number.set_national_number(1155303000ULL); | |
1062 EXPECT_EQ(2, phone_util_.GetLengthOfGeographicalAreaCode(number)); | |
1063 | |
1064 // Google Sydney, which has area code "2". | |
1065 number.set_country_code(61); | |
1066 number.set_national_number(293744000ULL); | |
1067 EXPECT_EQ(1, phone_util_.GetLengthOfGeographicalAreaCode(number)); | |
1068 | |
1069 // Google Singapore. Singapore has no area code and no national prefix. | |
1070 number.set_country_code(65); | |
1071 number.set_national_number(65218000ULL); | |
1072 EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number)); | |
1073 } | |
1074 | |
1075 TEST_F(PhoneNumberUtilTest, GetLengthOfNationalDestinationCode) { | |
1076 PhoneNumber number; | |
1077 // Google MTV, which has national destination code (NDC) "650". | |
1078 number.set_country_code(1); | |
1079 number.set_national_number(6502530000ULL); | |
1080 EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1081 | |
1082 // A North America toll-free number, which has NDC "800". | |
1083 number.set_country_code(1); | |
1084 number.set_national_number(8002530000ULL); | |
1085 EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1086 | |
1087 // Google London, which has NDC "20". | |
1088 number.set_country_code(44); | |
1089 number.set_national_number(2070313000ULL); | |
1090 EXPECT_EQ(2, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1091 | |
1092 // A UK mobile phone, which has NDC "7123" | |
1093 number.set_country_code(44); | |
1094 number.set_national_number(7123456789ULL); | |
1095 EXPECT_EQ(4, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1096 | |
1097 // Google Buenos Aires, which has NDC "11". | |
1098 number.set_country_code(54); | |
1099 number.set_national_number(1155303000ULL); | |
1100 EXPECT_EQ(2, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1101 | |
1102 // Google Sydney, which has NDC "2". | |
1103 number.set_country_code(61); | |
1104 number.set_national_number(293744000ULL); | |
1105 EXPECT_EQ(1, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1106 | |
1107 // Google Singapore. Singapore has NDC "6521". | |
1108 number.set_country_code(65); | |
1109 number.set_national_number(65218000ULL); | |
1110 EXPECT_EQ(4, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1111 | |
1112 // An invalid US number (1 digit shorter), which has no NDC. | |
1113 number.set_country_code(1); | |
1114 number.set_national_number(650253000ULL); | |
1115 EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1116 | |
1117 // A number containing an invalid country code, which shouldn't have any NDC. | |
1118 number.set_country_code(123); | |
1119 number.set_national_number(650253000ULL); | |
1120 EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1121 | |
1122 // A number that has only one group of digits after country code when | |
1123 // formatted in the international format. | |
1124 number.set_country_code(376); | |
1125 number.set_national_number(12345ULL); | |
1126 EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1127 | |
1128 // The same number above, but with an extension. | |
1129 number.set_country_code(376); | |
1130 number.set_national_number(12345ULL); | |
1131 number.set_extension("321"); | |
1132 EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number)); | |
1133 } | |
1134 | |
1135 TEST_F(PhoneNumberUtilTest, ExtractPossibleNumber) { | |
1136 // Removes preceding funky punctuation and letters but leaves the rest | |
1137 // untouched. | |
1138 string extracted_number; | |
1139 ExtractPossibleNumber("Tel:0800-345-600", &extracted_number); | |
1140 EXPECT_EQ("0800-345-600", extracted_number); | |
1141 ExtractPossibleNumber("Tel:0800 FOR PIZZA", &extracted_number); | |
1142 EXPECT_EQ("0800 FOR PIZZA", extracted_number); | |
1143 | |
1144 // Should not remove plus sign. | |
1145 ExtractPossibleNumber("Tel:+800-345-600", &extracted_number); | |
1146 EXPECT_EQ("+800-345-600", extracted_number); | |
1147 // Should recognise wide digits as possible start values. | |
1148 ExtractPossibleNumber("\xEF\xBC\x90\xEF\xBC\x92\xEF\xBC\x93", &extracted_numbe
r); | |
1149 EXPECT_EQ("\xEF\xBC\x90\xEF\xBC\x92\xEF\xBC\x93", extracted_number); | |
1150 // Dashes are not possible start values and should be removed. | |
1151 ExtractPossibleNumber("Num-\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93", &extracted_n
umber); | |
1152 EXPECT_EQ("\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93", extracted_number); | |
1153 // If not possible number present, return empty string. | |
1154 ExtractPossibleNumber("Num-....", &extracted_number); | |
1155 EXPECT_EQ("", extracted_number); | |
1156 // Leading brackets are stripped - these are not used when parsing. | |
1157 ExtractPossibleNumber("(650) 253-0000", &extracted_number); | |
1158 EXPECT_EQ("650) 253-0000", extracted_number); | |
1159 | |
1160 // Trailing non-alpha-numeric characters should be removed. | |
1161 ExtractPossibleNumber("(650) 253-0000..- ..", &extracted_number); | |
1162 EXPECT_EQ("650) 253-0000", extracted_number); | |
1163 ExtractPossibleNumber("(650) 253-0000.", &extracted_number); | |
1164 EXPECT_EQ("650) 253-0000", extracted_number); | |
1165 // This case has a trailing RTL char. | |
1166 ExtractPossibleNumber("(650) 253-0000\xE2\x80\x8F", &extracted_number); | |
1167 EXPECT_EQ("650) 253-0000", extracted_number); | |
1168 } | |
1169 | |
1170 TEST_F(PhoneNumberUtilTest, IsNANPACountry) { | |
1171 EXPECT_TRUE(phone_util_.IsNANPACountry(RegionCode::US())); | |
1172 EXPECT_TRUE(phone_util_.IsNANPACountry(RegionCode::BS())); | |
1173 } | |
1174 | |
1175 TEST_F(PhoneNumberUtilTest, IsValidNumber) { | |
1176 PhoneNumber us_number; | |
1177 us_number.set_country_code(1); | |
1178 us_number.set_national_number(6502530000ULL); | |
1179 EXPECT_TRUE(phone_util_.IsValidNumber(us_number)); | |
1180 | |
1181 PhoneNumber it_number; | |
1182 it_number.set_country_code(39); | |
1183 it_number.set_national_number(236618300ULL); | |
1184 it_number.set_italian_leading_zero(true); | |
1185 EXPECT_TRUE(phone_util_.IsValidNumber(it_number)); | |
1186 | |
1187 PhoneNumber gb_number; | |
1188 gb_number.set_country_code(44); | |
1189 gb_number.set_national_number(7912345678ULL); | |
1190 EXPECT_TRUE(phone_util_.IsValidNumber(gb_number)); | |
1191 | |
1192 PhoneNumber nz_number; | |
1193 nz_number.set_country_code(64); | |
1194 nz_number.set_national_number(21387835ULL); | |
1195 EXPECT_TRUE(phone_util_.IsValidNumber(nz_number)); | |
1196 } | |
1197 | |
1198 TEST_F(PhoneNumberUtilTest, IsValidForRegion) { | |
1199 // This number is valid for the Bahamas, but is not a valid US number. | |
1200 PhoneNumber bs_number; | |
1201 bs_number.set_country_code(1); | |
1202 bs_number.set_national_number(2423232345ULL); | |
1203 EXPECT_TRUE(phone_util_.IsValidNumber(bs_number)); | |
1204 EXPECT_TRUE(phone_util_.IsValidNumberForRegion(bs_number, RegionCode::BS())); | |
1205 EXPECT_FALSE(phone_util_.IsValidNumberForRegion(bs_number, RegionCode::US())); | |
1206 bs_number.set_national_number(2421232345ULL); | |
1207 // This number is no longer valid. | |
1208 EXPECT_FALSE(phone_util_.IsValidNumber(bs_number)); | |
1209 | |
1210 // La Mayotte and R\xC3\xA9union use 'leadingDigits' to differentiate them. | |
1211 PhoneNumber re_number; | |
1212 re_number.set_country_code(262); | |
1213 re_number.set_national_number(262123456ULL); | |
1214 EXPECT_TRUE(phone_util_.IsValidNumber(re_number)); | |
1215 EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE())); | |
1216 EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT())); | |
1217 // Now change the number to be a number for La Mayotte. | |
1218 re_number.set_national_number(269601234ULL); | |
1219 EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT())); | |
1220 EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE())); | |
1221 // This number is no longer valid. | |
1222 re_number.set_national_number(269123456ULL); | |
1223 EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT())); | |
1224 EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE())); | |
1225 EXPECT_FALSE(phone_util_.IsValidNumber(re_number)); | |
1226 // However, it should be recognised as from La Mayotte. | |
1227 string region_code; | |
1228 phone_util_.GetRegionCodeForNumber(re_number, ®ion_code); | |
1229 EXPECT_EQ(RegionCode::YT(), region_code); | |
1230 // This number is valid in both places. | |
1231 re_number.set_national_number(800123456ULL); | |
1232 EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT())); | |
1233 EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE())); | |
1234 } | |
1235 | |
1236 TEST_F(PhoneNumberUtilTest, IsNotValidNumber) { | |
1237 PhoneNumber us_number; | |
1238 us_number.set_country_code(1); | |
1239 us_number.set_national_number(2530000ULL); | |
1240 EXPECT_FALSE(phone_util_.IsValidNumber(us_number)); | |
1241 | |
1242 PhoneNumber it_number; | |
1243 it_number.set_country_code(39); | |
1244 it_number.set_national_number(23661830000ULL); | |
1245 it_number.set_italian_leading_zero(true); | |
1246 EXPECT_FALSE(phone_util_.IsValidNumber(it_number)); | |
1247 | |
1248 PhoneNumber gb_number; | |
1249 gb_number.set_country_code(44); | |
1250 gb_number.set_national_number(791234567ULL); | |
1251 EXPECT_FALSE(phone_util_.IsValidNumber(gb_number)); | |
1252 | |
1253 PhoneNumber de_number; | |
1254 de_number.set_country_code(49); | |
1255 de_number.set_national_number(1234ULL); | |
1256 EXPECT_FALSE(phone_util_.IsValidNumber(de_number)); | |
1257 | |
1258 PhoneNumber nz_number; | |
1259 nz_number.set_country_code(64); | |
1260 nz_number.set_national_number(3316005ULL); | |
1261 EXPECT_FALSE(phone_util_.IsValidNumber(nz_number)); | |
1262 } | |
1263 | |
1264 TEST_F(PhoneNumberUtilTest, IsPossibleNumber) { | |
1265 PhoneNumber number; | |
1266 number.set_country_code(1); | |
1267 number.set_national_number(6502530000ULL); | |
1268 EXPECT_TRUE(phone_util_.IsPossibleNumber(number)); | |
1269 | |
1270 number.set_country_code(1); | |
1271 number.set_national_number(2530000ULL); | |
1272 EXPECT_TRUE(phone_util_.IsPossibleNumber(number)); | |
1273 | |
1274 number.set_country_code(44); | |
1275 number.set_national_number(2070313000ULL); | |
1276 EXPECT_TRUE(phone_util_.IsPossibleNumber(number)); | |
1277 | |
1278 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 253 0000", | |
1279 RegionCode::US())); | |
1280 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 GOO OGLE", | |
1281 RegionCode::US())); | |
1282 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("(650) 253-0000", | |
1283 RegionCode::US())); | |
1284 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("253-0000", | |
1285 RegionCode::US())); | |
1286 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 253 0000", | |
1287 RegionCode::GB())); | |
1288 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+44 20 7031 3000", | |
1289 RegionCode::GB())); | |
1290 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("(020) 7031 3000", | |
1291 RegionCode::GB())); | |
1292 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("7031 3000", | |
1293 RegionCode::GB())); | |
1294 EXPECT_TRUE(phone_util_.IsPossibleNumberForString("3331 6005", | |
1295 RegionCode::NZ())); | |
1296 } | |
1297 | |
1298 TEST_F(PhoneNumberUtilTest, IsPossibleNumberWithReason) { | |
1299 // FYI, national numbers for country code +1 that are within 7 to 10 digits | |
1300 // are possible. | |
1301 PhoneNumber number; | |
1302 number.set_country_code(1); | |
1303 number.set_national_number(6502530000ULL); | |
1304 EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE, | |
1305 phone_util_.IsPossibleNumberWithReason(number)); | |
1306 | |
1307 number.set_country_code(1); | |
1308 number.set_national_number(2530000ULL); | |
1309 EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE, | |
1310 phone_util_.IsPossibleNumberWithReason(number)); | |
1311 | |
1312 number.set_country_code(0); | |
1313 number.set_national_number(2530000ULL); | |
1314 EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE, | |
1315 phone_util_.IsPossibleNumberWithReason(number)); | |
1316 | |
1317 number.set_country_code(1); | |
1318 number.set_national_number(253000ULL); | |
1319 EXPECT_EQ(PhoneNumberUtil::TOO_SHORT, | |
1320 phone_util_.IsPossibleNumberWithReason(number)); | |
1321 | |
1322 number.set_country_code(1); | |
1323 number.set_national_number(65025300000ULL); | |
1324 EXPECT_EQ(PhoneNumberUtil::TOO_LONG, | |
1325 phone_util_.IsPossibleNumberWithReason(number)); | |
1326 | |
1327 number.set_country_code(44); | |
1328 number.set_national_number(2070310000ULL); | |
1329 EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE, | |
1330 phone_util_.IsPossibleNumberWithReason(number)); | |
1331 | |
1332 number.set_country_code(49); | |
1333 number.set_national_number(30123456ULL); | |
1334 EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE, | |
1335 phone_util_.IsPossibleNumberWithReason(number)); | |
1336 | |
1337 number.set_country_code(65); | |
1338 number.set_national_number(1234567890ULL); | |
1339 EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE, | |
1340 phone_util_.IsPossibleNumberWithReason(number)); | |
1341 | |
1342 // Try with number that we don't have metadata for. | |
1343 PhoneNumber ad_number; | |
1344 ad_number.set_country_code(376); | |
1345 ad_number.set_national_number(12345ULL); | |
1346 EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE, | |
1347 phone_util_.IsPossibleNumberWithReason(ad_number)); | |
1348 ad_number.set_country_code(376); | |
1349 ad_number.set_national_number(13ULL); | |
1350 EXPECT_EQ(PhoneNumberUtil::TOO_SHORT, | |
1351 phone_util_.IsPossibleNumberWithReason(ad_number)); | |
1352 ad_number.set_country_code(376); | |
1353 ad_number.set_national_number(1234567890123456ULL); | |
1354 EXPECT_EQ(PhoneNumberUtil::TOO_LONG, | |
1355 phone_util_.IsPossibleNumberWithReason(ad_number)); | |
1356 } | |
1357 | |
1358 TEST_F(PhoneNumberUtilTest, IsNotPossibleNumber) { | |
1359 PhoneNumber number; | |
1360 number.set_country_code(1); | |
1361 number.set_national_number(65025300000ULL); | |
1362 EXPECT_FALSE(phone_util_.IsPossibleNumber(number)); | |
1363 | |
1364 number.set_country_code(1); | |
1365 number.set_national_number(253000ULL); | |
1366 EXPECT_FALSE(phone_util_.IsPossibleNumber(number)); | |
1367 | |
1368 number.set_country_code(44); | |
1369 number.set_national_number(300ULL); | |
1370 EXPECT_FALSE(phone_util_.IsPossibleNumber(number)); | |
1371 | |
1372 EXPECT_FALSE(phone_util_.IsPossibleNumberForString("+1 650 253 00000", | |
1373 RegionCode::US())); | |
1374 EXPECT_FALSE(phone_util_.IsPossibleNumberForString("(650) 253-00000", | |
1375 RegionCode::US())); | |
1376 EXPECT_FALSE(phone_util_.IsPossibleNumberForString("I want a Pizza", | |
1377 RegionCode::US())); | |
1378 EXPECT_FALSE(phone_util_.IsPossibleNumberForString("253-000", | |
1379 RegionCode::US())); | |
1380 EXPECT_FALSE(phone_util_.IsPossibleNumberForString("1 3000", | |
1381 RegionCode::GB())); | |
1382 EXPECT_FALSE(phone_util_.IsPossibleNumberForString("+44 300", | |
1383 RegionCode::GB())); | |
1384 } | |
1385 | |
1386 TEST_F(PhoneNumberUtilTest, TruncateTooLongNumber) { | |
1387 // US number 650-253-0000, but entered with one additional digit at the end. | |
1388 PhoneNumber too_long_number; | |
1389 too_long_number.set_country_code(1); | |
1390 too_long_number.set_national_number(65025300001ULL); | |
1391 PhoneNumber valid_number; | |
1392 valid_number.set_country_code(1); | |
1393 valid_number.set_national_number(6502530000ULL); | |
1394 EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number)); | |
1395 EXPECT_EQ(valid_number, too_long_number); | |
1396 | |
1397 // GB number 080 1234 5678, but entered with 4 extra digits at the end. | |
1398 too_long_number.set_country_code(44); | |
1399 too_long_number.set_national_number(80123456780123ULL); | |
1400 valid_number.set_country_code(44); | |
1401 valid_number.set_national_number(8012345678ULL); | |
1402 EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number)); | |
1403 EXPECT_EQ(valid_number, too_long_number); | |
1404 | |
1405 // IT number 022 3456 7890, but entered with 3 extra digits at the end. | |
1406 too_long_number.set_country_code(39); | |
1407 too_long_number.set_national_number(2234567890123ULL); | |
1408 too_long_number.set_italian_leading_zero(true); | |
1409 valid_number.set_country_code(39); | |
1410 valid_number.set_national_number(2234567890ULL); | |
1411 valid_number.set_italian_leading_zero(true); | |
1412 EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number)); | |
1413 EXPECT_EQ(valid_number, too_long_number); | |
1414 | |
1415 // Tests what happens when a valid number is passed in. | |
1416 PhoneNumber valid_number_copy(valid_number); | |
1417 EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&valid_number)); | |
1418 // Tests the number is not modified. | |
1419 EXPECT_EQ(valid_number_copy, valid_number); | |
1420 | |
1421 // Tests what happens when a number with invalid prefix is passed in. | |
1422 PhoneNumber number_with_invalid_prefix; | |
1423 number_with_invalid_prefix.set_country_code(1); | |
1424 // The test metadata says US numbers cannot have prefix 240. | |
1425 number_with_invalid_prefix.set_national_number(2401234567ULL); | |
1426 PhoneNumber invalid_number_copy(number_with_invalid_prefix); | |
1427 EXPECT_FALSE(phone_util_.TruncateTooLongNumber(&number_with_invalid_prefix)); | |
1428 // Tests the number is not modified. | |
1429 EXPECT_EQ(invalid_number_copy, number_with_invalid_prefix); | |
1430 | |
1431 // Tests what happens when a too short number is passed in. | |
1432 PhoneNumber too_short_number; | |
1433 too_short_number.set_country_code(1); | |
1434 too_short_number.set_national_number(1234ULL); | |
1435 PhoneNumber too_short_number_copy(too_short_number); | |
1436 EXPECT_FALSE(phone_util_.TruncateTooLongNumber(&too_short_number)); | |
1437 // Tests the number is not modified. | |
1438 EXPECT_EQ(too_short_number_copy, too_short_number); | |
1439 } | |
1440 | |
1441 TEST_F(PhoneNumberUtilTest, IsLeadingZeroPossible) { | |
1442 EXPECT_TRUE(IsLeadingZeroPossible(39)); // Italy | |
1443 EXPECT_FALSE(IsLeadingZeroPossible(1)); // USA | |
1444 EXPECT_FALSE(IsLeadingZeroPossible(800)); // Not in metadata file, should | |
1445 // return default value of false. | |
1446 } | |
1447 | |
1448 TEST_F(PhoneNumberUtilTest, FormatUsingOriginalNumberFormat) { | |
1449 PhoneNumber phone_number; | |
1450 string formatted_number; | |
1451 | |
1452 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1453 phone_util_.ParseAndKeepRawInput("+442087654321", RegionCode::GB(), | |
1454 &phone_number)); | |
1455 phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(), | |
1456 &formatted_number); | |
1457 EXPECT_EQ("+44 20 8765 4321", formatted_number); | |
1458 | |
1459 phone_number.Clear(); | |
1460 formatted_number.clear(); | |
1461 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1462 phone_util_.ParseAndKeepRawInput("02087654321", RegionCode::GB(), | |
1463 &phone_number)); | |
1464 phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(), | |
1465 &formatted_number); | |
1466 EXPECT_EQ("(020) 8765 4321", formatted_number); | |
1467 | |
1468 phone_number.Clear(); | |
1469 formatted_number.clear(); | |
1470 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1471 phone_util_.ParseAndKeepRawInput("011442087654321", | |
1472 RegionCode::US(), &phone_number)); | |
1473 phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(), | |
1474 &formatted_number); | |
1475 EXPECT_EQ("011 44 20 8765 4321", formatted_number); | |
1476 | |
1477 phone_number.Clear(); | |
1478 formatted_number.clear(); | |
1479 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1480 phone_util_.ParseAndKeepRawInput("442087654321", RegionCode::GB(), | |
1481 &phone_number)); | |
1482 phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(), | |
1483 &formatted_number); | |
1484 EXPECT_EQ("44 20 8765 4321", formatted_number); | |
1485 | |
1486 phone_number.Clear(); | |
1487 formatted_number.clear(); | |
1488 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1489 phone_util_.Parse("+442087654321", RegionCode::GB(), | |
1490 &phone_number)); | |
1491 phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(), | |
1492 &formatted_number); | |
1493 EXPECT_EQ("(020) 8765 4321", formatted_number); | |
1494 } | |
1495 | |
1496 TEST_F(PhoneNumberUtilTest, IsPremiumRate) { | |
1497 PhoneNumber number; | |
1498 number.set_country_code(1); | |
1499 number.set_national_number(9004433030ULL); | |
1500 EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number)); | |
1501 | |
1502 number.set_country_code(39); | |
1503 number.set_national_number(892123ULL); | |
1504 EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number)); | |
1505 | |
1506 number.set_country_code(44); | |
1507 number.set_national_number(9187654321ULL); | |
1508 EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number)); | |
1509 | |
1510 number.set_country_code(49); | |
1511 number.set_national_number(9001654321ULL); | |
1512 EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number)); | |
1513 | |
1514 number.set_country_code(49); | |
1515 number.set_national_number(90091234567ULL); | |
1516 EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number)); | |
1517 } | |
1518 | |
1519 TEST_F(PhoneNumberUtilTest, IsTollFree) { | |
1520 PhoneNumber number; | |
1521 number.set_country_code(1); | |
1522 number.set_national_number(8881234567ULL); | |
1523 EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number)); | |
1524 | |
1525 number.set_country_code(39); | |
1526 number.set_national_number(803123ULL); | |
1527 EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number)); | |
1528 | |
1529 number.set_country_code(44); | |
1530 number.set_national_number(8012345678ULL); | |
1531 EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number)); | |
1532 | |
1533 number.set_country_code(49); | |
1534 number.set_national_number(8001234567ULL); | |
1535 EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number)); | |
1536 } | |
1537 | |
1538 TEST_F(PhoneNumberUtilTest, IsMobile) { | |
1539 PhoneNumber number; | |
1540 // A Bahama mobile number | |
1541 number.set_country_code(1); | |
1542 number.set_national_number(2423570000ULL); | |
1543 EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number)); | |
1544 | |
1545 number.set_country_code(39); | |
1546 number.set_national_number(312345678ULL); | |
1547 EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number)); | |
1548 | |
1549 number.set_country_code(44); | |
1550 number.set_national_number(7912345678ULL); | |
1551 EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number)); | |
1552 | |
1553 number.set_country_code(49); | |
1554 number.set_national_number(15123456789ULL); | |
1555 EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number)); | |
1556 | |
1557 number.set_country_code(54); | |
1558 number.set_national_number(91187654321ULL); | |
1559 EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number)); | |
1560 } | |
1561 | |
1562 TEST_F(PhoneNumberUtilTest, IsFixedLine) { | |
1563 PhoneNumber number; | |
1564 // A Bahama fixed-line number | |
1565 number.set_country_code(1); | |
1566 number.set_national_number(2423651234ULL); | |
1567 EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number)); | |
1568 | |
1569 // An Italian fixed-line number | |
1570 number.Clear(); | |
1571 number.set_country_code(39); | |
1572 number.set_national_number(236618300ULL); | |
1573 number.set_italian_leading_zero(true); | |
1574 EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number)); | |
1575 | |
1576 number.Clear(); | |
1577 number.set_country_code(44); | |
1578 number.set_national_number(2012345678ULL); | |
1579 EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number)); | |
1580 | |
1581 number.set_country_code(49); | |
1582 number.set_national_number(301234ULL); | |
1583 EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number)); | |
1584 } | |
1585 | |
1586 TEST_F(PhoneNumberUtilTest, IsFixedLineAndMobile) { | |
1587 PhoneNumber number; | |
1588 number.set_country_code(1); | |
1589 number.set_national_number(6502531111ULL); | |
1590 EXPECT_EQ(PhoneNumberUtil::FIXED_LINE_OR_MOBILE, | |
1591 phone_util_.GetNumberType(number)); | |
1592 | |
1593 number.set_country_code(54); | |
1594 number.set_national_number(1987654321ULL); | |
1595 EXPECT_EQ(PhoneNumberUtil::FIXED_LINE_OR_MOBILE, | |
1596 phone_util_.GetNumberType(number)); | |
1597 } | |
1598 | |
1599 TEST_F(PhoneNumberUtilTest, IsSharedCost) { | |
1600 PhoneNumber number; | |
1601 number.set_country_code(44); | |
1602 number.set_national_number(8431231234ULL); | |
1603 EXPECT_EQ(PhoneNumberUtil::SHARED_COST, phone_util_.GetNumberType(number)); | |
1604 } | |
1605 | |
1606 TEST_F(PhoneNumberUtilTest, IsVoip) { | |
1607 PhoneNumber number; | |
1608 number.set_country_code(44); | |
1609 number.set_national_number(5631231234ULL); | |
1610 EXPECT_EQ(PhoneNumberUtil::VOIP, phone_util_.GetNumberType(number)); | |
1611 } | |
1612 | |
1613 TEST_F(PhoneNumberUtilTest, IsPersonalNumber) { | |
1614 PhoneNumber number; | |
1615 number.set_country_code(44); | |
1616 number.set_national_number(7031231234ULL); | |
1617 EXPECT_EQ(PhoneNumberUtil::PERSONAL_NUMBER, | |
1618 phone_util_.GetNumberType(number)); | |
1619 } | |
1620 | |
1621 TEST_F(PhoneNumberUtilTest, IsUnknown) { | |
1622 PhoneNumber number; | |
1623 number.set_country_code(1); | |
1624 number.set_national_number(65025311111ULL); | |
1625 EXPECT_EQ(PhoneNumberUtil::UNKNOWN, phone_util_.GetNumberType(number)); | |
1626 } | |
1627 | |
1628 TEST_F(PhoneNumberUtilTest, GetCountryCodeForRegion) { | |
1629 EXPECT_EQ(1, phone_util_.GetCountryCodeForRegion(RegionCode::US())); | |
1630 EXPECT_EQ(64, phone_util_.GetCountryCodeForRegion(RegionCode::NZ())); | |
1631 EXPECT_EQ(0, phone_util_.GetCountryCodeForRegion(RegionCode::GetUnknown())); | |
1632 // CS is already deprecated so the library doesn't support it. | |
1633 EXPECT_EQ(0, phone_util_.GetCountryCodeForRegion(RegionCode::CS())); | |
1634 } | |
1635 | |
1636 TEST_F(PhoneNumberUtilTest, GetNationalDiallingPrefixForRegion) { | |
1637 string ndd_prefix; | |
1638 GetNddPrefixForRegion(RegionCode::US(), false, &ndd_prefix); | |
1639 EXPECT_EQ("1", ndd_prefix); | |
1640 | |
1641 // Test non-main country to see it gets the national dialling prefix for the | |
1642 // main country with that country calling code. | |
1643 GetNddPrefixForRegion(RegionCode::BS(), false, &ndd_prefix); | |
1644 EXPECT_EQ("1", ndd_prefix); | |
1645 | |
1646 GetNddPrefixForRegion(RegionCode::NZ(), false, &ndd_prefix); | |
1647 EXPECT_EQ("0", ndd_prefix); | |
1648 | |
1649 // Test case with non digit in the national prefix. | |
1650 GetNddPrefixForRegion(RegionCode::AO(), false, &ndd_prefix); | |
1651 EXPECT_EQ("0~0", ndd_prefix); | |
1652 | |
1653 GetNddPrefixForRegion(RegionCode::AO(), true, &ndd_prefix); | |
1654 EXPECT_EQ("00", ndd_prefix); | |
1655 | |
1656 // Test cases with invalid regions. | |
1657 GetNddPrefixForRegion(RegionCode::GetUnknown(), false, &ndd_prefix); | |
1658 EXPECT_EQ("", ndd_prefix); | |
1659 | |
1660 // CS is already deprecated so the library doesn't support it. | |
1661 GetNddPrefixForRegion(RegionCode::CS(), false, &ndd_prefix); | |
1662 EXPECT_EQ("", ndd_prefix); | |
1663 } | |
1664 | |
1665 TEST_F(PhoneNumberUtilTest, IsViablePhoneNumber) { | |
1666 // Only one or two digits before strange non-possible punctuation. | |
1667 EXPECT_FALSE(IsViablePhoneNumber("12. March")); | |
1668 EXPECT_FALSE(IsViablePhoneNumber("1+1+1")); | |
1669 EXPECT_FALSE(IsViablePhoneNumber("80+0")); | |
1670 EXPECT_FALSE(IsViablePhoneNumber("00")); | |
1671 // Three digits is viable. | |
1672 EXPECT_TRUE(IsViablePhoneNumber("111")); | |
1673 // Alpha numbers. | |
1674 EXPECT_TRUE(IsViablePhoneNumber("0800-4-pizza")); | |
1675 EXPECT_TRUE(IsViablePhoneNumber("0800-4-PIZZA")); | |
1676 // Only one or two digits before possible punctuation followed by more digits. | |
1677 // The punctuation used here is the unicode character u+3000. | |
1678 EXPECT_TRUE(IsViablePhoneNumber("1\xE3\x80\x80" "34")); | |
1679 EXPECT_FALSE(IsViablePhoneNumber("1\xE3\x80\x80" "3+4")); | |
1680 // Unicode variants of possible starting character and other allowed | |
1681 // punctuation/digits. | |
1682 EXPECT_TRUE(IsViablePhoneNumber("\xEF\xBC\x88" "1\xEF\xBC\x89\xE3\x80\x80" "34
56789")); | |
1683 // Testing a leading + is okay. | |
1684 EXPECT_TRUE(IsViablePhoneNumber("+1\xEF\xBC\x89\xE3\x80\x80" "3456789")); | |
1685 } | |
1686 | |
1687 TEST_F(PhoneNumberUtilTest, ConvertAlphaCharactersInNumber) { | |
1688 string input("1800-ABC-DEF"); | |
1689 phone_util_.ConvertAlphaCharactersInNumber(&input); | |
1690 // Alpha chars are converted to digits; everything else is left untouched. | |
1691 static const string kExpectedOutput = "1800-222-333"; | |
1692 EXPECT_EQ(kExpectedOutput, input); | |
1693 | |
1694 // Try with some non-ASCII characters. | |
1695 input.assign("1\xE3\x80\x80\xEF\xBC\x88" "800) ABC-DEF"); | |
1696 static const string kExpectedFullwidthOutput = "1\xE3\x80\x80\xEF\xBC\x88" "80
0) 222-333"; | |
1697 phone_util_.ConvertAlphaCharactersInNumber(&input); | |
1698 EXPECT_EQ(kExpectedFullwidthOutput, input); | |
1699 } | |
1700 | |
1701 TEST_F(PhoneNumberUtilTest, NormaliseRemovePunctuation) { | |
1702 string input_number("034-56&+#234"); | |
1703 Normalize(&input_number); | |
1704 static const string kExpectedOutput("03456234"); | |
1705 EXPECT_EQ(kExpectedOutput, input_number) | |
1706 << "Conversion did not correctly remove punctuation"; | |
1707 } | |
1708 | |
1709 TEST_F(PhoneNumberUtilTest, NormaliseReplaceAlphaCharacters) { | |
1710 string input_number("034-I-am-HUNGRY"); | |
1711 Normalize(&input_number); | |
1712 static const string kExpectedOutput("034426486479"); | |
1713 EXPECT_EQ(kExpectedOutput, input_number) | |
1714 << "Conversion did not correctly replace alpha characters"; | |
1715 } | |
1716 | |
1717 TEST_F(PhoneNumberUtilTest, NormaliseOtherDigits) { | |
1718 // The first digit is a full-width 2, the last digit is an Arabic-indic digit | |
1719 // 5. | |
1720 string input_number("\xEF\xBC\x92" "5\xD9\xA5"); | |
1721 Normalize(&input_number); | |
1722 static const string kExpectedOutput("255"); | |
1723 EXPECT_EQ(kExpectedOutput, input_number) | |
1724 << "Conversion did not correctly replace non-latin digits"; | |
1725 // The first digit is an Eastern-Arabic 5, the latter an Eastern-Arabic 0. | |
1726 string eastern_arabic_input_number("\xDB\xB5" "2\xDB\xB0"); | |
1727 Normalize(&eastern_arabic_input_number); | |
1728 static const string kExpectedOutput2("520"); | |
1729 EXPECT_EQ(kExpectedOutput2, eastern_arabic_input_number) | |
1730 << "Conversion did not correctly replace non-latin digits"; | |
1731 } | |
1732 | |
1733 TEST_F(PhoneNumberUtilTest, NormaliseStripAlphaCharacters) { | |
1734 string input_number("034-56&+a#234"); | |
1735 phone_util_.NormalizeDigitsOnly(&input_number); | |
1736 static const string kExpectedOutput("03456234"); | |
1737 EXPECT_EQ(kExpectedOutput, input_number) | |
1738 << "Conversion did not correctly remove alpha characters"; | |
1739 } | |
1740 | |
1741 TEST_F(PhoneNumberUtilTest, MaybeStripInternationalPrefix) { | |
1742 string international_prefix("00[39]"); | |
1743 string number_to_strip("0034567700-3898003"); | |
1744 // Note the dash is removed as part of the normalization. | |
1745 string stripped_number("45677003898003"); | |
1746 EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD, | |
1747 MaybeStripInternationalPrefixAndNormalize(international_prefix, | |
1748 &number_to_strip)); | |
1749 EXPECT_EQ(stripped_number, number_to_strip) | |
1750 << "The number was not stripped of its international prefix."; | |
1751 | |
1752 // Now the number no longer starts with an IDD prefix, so it should now report | |
1753 // FROM_DEFAULT_COUNTRY. | |
1754 EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, | |
1755 MaybeStripInternationalPrefixAndNormalize(international_prefix, | |
1756 &number_to_strip)); | |
1757 | |
1758 number_to_strip.assign("00945677003898003"); | |
1759 EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD, | |
1760 MaybeStripInternationalPrefixAndNormalize(international_prefix, | |
1761 &number_to_strip)); | |
1762 EXPECT_EQ(stripped_number, number_to_strip) | |
1763 << "The number was not stripped of its international prefix."; | |
1764 | |
1765 // Test it works when the international prefix is broken up by spaces. | |
1766 number_to_strip.assign("00 9 45677003898003"); | |
1767 EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD, | |
1768 MaybeStripInternationalPrefixAndNormalize(international_prefix, | |
1769 &number_to_strip)); | |
1770 EXPECT_EQ(stripped_number, number_to_strip) | |
1771 << "The number was not stripped of its international prefix."; | |
1772 // Now the number no longer starts with an IDD prefix, so it should now report | |
1773 // FROM_DEFAULT_COUNTRY. | |
1774 EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, | |
1775 MaybeStripInternationalPrefixAndNormalize(international_prefix, | |
1776 &number_to_strip)); | |
1777 | |
1778 // Test the + symbol is also recognised and stripped. | |
1779 number_to_strip.assign("+45677003898003"); | |
1780 stripped_number.assign("45677003898003"); | |
1781 EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN, | |
1782 MaybeStripInternationalPrefixAndNormalize(international_prefix, | |
1783 &number_to_strip)); | |
1784 EXPECT_EQ(stripped_number, number_to_strip) | |
1785 << "The number supplied was not stripped of the plus symbol."; | |
1786 | |
1787 // If the number afterwards is a zero, we should not strip this - no country | |
1788 // code begins with 0. | |
1789 number_to_strip.assign("0090112-3123"); | |
1790 stripped_number.assign("00901123123"); | |
1791 EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, | |
1792 MaybeStripInternationalPrefixAndNormalize(international_prefix, | |
1793 &number_to_strip)); | |
1794 EXPECT_EQ(stripped_number, number_to_strip) | |
1795 << "The number had a 0 after the match so shouldn't be stripped."; | |
1796 // Here the 0 is separated by a space from the IDD. | |
1797 number_to_strip.assign("009 0-112-3123"); | |
1798 EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, | |
1799 MaybeStripInternationalPrefixAndNormalize(international_prefix, | |
1800 &number_to_strip)); | |
1801 } | |
1802 | |
1803 TEST_F(PhoneNumberUtilTest, MaybeStripNationalPrefixAndCarrierCode) { | |
1804 PhoneMetadata metadata; | |
1805 metadata.set_national_prefix_for_parsing("34"); | |
1806 metadata.mutable_general_desc()->set_national_number_pattern("\\d{4,8}"); | |
1807 string number_to_strip("34356778"); | |
1808 string stripped_number("356778"); | |
1809 string carrier_code; | |
1810 MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip, | |
1811 &carrier_code); | |
1812 EXPECT_EQ(stripped_number, number_to_strip) | |
1813 << "Should have had national prefix stripped."; | |
1814 EXPECT_EQ("", carrier_code) << "Should have had no carrier code stripped."; | |
1815 // Retry stripping - now the number should not start with the national prefix, | |
1816 // so no more stripping should occur. | |
1817 MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip, | |
1818 &carrier_code); | |
1819 EXPECT_EQ(stripped_number, number_to_strip) | |
1820 << "Should have had no change - no national prefix present."; | |
1821 // Some countries have no national prefix. Repeat test with none specified. | |
1822 metadata.clear_national_prefix_for_parsing(); | |
1823 MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip, | |
1824 &carrier_code); | |
1825 EXPECT_EQ(stripped_number, number_to_strip) | |
1826 << "Should have had no change - empty national prefix."; | |
1827 // If the resultant number doesn't match the national rule, it shouldn't be | |
1828 // stripped. | |
1829 metadata.set_national_prefix_for_parsing("3"); | |
1830 number_to_strip.assign("3123"); | |
1831 stripped_number.assign("3123"); | |
1832 MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip, | |
1833 &carrier_code); | |
1834 EXPECT_EQ(stripped_number, number_to_strip) | |
1835 << "Should have had no change - after stripping, it wouldn't have " | |
1836 << "matched the national rule."; | |
1837 // Test extracting carrier selection code. | |
1838 metadata.set_national_prefix_for_parsing("0(81)?"); | |
1839 number_to_strip.assign("08122123456"); | |
1840 stripped_number.assign("22123456"); | |
1841 MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip, | |
1842 &carrier_code); | |
1843 EXPECT_EQ("81", carrier_code) << "Should have had carrier code stripped."; | |
1844 EXPECT_EQ(stripped_number, number_to_strip) | |
1845 << "Should have had national prefix and carrier code stripped."; | |
1846 // If there was a transform rule, check it was applied. | |
1847 metadata.set_national_prefix_transform_rule("5$15"); | |
1848 // Note that a capturing group is present here. | |
1849 metadata.set_national_prefix_for_parsing("0(\\d{2})"); | |
1850 number_to_strip.assign("031123"); | |
1851 string transformed_number("5315123"); | |
1852 MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip, | |
1853 &carrier_code); | |
1854 EXPECT_EQ(transformed_number, number_to_strip) | |
1855 << "Was not successfully transformed."; | |
1856 } | |
1857 | |
1858 TEST_F(PhoneNumberUtilTest, MaybeStripExtension) { | |
1859 // One with extension. | |
1860 string number("1234576 ext. 1234"); | |
1861 string extension; | |
1862 string expected_extension("1234"); | |
1863 string stripped_number("1234576"); | |
1864 EXPECT_TRUE(MaybeStripExtension(&number, &extension)); | |
1865 EXPECT_EQ(stripped_number, number); | |
1866 EXPECT_EQ(expected_extension, extension); | |
1867 | |
1868 // One without extension. | |
1869 number.assign("1234-576"); | |
1870 extension.clear(); | |
1871 stripped_number.assign("1234-576"); | |
1872 EXPECT_FALSE(MaybeStripExtension(&number, &extension)); | |
1873 EXPECT_EQ(stripped_number, number); | |
1874 EXPECT_TRUE(extension.empty()); | |
1875 | |
1876 // One with an extension caught by the second capturing group in | |
1877 // kKnownExtnPatterns. | |
1878 number.assign("1234576-123#"); | |
1879 extension.clear(); | |
1880 expected_extension.assign("123"); | |
1881 stripped_number.assign("1234576"); | |
1882 EXPECT_TRUE(MaybeStripExtension(&number, &extension)); | |
1883 EXPECT_EQ(stripped_number, number); | |
1884 EXPECT_EQ(expected_extension, extension); | |
1885 | |
1886 number.assign("1234576 ext.123#"); | |
1887 extension.clear(); | |
1888 EXPECT_TRUE(MaybeStripExtension(&number, &extension)); | |
1889 EXPECT_EQ(stripped_number, number); | |
1890 EXPECT_EQ(expected_extension, extension); | |
1891 } | |
1892 | |
1893 TEST_F(PhoneNumberUtilTest, MaybeExtractCountryCode) { | |
1894 PhoneNumber number; | |
1895 const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::US()); | |
1896 // Note that for the US, the IDD is 011. | |
1897 string phone_number("011112-3456789"); | |
1898 string stripped_number("123456789"); | |
1899 int expected_country_code = 1; | |
1900 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1901 MaybeExtractCountryCode(metadata, true, &phone_number, &number)); | |
1902 EXPECT_EQ(expected_country_code, number.country_code()); | |
1903 EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD, number.country_code_source()); | |
1904 EXPECT_EQ(stripped_number, phone_number); | |
1905 | |
1906 number.Clear(); | |
1907 phone_number.assign("+6423456789"); | |
1908 stripped_number.assign("23456789"); | |
1909 expected_country_code = 64; | |
1910 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1911 MaybeExtractCountryCode(metadata, true, &phone_number, &number)); | |
1912 EXPECT_EQ(expected_country_code, number.country_code()); | |
1913 EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN, | |
1914 number.country_code_source()); | |
1915 EXPECT_EQ(stripped_number, phone_number); | |
1916 | |
1917 // Should not have extracted a country code - no international prefix present. | |
1918 number.Clear(); | |
1919 expected_country_code = 0; | |
1920 phone_number.assign("2345-6789"); | |
1921 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1922 MaybeExtractCountryCode(metadata, true, &phone_number, &number)); | |
1923 EXPECT_EQ(expected_country_code, number.country_code()); | |
1924 EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, number.country_code_source()); | |
1925 EXPECT_EQ(stripped_number, phone_number); | |
1926 | |
1927 expected_country_code = 0; | |
1928 phone_number.assign("0119991123456789"); | |
1929 stripped_number.assign(phone_number); | |
1930 EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR, | |
1931 MaybeExtractCountryCode(metadata, true, &phone_number, &number)); | |
1932 | |
1933 number.Clear(); | |
1934 phone_number.assign("(1 610) 619 4466"); | |
1935 stripped_number.assign("6106194466"); | |
1936 expected_country_code = 1; | |
1937 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1938 MaybeExtractCountryCode(metadata, true, &phone_number, &number)); | |
1939 EXPECT_EQ(expected_country_code, number.country_code()); | |
1940 EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITHOUT_PLUS_SIGN, | |
1941 number.country_code_source()); | |
1942 EXPECT_EQ(stripped_number, phone_number); | |
1943 | |
1944 number.Clear(); | |
1945 phone_number.assign("(1 610) 619 4466"); | |
1946 stripped_number.assign("6106194466"); | |
1947 expected_country_code = 1; | |
1948 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1949 MaybeExtractCountryCode(metadata, false, &phone_number, &number)); | |
1950 EXPECT_EQ(expected_country_code, number.country_code()); | |
1951 EXPECT_FALSE(number.has_country_code_source()); | |
1952 EXPECT_EQ(stripped_number, phone_number); | |
1953 | |
1954 // Should not have extracted a country code - invalid number after extraction | |
1955 // of uncertain country code. | |
1956 number.Clear(); | |
1957 phone_number.assign("(1 610) 619 446"); | |
1958 stripped_number.assign("1610619446"); | |
1959 expected_country_code = 0; | |
1960 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1961 MaybeExtractCountryCode(metadata, false, &phone_number, &number)); | |
1962 EXPECT_EQ(expected_country_code, number.country_code()); | |
1963 EXPECT_FALSE(number.has_country_code_source()); | |
1964 EXPECT_EQ(stripped_number, phone_number); | |
1965 | |
1966 number.Clear(); | |
1967 phone_number.assign("(1 610) 619"); | |
1968 stripped_number.assign("1610619"); | |
1969 expected_country_code = 0; | |
1970 // Should not have extracted a country code - invalid number both before and | |
1971 // after extraction of uncertain country code. | |
1972 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
1973 MaybeExtractCountryCode(metadata, true, &phone_number, &number)); | |
1974 EXPECT_EQ(expected_country_code, number.country_code()); | |
1975 EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, number.country_code_source()); | |
1976 EXPECT_EQ(stripped_number, phone_number); | |
1977 } | |
1978 | |
1979 TEST_F(PhoneNumberUtilTest, CountryWithNoNumberDesc) { | |
1980 string formatted_number; | |
1981 // Andorra is a country where we don't have PhoneNumberDesc info in the | |
1982 // metadata. | |
1983 PhoneNumber ad_number; | |
1984 ad_number.set_country_code(376); | |
1985 ad_number.set_national_number(12345ULL); | |
1986 phone_util_.Format(ad_number, PhoneNumberUtil::INTERNATIONAL, | |
1987 &formatted_number); | |
1988 EXPECT_EQ("+376 12345", formatted_number); | |
1989 phone_util_.Format(ad_number, PhoneNumberUtil::E164, &formatted_number); | |
1990 EXPECT_EQ("+37612345", formatted_number); | |
1991 phone_util_.Format(ad_number, PhoneNumberUtil::NATIONAL, &formatted_number); | |
1992 EXPECT_EQ("12345", formatted_number); | |
1993 EXPECT_EQ(PhoneNumberUtil::UNKNOWN, phone_util_.GetNumberType(ad_number)); | |
1994 EXPECT_TRUE(phone_util_.IsValidNumber(ad_number)); | |
1995 | |
1996 // Test dialing a US number from within Andorra. | |
1997 PhoneNumber us_number; | |
1998 us_number.set_country_code(1); | |
1999 us_number.set_national_number(6502530000ULL); | |
2000 phone_util_.FormatOutOfCountryCallingNumber(us_number, RegionCode::AD(), | |
2001 &formatted_number); | |
2002 EXPECT_EQ("00 1 650 253 0000", formatted_number); | |
2003 } | |
2004 | |
2005 TEST_F(PhoneNumberUtilTest, UnknownCountryCallingCodeForValidation) { | |
2006 PhoneNumber invalid_number; | |
2007 invalid_number.set_country_code(0); | |
2008 invalid_number.set_national_number(1234ULL); | |
2009 EXPECT_FALSE(phone_util_.IsValidNumber(invalid_number)); | |
2010 } | |
2011 | |
2012 TEST_F(PhoneNumberUtilTest, IsNumberMatchMatches) { | |
2013 // Test simple matches where formatting is different, or leading zeroes, or | |
2014 // country code has been specified. | |
2015 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2016 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331 6005", | |
2017 "+64 03 331 6005")); | |
2018 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2019 phone_util_.IsNumberMatchWithTwoStrings("+64 03 331-6005", | |
2020 "+64 03331 6005")); | |
2021 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2022 phone_util_.IsNumberMatchWithTwoStrings("+643 331-6005", | |
2023 "+64033316005")); | |
2024 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2025 phone_util_.IsNumberMatchWithTwoStrings("+643 331-6005", | |
2026 "+6433316005")); | |
2027 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2028 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005", | |
2029 "+6433316005")); | |
2030 // Test alpha numbers. | |
2031 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2032 phone_util_.IsNumberMatchWithTwoStrings("+1800 siX-Flags", | |
2033 "+1 800 7493 5247")); | |
2034 // Test numbers with extensions. | |
2035 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2036 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 extn 1234", | |
2037 "+6433316005#1234")); | |
2038 // Test proto buffers. | |
2039 PhoneNumber nz_number; | |
2040 nz_number.set_country_code(64); | |
2041 nz_number.set_national_number(33316005ULL); | |
2042 nz_number.set_extension("3456"); | |
2043 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2044 phone_util_.IsNumberMatchWithOneString(nz_number, | |
2045 "+643 331 6005 ext 3456")); | |
2046 nz_number.clear_extension(); | |
2047 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2048 phone_util_.IsNumberMatchWithOneString(nz_number, | |
2049 "+643 331 6005")); | |
2050 // Check empty extensions are ignored. | |
2051 nz_number.set_extension(""); | |
2052 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2053 phone_util_.IsNumberMatchWithOneString(nz_number, | |
2054 "+643 331 6005")); | |
2055 // Check variant with two proto buffers. | |
2056 PhoneNumber nz_number_2; | |
2057 nz_number_2.set_country_code(64); | |
2058 nz_number_2.set_national_number(33316005ULL); | |
2059 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2060 phone_util_.IsNumberMatch(nz_number, nz_number_2)); | |
2061 | |
2062 // Check raw_input, country_code_source and preferred_domestic_carrier_code | |
2063 // are ignored. | |
2064 PhoneNumber br_number_1; | |
2065 PhoneNumber br_number_2; | |
2066 br_number_1.set_country_code(55); | |
2067 br_number_1.set_national_number(3121286979ULL); | |
2068 br_number_1.set_country_code_source(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN); | |
2069 br_number_1.set_preferred_domestic_carrier_code("12"); | |
2070 br_number_1.set_raw_input("012 3121286979"); | |
2071 br_number_2.set_country_code(55); | |
2072 br_number_2.set_national_number(3121286979ULL); | |
2073 br_number_2.set_country_code_source(PhoneNumber::FROM_DEFAULT_COUNTRY); | |
2074 br_number_2.set_preferred_domestic_carrier_code("14"); | |
2075 br_number_2.set_raw_input("143121286979"); | |
2076 EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH, | |
2077 phone_util_.IsNumberMatch(br_number_1, br_number_2)); | |
2078 } | |
2079 | |
2080 TEST_F(PhoneNumberUtilTest, IsNumberMatchNonMetches) { | |
2081 // NSN matches. | |
2082 EXPECT_EQ(PhoneNumberUtil::NO_MATCH, | |
2083 phone_util_.IsNumberMatchWithTwoStrings("03 331 6005", | |
2084 "03 331 6006")); | |
2085 // Different country code, partial number match. | |
2086 EXPECT_EQ(PhoneNumberUtil::NO_MATCH, | |
2087 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005", | |
2088 "+16433316005")); | |
2089 // Different country code, same number. | |
2090 EXPECT_EQ(PhoneNumberUtil::NO_MATCH, | |
2091 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005", | |
2092 "+6133316005")); | |
2093 // Extension different, all else the same. | |
2094 EXPECT_EQ(PhoneNumberUtil::NO_MATCH, | |
2095 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 extn 1234", | |
2096 "+0116433316005#1235")); | |
2097 // NSN matches, but extension is different - not the same number. | |
2098 EXPECT_EQ(PhoneNumberUtil::NO_MATCH, | |
2099 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 ext.1235", | |
2100 "3 331 6005#1234")); | |
2101 // Invalid numbers that can't be parsed. | |
2102 EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER, | |
2103 phone_util_.IsNumberMatchWithTwoStrings("43", "3 331 6043")); | |
2104 // Invalid numbers that can't be parsed. | |
2105 EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER, | |
2106 phone_util_.IsNumberMatchWithTwoStrings("+43", "+64 3 331 6005")); | |
2107 EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER, | |
2108 phone_util_.IsNumberMatchWithTwoStrings("+43", "64 3 331 6005")); | |
2109 EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER, | |
2110 phone_util_.IsNumberMatchWithTwoStrings("Dog", "64 3 331 6005")); | |
2111 } | |
2112 | |
2113 TEST_F(PhoneNumberUtilTest, IsNumberMatchNsnMatches) { | |
2114 // NSN matches. | |
2115 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2116 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005", | |
2117 "03 331 6005")); | |
2118 | |
2119 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2120 phone_util_.IsNumberMatchWithTwoStrings("3 331-6005", | |
2121 "03 331 6005")); | |
2122 | |
2123 PhoneNumber nz_number; | |
2124 nz_number.set_country_code(64); | |
2125 nz_number.set_national_number(33316005ULL); | |
2126 nz_number.set_extension(""); | |
2127 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2128 phone_util_.IsNumberMatchWithOneString(nz_number, "03 331 6005")); | |
2129 // Here the second number possibly starts with the country code for New | |
2130 // Zealand, although we are unsure. | |
2131 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2132 phone_util_.IsNumberMatchWithOneString(nz_number, | |
2133 "(64-3) 331 6005")); | |
2134 | |
2135 // Here, the 1 might be a national prefix, if we compare it to the US number, | |
2136 // so the resultant match is an NSN match. | |
2137 PhoneNumber us_number; | |
2138 us_number.set_country_code(1); | |
2139 us_number.set_national_number(2345678901ULL); | |
2140 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2141 phone_util_.IsNumberMatchWithOneString(us_number, | |
2142 "1-234-567-8901")); | |
2143 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2144 phone_util_.IsNumberMatchWithOneString(us_number, "2345678901")); | |
2145 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2146 phone_util_.IsNumberMatchWithTwoStrings("+1 234-567 8901", | |
2147 "1 234 567 8901")); | |
2148 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2149 phone_util_.IsNumberMatchWithTwoStrings("1 234-567 8901", | |
2150 "1 234 567 8901")); | |
2151 EXPECT_EQ(PhoneNumberUtil::NSN_MATCH, | |
2152 phone_util_.IsNumberMatchWithTwoStrings("1 234-567 8901", | |
2153 "+1 234 567 8901")); | |
2154 // For this case, the match will be a short NSN match, because we cannot | |
2155 // assume that the 1 might be a national prefix, so don't remove it when | |
2156 // parsing. | |
2157 PhoneNumber random_number; | |
2158 random_number.set_country_code(41); | |
2159 random_number.set_national_number(2345678901ULL); | |
2160 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2161 phone_util_.IsNumberMatchWithOneString(random_number, | |
2162 "1-234-567-8901")); | |
2163 } | |
2164 | |
2165 TEST_F(PhoneNumberUtilTest, IsNumberMatchShortNsnMatches) { | |
2166 // Short NSN matches with the country not specified for either one or both | |
2167 // numbers. | |
2168 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2169 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005", | |
2170 "331 6005")); | |
2171 | |
2172 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2173 phone_util_.IsNumberMatchWithTwoStrings("3 331-6005", | |
2174 "331 6005")); | |
2175 | |
2176 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2177 phone_util_.IsNumberMatchWithTwoStrings("3 331-6005", | |
2178 "+64 331 6005")); | |
2179 | |
2180 // Short NSN match with the country specified. | |
2181 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2182 phone_util_.IsNumberMatchWithTwoStrings("03 331-6005", | |
2183 "331 6005")); | |
2184 | |
2185 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2186 phone_util_.IsNumberMatchWithTwoStrings("1 234 345 6789", | |
2187 "345 6789")); | |
2188 | |
2189 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2190 phone_util_.IsNumberMatchWithTwoStrings("+1 (234) 345 6789", | |
2191 "345 6789")); | |
2192 | |
2193 // NSN matches, country code omitted for one number, extension missing for | |
2194 // one. | |
2195 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2196 phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005", | |
2197 "3 331 6005#1234")); | |
2198 | |
2199 // One has Italian leading zero, one does not. | |
2200 PhoneNumber it_number_1, it_number_2; | |
2201 it_number_1.set_country_code(39); | |
2202 it_number_1.set_national_number(1234ULL); | |
2203 it_number_1.set_italian_leading_zero(true); | |
2204 it_number_2.set_country_code(39); | |
2205 it_number_2.set_national_number(1234ULL); | |
2206 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2207 phone_util_.IsNumberMatch(it_number_1, it_number_2)); | |
2208 | |
2209 // One has an extension, the other has an extension of "". | |
2210 it_number_1.set_extension("1234"); | |
2211 it_number_1.clear_italian_leading_zero(); | |
2212 it_number_2.set_extension(""); | |
2213 EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH, | |
2214 phone_util_.IsNumberMatch(it_number_1, it_number_2)); | |
2215 } | |
2216 | |
2217 TEST_F(PhoneNumberUtilTest, ParseNationalNumber) { | |
2218 PhoneNumber nz_number; | |
2219 nz_number.set_country_code(64); | |
2220 nz_number.set_national_number(33316005ULL); | |
2221 PhoneNumber test_number; | |
2222 // National prefix attached. | |
2223 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2224 phone_util_.Parse("033316005", RegionCode::NZ(), &test_number)); | |
2225 EXPECT_EQ(nz_number, test_number); | |
2226 // National prefix missing. | |
2227 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2228 phone_util_.Parse("33316005", RegionCode::NZ(), &test_number)); | |
2229 EXPECT_EQ(nz_number, test_number); | |
2230 // National prefix attached and some formatting present. | |
2231 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2232 phone_util_.Parse("03-331 6005", RegionCode::NZ(), &test_number)); | |
2233 EXPECT_EQ(nz_number, test_number); | |
2234 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2235 phone_util_.Parse("03 331 6005", RegionCode::NZ(), &test_number)); | |
2236 EXPECT_EQ(nz_number, test_number); | |
2237 | |
2238 // Testing international prefixes. | |
2239 // Should strip country code. | |
2240 test_number.Clear(); | |
2241 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2242 phone_util_.Parse("0064 3 331 6005", | |
2243 RegionCode::NZ(), &test_number)); | |
2244 EXPECT_EQ(nz_number, test_number); | |
2245 // Try again, but this time we have an international number with Region Code | |
2246 // US. It should recognise the country code and parse accordingly. | |
2247 test_number.Clear(); | |
2248 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2249 phone_util_.Parse("01164 3 331 6005", | |
2250 RegionCode::US(), &test_number)); | |
2251 EXPECT_EQ(nz_number, test_number); | |
2252 test_number.Clear(); | |
2253 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2254 phone_util_.Parse("+64 3 331 6005", | |
2255 RegionCode::US(), &test_number)); | |
2256 EXPECT_EQ(nz_number, test_number); | |
2257 | |
2258 // Test for http://b/issue?id=2247493 | |
2259 nz_number.Clear(); | |
2260 nz_number.set_country_code(64); | |
2261 nz_number.set_national_number(64123456ULL); | |
2262 test_number.Clear(); | |
2263 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2264 phone_util_.Parse("+64(0)64123456", | |
2265 RegionCode::US(), &test_number)); | |
2266 EXPECT_EQ(nz_number, test_number); | |
2267 | |
2268 // Check that using a "/" is fine in a phone number. | |
2269 PhoneNumber de_number; | |
2270 de_number.set_country_code(49); | |
2271 de_number.set_national_number(12345678ULL); | |
2272 test_number.Clear(); | |
2273 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2274 phone_util_.Parse("123/45678", RegionCode::DE(), &test_number)); | |
2275 EXPECT_EQ(de_number, test_number); | |
2276 | |
2277 PhoneNumber us_number; | |
2278 us_number.set_country_code(1); | |
2279 // Check it doesn't use the '1' as a country code when parsing if the phone | |
2280 // number was already possible. | |
2281 us_number.set_national_number(1234567890ULL); | |
2282 test_number.Clear(); | |
2283 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2284 phone_util_.Parse("123-456-7890", RegionCode::US(), &test_number)); | |
2285 EXPECT_EQ(us_number, test_number); | |
2286 } | |
2287 | |
2288 TEST_F(PhoneNumberUtilTest, ParseNumberWithAlphaCharacters) { | |
2289 // Test case with alpha characters. | |
2290 PhoneNumber test_number; | |
2291 PhoneNumber tollfree_number; | |
2292 tollfree_number.set_country_code(64); | |
2293 tollfree_number.set_national_number(800332005ULL); | |
2294 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2295 phone_util_.Parse("0800 DDA 005", RegionCode::NZ(), &test_number)); | |
2296 EXPECT_EQ(tollfree_number, test_number); | |
2297 | |
2298 test_number.Clear(); | |
2299 PhoneNumber premium_number; | |
2300 premium_number.set_country_code(64); | |
2301 premium_number.set_national_number(9003326005ULL); | |
2302 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2303 phone_util_.Parse("0900 DDA 6005", RegionCode::NZ(), &test_number)); | |
2304 EXPECT_EQ(premium_number, test_number); | |
2305 | |
2306 // Not enough alpha characters for them to be considered intentional, so they | |
2307 // are stripped. | |
2308 test_number.Clear(); | |
2309 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2310 phone_util_.Parse("0900 332 6005a", | |
2311 RegionCode::NZ(), &test_number)); | |
2312 EXPECT_EQ(premium_number, test_number); | |
2313 test_number.Clear(); | |
2314 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2315 phone_util_.Parse("0900 332 600a5", | |
2316 RegionCode::NZ(), &test_number)); | |
2317 EXPECT_EQ(premium_number, test_number); | |
2318 | |
2319 test_number.Clear(); | |
2320 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2321 phone_util_.Parse("0900 332 600A5", | |
2322 RegionCode::NZ(), &test_number)); | |
2323 EXPECT_EQ(premium_number, test_number); | |
2324 | |
2325 test_number.Clear(); | |
2326 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2327 phone_util_.Parse("0900 a332 600A5", | |
2328 RegionCode::NZ(), &test_number)); | |
2329 EXPECT_EQ(premium_number, test_number); | |
2330 } | |
2331 | |
2332 TEST_F(PhoneNumberUtilTest, ParseWithInternationalPrefixes) { | |
2333 PhoneNumber us_number; | |
2334 us_number.set_country_code(1); | |
2335 us_number.set_national_number(6503336000ULL); | |
2336 PhoneNumber test_number; | |
2337 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2338 phone_util_.Parse("+1 (650) 333-6000", | |
2339 RegionCode::US(), &test_number)); | |
2340 EXPECT_EQ(us_number, test_number); | |
2341 test_number.Clear(); | |
2342 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2343 phone_util_.Parse("+1-650-333-6000", | |
2344 RegionCode::US(), &test_number)); | |
2345 EXPECT_EQ(us_number, test_number); | |
2346 | |
2347 // Calling the US number from Singapore by using different service providers | |
2348 // 1st test: calling using SingTel IDD service (IDD is 001) | |
2349 test_number.Clear(); | |
2350 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2351 phone_util_.Parse("0011-650-333-6000", | |
2352 RegionCode::SG(), &test_number)); | |
2353 EXPECT_EQ(us_number, test_number); | |
2354 // 2nd test: calling using StarHub IDD service (IDD is 008) | |
2355 test_number.Clear(); | |
2356 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2357 phone_util_.Parse("0081-650-333-6000", | |
2358 RegionCode::SG(), &test_number)); | |
2359 EXPECT_EQ(us_number, test_number); | |
2360 // 3rd test: calling using SingTel V019 service (IDD is 019) | |
2361 test_number.Clear(); | |
2362 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2363 phone_util_.Parse("0191-650-333-6000", | |
2364 RegionCode::SG(), &test_number)); | |
2365 EXPECT_EQ(us_number, test_number); | |
2366 // Calling the US number from Poland | |
2367 test_number.Clear(); | |
2368 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2369 phone_util_.Parse("0~01-650-333-6000", | |
2370 RegionCode::PL(), &test_number)); | |
2371 EXPECT_EQ(us_number, test_number); | |
2372 | |
2373 // Using "++" at the start. | |
2374 test_number.Clear(); | |
2375 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2376 phone_util_.Parse("++1 (650) 333-6000", | |
2377 RegionCode::PL(), &test_number)); | |
2378 EXPECT_EQ(us_number, test_number); | |
2379 // Using a full-width plus sign. | |
2380 test_number.Clear(); | |
2381 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2382 phone_util_.Parse("\xEF\xBC\x8B" "1 (650) 333-6000", | |
2383 RegionCode::SG(), &test_number)); | |
2384 EXPECT_EQ(us_number, test_number); | |
2385 // The whole number, including punctuation, is here represented in full-width | |
2386 // form. | |
2387 test_number.Clear(); | |
2388 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2389 phone_util_.Parse("\xEF\xBC\x8B\xEF\xBC\x91\xE3\x80\x80\xEF\xBC\x88\
xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90\xEF\xBC\x89\xE3\x80\x80\xEF\xBC\x93\xEF\xBC\
x93\xEF\xBC\x93\xEF\xBC\x8D\xEF\xBC\x96\xEF\xBC\x90\xEF\xBC\x90\xEF\xBC\x90", | |
2390 RegionCode::SG(), &test_number)); | |
2391 EXPECT_EQ(us_number, test_number); | |
2392 | |
2393 // Using the U+30FC dash. | |
2394 test_number.Clear(); | |
2395 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2396 phone_util_.Parse("\xEF\xBC\x8B\xEF\xBC\x91\xE3\x80\x80\xEF\xBC\x88\
xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90\xEF\xBC\x89\xE3\x80\x80\xEF\xBC\x93\xEF\xBC\
x93\xEF\xBC\x93\xE3\x83\xBC\xEF\xBC\x96\xEF\xBC\x90\xEF\xBC\x90\xEF\xBC\x90", | |
2397 RegionCode::SG(), &test_number)); | |
2398 EXPECT_EQ(us_number, test_number); | |
2399 } | |
2400 | |
2401 TEST_F(PhoneNumberUtilTest, ParseWithLeadingZero) { | |
2402 PhoneNumber it_number; | |
2403 it_number.set_country_code(39); | |
2404 it_number.set_national_number(236618300ULL); | |
2405 it_number.set_italian_leading_zero(true); | |
2406 PhoneNumber test_number; | |
2407 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2408 phone_util_.Parse("+39 02-36618 300", | |
2409 RegionCode::NZ(), &test_number)); | |
2410 EXPECT_EQ(it_number, test_number); | |
2411 test_number.Clear(); | |
2412 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2413 phone_util_.Parse("02-36618 300", RegionCode::IT(), &test_number)); | |
2414 EXPECT_EQ(it_number, test_number); | |
2415 | |
2416 it_number.Clear(); | |
2417 it_number.set_country_code(39); | |
2418 it_number.set_national_number(312345678ULL); | |
2419 test_number.Clear(); | |
2420 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2421 phone_util_.Parse("312 345 678", RegionCode::IT(), &test_number)); | |
2422 EXPECT_EQ(it_number, test_number); | |
2423 } | |
2424 | |
2425 TEST_F(PhoneNumberUtilTest, ParseNationalNumberArgentina) { | |
2426 // Test parsing mobile numbers of Argentina. | |
2427 PhoneNumber ar_number; | |
2428 ar_number.set_country_code(54); | |
2429 ar_number.set_national_number(93435551212ULL); | |
2430 PhoneNumber test_number; | |
2431 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2432 phone_util_.Parse("+54 9 343 555 1212", RegionCode::AR(), | |
2433 &test_number)); | |
2434 EXPECT_EQ(ar_number, test_number); | |
2435 test_number.Clear(); | |
2436 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2437 phone_util_.Parse("0343 15 555 1212", RegionCode::AR(), | |
2438 &test_number)); | |
2439 EXPECT_EQ(ar_number, test_number); | |
2440 | |
2441 ar_number.set_national_number(93715654320ULL); | |
2442 test_number.Clear(); | |
2443 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2444 phone_util_.Parse("+54 9 3715 65 4320", RegionCode::AR(), | |
2445 &test_number)); | |
2446 EXPECT_EQ(ar_number, test_number); | |
2447 test_number.Clear(); | |
2448 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2449 phone_util_.Parse("03715 15 65 4320", RegionCode::AR(), | |
2450 &test_number)); | |
2451 EXPECT_EQ(ar_number, test_number); | |
2452 | |
2453 // Test parsing fixed-line numbers of Argentina. | |
2454 ar_number.set_national_number(1137970000ULL); | |
2455 test_number.Clear(); | |
2456 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2457 phone_util_.Parse("+54 11 3797 0000", RegionCode::AR(), | |
2458 &test_number)); | |
2459 EXPECT_EQ(ar_number, test_number); | |
2460 test_number.Clear(); | |
2461 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2462 phone_util_.Parse("011 3797 0000", RegionCode::AR(), &test_number)); | |
2463 EXPECT_EQ(ar_number, test_number); | |
2464 | |
2465 ar_number.set_national_number(3715654321ULL); | |
2466 test_number.Clear(); | |
2467 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2468 phone_util_.Parse("+54 3715 65 4321", RegionCode::AR(), | |
2469 &test_number)); | |
2470 EXPECT_EQ(ar_number, test_number); | |
2471 test_number.Clear(); | |
2472 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2473 phone_util_.Parse("03715 65 4321", RegionCode::AR(), &test_number)); | |
2474 EXPECT_EQ(ar_number, test_number); | |
2475 | |
2476 ar_number.set_national_number(2312340000ULL); | |
2477 test_number.Clear(); | |
2478 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2479 phone_util_.Parse("+54 23 1234 0000", RegionCode::AR(), | |
2480 &test_number)); | |
2481 EXPECT_EQ(ar_number, test_number); | |
2482 test_number.Clear(); | |
2483 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2484 phone_util_.Parse("023 1234 0000", RegionCode::AR(), &test_number)); | |
2485 EXPECT_EQ(ar_number, test_number); | |
2486 } | |
2487 | |
2488 TEST_F(PhoneNumberUtilTest, ParseWithXInNumber) { | |
2489 // Test that having an 'x' in the phone number at the start is ok and that it | |
2490 // just gets removed. | |
2491 PhoneNumber ar_number; | |
2492 ar_number.set_country_code(54); | |
2493 ar_number.set_national_number(123456789ULL); | |
2494 PhoneNumber test_number; | |
2495 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2496 phone_util_.Parse("0123456789", RegionCode::AR(), &test_number)); | |
2497 EXPECT_EQ(ar_number, test_number); | |
2498 test_number.Clear(); | |
2499 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2500 phone_util_.Parse("(0) 123456789", RegionCode::AR(), &test_number)); | |
2501 EXPECT_EQ(ar_number, test_number); | |
2502 test_number.Clear(); | |
2503 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2504 phone_util_.Parse("0 123456789", RegionCode::AR(), &test_number)); | |
2505 EXPECT_EQ(ar_number, test_number); | |
2506 test_number.Clear(); | |
2507 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2508 phone_util_.Parse("(0xx) 123456789", RegionCode::AR(), | |
2509 &test_number)); | |
2510 EXPECT_EQ(ar_number, test_number); | |
2511 | |
2512 PhoneNumber ar_from_us; | |
2513 ar_from_us.set_country_code(54); | |
2514 ar_from_us.set_national_number(81429712ULL); | |
2515 // This test is intentionally constructed such that the number of digit after | |
2516 // xx is larger than 7, so that the number won't be mistakenly treated as an | |
2517 // extension, as we allow extensions up to 7 digits. This assumption is okay | |
2518 // for now as all the countries where a carrier selection code is written in | |
2519 // the form of xx have a national significant number of length larger than 7. | |
2520 test_number.Clear(); | |
2521 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2522 phone_util_.Parse("011xx5481429712", RegionCode::US(), | |
2523 &test_number)); | |
2524 EXPECT_EQ(ar_from_us, test_number); | |
2525 } | |
2526 | |
2527 TEST_F(PhoneNumberUtilTest, ParseNumbersMexico) { | |
2528 // Test parsing fixed-line numbers of Mexico. | |
2529 PhoneNumber mx_number; | |
2530 | |
2531 mx_number.set_country_code(52); | |
2532 mx_number.set_national_number(4499780001ULL); | |
2533 PhoneNumber test_number; | |
2534 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2535 phone_util_.Parse("+52 (449)978-0001", RegionCode::MX(), | |
2536 &test_number)); | |
2537 EXPECT_EQ(mx_number, test_number); | |
2538 test_number.Clear(); | |
2539 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2540 phone_util_.Parse("01 (449)978-0001", RegionCode::MX(), | |
2541 &test_number)); | |
2542 EXPECT_EQ(mx_number, test_number); | |
2543 test_number.Clear(); | |
2544 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2545 phone_util_.Parse("(449)978-0001", RegionCode::MX(), | |
2546 &test_number)); | |
2547 EXPECT_EQ(mx_number, test_number); | |
2548 | |
2549 // Test parsing mobile numbers of Mexico. | |
2550 mx_number.Clear(); | |
2551 mx_number.set_country_code(52); | |
2552 mx_number.set_national_number(13312345678ULL); | |
2553 test_number.Clear(); | |
2554 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2555 phone_util_.Parse("+52 1 33 1234-5678", RegionCode::MX(), | |
2556 &test_number)); | |
2557 EXPECT_EQ(mx_number, test_number); | |
2558 test_number.Clear(); | |
2559 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2560 phone_util_.Parse("044 (33) 1234-5678", RegionCode::MX(), | |
2561 &test_number)); | |
2562 EXPECT_EQ(mx_number, test_number); | |
2563 test_number.Clear(); | |
2564 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2565 phone_util_.Parse("045 33 1234-5678", RegionCode::MX(), | |
2566 &test_number)); | |
2567 EXPECT_EQ(mx_number, test_number); | |
2568 } | |
2569 | |
2570 TEST_F(PhoneNumberUtilTest, FailedParseOnInvalidNumbers) { | |
2571 PhoneNumber test_number; | |
2572 EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER, | |
2573 phone_util_.Parse("This is not a phone number", RegionCode::NZ(), | |
2574 &test_number)); | |
2575 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2576 | |
2577 EXPECT_EQ(PhoneNumberUtil::TOO_LONG_NSN, | |
2578 phone_util_.Parse("01495 72553301873 810104", RegionCode::GB(), | |
2579 &test_number)); | |
2580 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2581 | |
2582 EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_NSN, | |
2583 phone_util_.Parse("+49 0", RegionCode::DE(), | |
2584 &test_number)); | |
2585 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2586 | |
2587 EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR, | |
2588 phone_util_.Parse("+210 3456 56789", RegionCode::NZ(), | |
2589 &test_number)); | |
2590 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2591 | |
2592 EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR, | |
2593 phone_util_.Parse("123 456 7890", RegionCode::GetUnknown(), | |
2594 &test_number)); | |
2595 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2596 | |
2597 EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR, | |
2598 phone_util_.Parse("123 456 7890", RegionCode::CS(), | |
2599 &test_number)); | |
2600 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2601 | |
2602 EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD, | |
2603 phone_util_.Parse("0044-----", RegionCode::GB(), | |
2604 &test_number)); | |
2605 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2606 EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD, | |
2607 phone_util_.Parse("0044", RegionCode::GB(), | |
2608 &test_number)); | |
2609 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2610 | |
2611 EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD, | |
2612 phone_util_.Parse("011", RegionCode::US(), | |
2613 &test_number)); | |
2614 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2615 EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD, | |
2616 phone_util_.Parse("0119", RegionCode::US(), | |
2617 &test_number)); | |
2618 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2619 } | |
2620 | |
2621 TEST_F(PhoneNumberUtilTest, ParseNumbersWithPlusWithNoRegion) { | |
2622 PhoneNumber nz_number; | |
2623 nz_number.set_country_code(64); | |
2624 nz_number.set_national_number(33316005ULL); | |
2625 // "ZZ" is allowed only if the number starts with a '+' - then the country | |
2626 // code can be calculated. | |
2627 PhoneNumber result_proto; | |
2628 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2629 phone_util_.Parse("+64 3 331 6005", RegionCode::GetUnknown(), | |
2630 &result_proto)); | |
2631 EXPECT_EQ(nz_number, result_proto); | |
2632 | |
2633 // Test with full-width plus. | |
2634 result_proto.Clear(); | |
2635 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2636 phone_util_.Parse("\xEF\xBC\x8B" "64 3 331 6005", RegionCode::GetUnk
nown(), | |
2637 &result_proto)); | |
2638 EXPECT_EQ(nz_number, result_proto); | |
2639 // Test with normal plus but leading characters that need to be stripped. | |
2640 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2641 phone_util_.Parse(" +64 3 331 6005", RegionCode::GetUnknown(), | |
2642 &result_proto)); | |
2643 EXPECT_EQ(nz_number, result_proto); | |
2644 | |
2645 nz_number.set_raw_input("+64 3 331 6005"); | |
2646 nz_number.set_country_code_source(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN); | |
2647 // It is important that we set this to an empty string, since we used | |
2648 // ParseAndKeepRawInput and no carrrier code was found. | |
2649 nz_number.set_preferred_domestic_carrier_code(""); | |
2650 result_proto.Clear(); | |
2651 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2652 phone_util_.ParseAndKeepRawInput("+64 3 331 6005", | |
2653 RegionCode::GetUnknown(), | |
2654 &result_proto)); | |
2655 EXPECT_EQ(nz_number, result_proto); | |
2656 } | |
2657 | |
2658 TEST_F(PhoneNumberUtilTest, ParseExtensions) { | |
2659 PhoneNumber nz_number; | |
2660 nz_number.set_country_code(64); | |
2661 nz_number.set_national_number(33316005ULL); | |
2662 nz_number.set_extension("3456"); | |
2663 PhoneNumber test_number; | |
2664 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2665 phone_util_.Parse("03 331 6005 ext 3456", RegionCode::NZ(), | |
2666 &test_number)); | |
2667 EXPECT_EQ(nz_number, test_number); | |
2668 test_number.Clear(); | |
2669 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2670 phone_util_.Parse("03 331 6005x3456", RegionCode::NZ(), | |
2671 &test_number)); | |
2672 EXPECT_EQ(nz_number, test_number); | |
2673 test_number.Clear(); | |
2674 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2675 phone_util_.Parse("03-331 6005 int.3456", RegionCode::NZ(), | |
2676 &test_number)); | |
2677 EXPECT_EQ(nz_number, test_number); | |
2678 test_number.Clear(); | |
2679 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2680 phone_util_.Parse("03 331 6005 #3456", RegionCode::NZ(), | |
2681 &test_number)); | |
2682 EXPECT_EQ(nz_number, test_number); | |
2683 | |
2684 // Test the following do not extract extensions: | |
2685 PhoneNumber non_extn_number; | |
2686 non_extn_number.set_country_code(1); | |
2687 non_extn_number.set_national_number(80074935247ULL); | |
2688 test_number.Clear(); | |
2689 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2690 phone_util_.Parse("1800 six-flags", RegionCode::US(), | |
2691 &test_number)); | |
2692 EXPECT_EQ(non_extn_number, test_number); | |
2693 test_number.Clear(); | |
2694 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2695 phone_util_.Parse("1800 SIX-FLAGS", RegionCode::US(), | |
2696 &test_number)); | |
2697 EXPECT_EQ(non_extn_number, test_number); | |
2698 test_number.Clear(); | |
2699 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2700 phone_util_.Parse("0~0 1800 7493 5247", RegionCode::PL(), | |
2701 &test_number)); | |
2702 EXPECT_EQ(non_extn_number, test_number); | |
2703 test_number.Clear(); | |
2704 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2705 phone_util_.Parse("(1800) 7493.5247", RegionCode::US(), | |
2706 &test_number)); | |
2707 EXPECT_EQ(non_extn_number, test_number); | |
2708 | |
2709 // Check that the last instance of an extension token is matched. | |
2710 PhoneNumber extn_number; | |
2711 extn_number.set_country_code(1); | |
2712 extn_number.set_national_number(80074935247ULL); | |
2713 extn_number.set_extension("1234"); | |
2714 test_number.Clear(); | |
2715 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2716 phone_util_.Parse("0~0 1800 7493 5247 ~1234", RegionCode::PL(), | |
2717 &test_number)); | |
2718 EXPECT_EQ(extn_number, test_number); | |
2719 | |
2720 // Verifying bug-fix where the last digit of a number was previously omitted | |
2721 // if it was a 0 when extracting the extension. Also verifying a few different | |
2722 // cases of extensions. | |
2723 PhoneNumber uk_number; | |
2724 uk_number.set_country_code(44); | |
2725 uk_number.set_national_number(2034567890ULL); | |
2726 uk_number.set_extension("456"); | |
2727 test_number.Clear(); | |
2728 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2729 phone_util_.Parse("+44 2034567890x456", RegionCode::NZ(), | |
2730 &test_number)); | |
2731 EXPECT_EQ(uk_number, test_number); | |
2732 test_number.Clear(); | |
2733 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2734 phone_util_.Parse("+44 2034567890x456", RegionCode::GB(), | |
2735 &test_number)); | |
2736 EXPECT_EQ(uk_number, test_number); | |
2737 test_number.Clear(); | |
2738 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2739 phone_util_.Parse("+44 2034567890 x456", RegionCode::GB(), | |
2740 &test_number)); | |
2741 EXPECT_EQ(uk_number, test_number); | |
2742 test_number.Clear(); | |
2743 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2744 phone_util_.Parse("+44 2034567890 X456", RegionCode::GB(), | |
2745 &test_number)); | |
2746 EXPECT_EQ(uk_number, test_number); | |
2747 test_number.Clear(); | |
2748 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2749 phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(), | |
2750 &test_number)); | |
2751 EXPECT_EQ(uk_number, test_number); | |
2752 test_number.Clear(); | |
2753 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2754 phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(), | |
2755 &test_number)); | |
2756 EXPECT_EQ(uk_number, test_number); | |
2757 test_number.Clear(); | |
2758 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2759 phone_util_.Parse("+44 2034567890 x 456 ", RegionCode::GB(), | |
2760 &test_number)); | |
2761 EXPECT_EQ(uk_number, test_number); | |
2762 test_number.Clear(); | |
2763 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2764 phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(), | |
2765 &test_number)); | |
2766 EXPECT_EQ(uk_number, test_number); | |
2767 test_number.Clear(); | |
2768 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2769 phone_util_.Parse("+44-2034567890;ext=456", RegionCode::GB(), | |
2770 &test_number)); | |
2771 EXPECT_EQ(uk_number, test_number); | |
2772 | |
2773 PhoneNumber us_with_extension; | |
2774 us_with_extension.set_country_code(1); | |
2775 us_with_extension.set_national_number(8009013355ULL); | |
2776 us_with_extension.set_extension("7246433"); | |
2777 test_number.Clear(); | |
2778 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2779 phone_util_.Parse("(800) 901-3355 x 7246433", RegionCode::US(), | |
2780 &test_number)); | |
2781 EXPECT_EQ(us_with_extension, test_number); | |
2782 test_number.Clear(); | |
2783 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2784 phone_util_.Parse("(800) 901-3355 , ext 7246433", RegionCode::US(), | |
2785 &test_number)); | |
2786 EXPECT_EQ(us_with_extension, test_number); | |
2787 test_number.Clear(); | |
2788 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2789 phone_util_.Parse("(800) 901-3355 ,extension 7246433", | |
2790 RegionCode::US(), | |
2791 &test_number)); | |
2792 EXPECT_EQ(us_with_extension, test_number); | |
2793 test_number.Clear(); | |
2794 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2795 phone_util_.Parse("(800) 901-3355 ,extensi\xC3\xB3n 7246433", | |
2796 RegionCode::US(), | |
2797 &test_number)); | |
2798 EXPECT_EQ(us_with_extension, test_number); | |
2799 test_number.Clear(); | |
2800 // Repeat with the small letter o with acute accent created by combining | |
2801 // characters. | |
2802 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2803 phone_util_.Parse("(800) 901-3355 ,extensio\xCC\x81n 7246433", | |
2804 RegionCode::US(), | |
2805 &test_number)); | |
2806 EXPECT_EQ(us_with_extension, test_number); | |
2807 test_number.Clear(); | |
2808 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2809 phone_util_.Parse("(800) 901-3355 , 7246433", RegionCode::US(), | |
2810 &test_number)); | |
2811 EXPECT_EQ(us_with_extension, test_number); | |
2812 test_number.Clear(); | |
2813 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2814 phone_util_.Parse("(800) 901-3355 ext: 7246433", RegionCode::US(), | |
2815 &test_number)); | |
2816 EXPECT_EQ(us_with_extension, test_number); | |
2817 | |
2818 // Test that if a number has two extensions specified, we ignore the second. | |
2819 PhoneNumber us_with_two_extensions_number; | |
2820 us_with_two_extensions_number.set_country_code(1); | |
2821 us_with_two_extensions_number.set_national_number(2121231234ULL); | |
2822 us_with_two_extensions_number.set_extension("508"); | |
2823 test_number.Clear(); | |
2824 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2825 phone_util_.Parse("(212)123-1234 x508/x1234", RegionCode::US(), | |
2826 &test_number)); | |
2827 EXPECT_EQ(us_with_two_extensions_number, test_number); | |
2828 test_number.Clear(); | |
2829 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2830 phone_util_.Parse("(212)123-1234 x508/ x1234", RegionCode::US(), | |
2831 &test_number)); | |
2832 EXPECT_EQ(us_with_two_extensions_number, test_number); | |
2833 test_number.Clear(); | |
2834 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2835 phone_util_.Parse("(212)123-1234 x508\\x1234", RegionCode::US(), | |
2836 &test_number)); | |
2837 EXPECT_EQ(us_with_two_extensions_number, test_number); | |
2838 | |
2839 // Test parsing numbers in the form (645) 123-1234-910# works, where the last | |
2840 // 3 digits before the # are an extension. | |
2841 us_with_extension.Clear(); | |
2842 us_with_extension.set_country_code(1); | |
2843 us_with_extension.set_national_number(6451231234ULL); | |
2844 us_with_extension.set_extension("910"); | |
2845 test_number.Clear(); | |
2846 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2847 phone_util_.Parse("+1 (645) 123 1234-910#", RegionCode::US(), | |
2848 &test_number)); | |
2849 EXPECT_EQ(us_with_extension, test_number); | |
2850 } | |
2851 | |
2852 TEST_F(PhoneNumberUtilTest, ParseAndKeepRaw) { | |
2853 PhoneNumber alpha_numeric_number; | |
2854 alpha_numeric_number.set_country_code(1); | |
2855 alpha_numeric_number.set_national_number(80074935247ULL); | |
2856 alpha_numeric_number.set_raw_input("800 six-flags"); | |
2857 alpha_numeric_number.set_country_code_source( | |
2858 PhoneNumber::FROM_DEFAULT_COUNTRY); | |
2859 alpha_numeric_number.set_preferred_domestic_carrier_code(""); | |
2860 | |
2861 PhoneNumber test_number; | |
2862 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2863 phone_util_.ParseAndKeepRawInput("800 six-flags", RegionCode::US(), | |
2864 &test_number)); | |
2865 EXPECT_EQ(alpha_numeric_number, test_number); | |
2866 | |
2867 alpha_numeric_number.set_national_number(8007493524ULL); | |
2868 alpha_numeric_number.set_raw_input("1800 six-flag"); | |
2869 alpha_numeric_number.set_country_code_source( | |
2870 PhoneNumber::FROM_NUMBER_WITHOUT_PLUS_SIGN); | |
2871 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2872 phone_util_.ParseAndKeepRawInput("1800 six-flag", RegionCode::US(), | |
2873 &test_number)); | |
2874 EXPECT_EQ(alpha_numeric_number, test_number); | |
2875 | |
2876 alpha_numeric_number.set_raw_input("+1800 six-flag"); | |
2877 alpha_numeric_number.set_country_code_source( | |
2878 PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN); | |
2879 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2880 phone_util_.ParseAndKeepRawInput("+1800 six-flag", RegionCode::CN(), | |
2881 &test_number)); | |
2882 EXPECT_EQ(alpha_numeric_number, test_number); | |
2883 | |
2884 alpha_numeric_number.set_raw_input("001800 six-flag"); | |
2885 alpha_numeric_number.set_country_code_source( | |
2886 PhoneNumber::FROM_NUMBER_WITH_IDD); | |
2887 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2888 phone_util_.ParseAndKeepRawInput("001800 six-flag", | |
2889 RegionCode::NZ(), | |
2890 &test_number)); | |
2891 EXPECT_EQ(alpha_numeric_number, test_number); | |
2892 | |
2893 // Try with invalid region - expect failure. | |
2894 test_number.Clear(); | |
2895 EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR, | |
2896 phone_util_.Parse("123 456 7890", RegionCode::CS(), &test_number)); | |
2897 EXPECT_EQ(PhoneNumber::default_instance(), test_number); | |
2898 | |
2899 PhoneNumber korean_number; | |
2900 korean_number.set_country_code(82); | |
2901 korean_number.set_national_number(22123456); | |
2902 korean_number.set_raw_input("08122123456"); | |
2903 korean_number.set_country_code_source(PhoneNumber::FROM_DEFAULT_COUNTRY); | |
2904 korean_number.set_preferred_domestic_carrier_code("81"); | |
2905 EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR, | |
2906 phone_util_.ParseAndKeepRawInput("08122123456", | |
2907 RegionCode::KR(), | |
2908 &test_number)); | |
2909 EXPECT_EQ(korean_number, test_number); | |
2910 } | |
2911 | |
2912 TEST_F(PhoneNumberUtilTest, IsAlphaNumber) { | |
2913 static const string kAlphaNumber("1800 six-flags"); | |
2914 EXPECT_TRUE(phone_util_.IsAlphaNumber(kAlphaNumber)); | |
2915 static const string kAlphaNumberWithExtension = "1800 six-flags ext. 1234"; | |
2916 EXPECT_TRUE(phone_util_.IsAlphaNumber(kAlphaNumberWithExtension)); | |
2917 static const string kNonAlphaNumber("1800 123-1234"); | |
2918 EXPECT_FALSE(phone_util_.IsAlphaNumber(kNonAlphaNumber)); | |
2919 static const string kNonAlphaNumberWithExtension( | |
2920 "1800 123-1234 extension: 1234"); | |
2921 EXPECT_FALSE(phone_util_.IsAlphaNumber(kNonAlphaNumberWithExtension)); | |
2922 } | |
2923 | |
2924 } // namespace phonenumbers | |
2925 } // namespace i18n | |
OLD | NEW |