From 9c9bab217e9284833d57f99eacef2c99b98cb6d4 Mon Sep 17 00:00:00 2001 From: "jia.shao.peng" Date: Mon, 14 Mar 2011 10:25:24 +0000 Subject: [PATCH] JS: Update JS version to v3.0. findNumbers is not included yet. Patch contributed by tronikos git-svn-id: http://libphonenumber.googlecode.com/svn/trunk@133 ee073f10-1060-11df-b6a4-87a95322a99c --- javascript/README | 13 +- javascript/i18n/phonenumbers/asyoutypeformatter.js | 25 +- .../i18n/phonenumbers/asyoutypeformatter_test.js | 39 +- javascript/i18n/phonenumbers/metadata.js | 133 +- javascript/i18n/phonenumbers/metadatafortesting.js | 6 +- javascript/i18n/phonenumbers/metadatalite.js | 133 +- javascript/i18n/phonenumbers/phonenumber.pb.js | 56 + javascript/i18n/phonenumbers/phonenumberutil.js | 276 ++-- .../i18n/phonenumbers/phonenumberutil_test.js | 1356 +++++++++----------- 9 files changed, 998 insertions(+), 1039 deletions(-) diff --git a/javascript/README b/javascript/README index 985445b..e75e583 100644 --- a/javascript/README +++ b/javascript/README @@ -25,18 +25,14 @@ pages with your web browser: How to update: ============== -The JavaScript library is ported from the Java implementation (revision 76). +The JavaScript library is ported from the Java implementation (revision 107). When the Java project gets updated follow these steps to update the JavaScript project: 1. If the protocol buffers (phonemetadata.proto and phonenumber.proto) have changed: a. Manually update the .pb.js files with the changes of the .proto files. - b. Manually update the following JavaScript functions in - javascript/i18n/phonenumbers/phonenumberutil.js: - i18n.phonenumbers.PhoneNumberDesc.prototype.exactlySameAs(other) - i18n.phonenumbers.PhoneNumber.prototype.exactlySameAs(other) - c. Manually update the toJsArray() Java methods in + b. Manually update the toJsArray() Java methods in /java/resources/com/google/i18n/phonenumbers/BuildMetadataJsonFromXml.java 2. If the phone number metadata in the XML format has changed @@ -63,3 +59,8 @@ project: AsYouTypeFormatter.java => asyoutypeformatter.js PhoneNumberUtilTest.java => phonenumberutil_test.js AsYouTypeFormatterTest.java => asyoutypeformatter_test.js + + +TODO: +===== +Port functionality to extract phone-numbers from text (findNumbers). diff --git a/javascript/i18n/phonenumbers/asyoutypeformatter.js b/javascript/i18n/phonenumbers/asyoutypeformatter.js index a4ab839..f1e1be2 100644 --- a/javascript/i18n/phonenumbers/asyoutypeformatter.js +++ b/javascript/i18n/phonenumbers/asyoutypeformatter.js @@ -203,6 +203,13 @@ i18n.phonenumbers.AsYouTypeFormatter.prototype.initializeCountrySpecificInfo_ = /** @type {i18n.phonenumbers.PhoneMetadata} */ this.currentMetaData_ = this.phoneUtil_.getMetadataForRegion(regionCode); + if (this.currentMetaData_ == null) { + // Set to a default instance of the metadata. This allows us to function + // with an incorrect region code, even if formatting only works for numbers + // specified with '+'. + this.currentMetaData_ = new i18n.phonenumbers.PhoneMetadata(); + this.currentMetaData_.setInternationalPrefix('NA'); + } /** @type {RegExp} */ this.nationalPrefixForParsing_ = new RegExp('^(' + this.currentMetaData_ .getNationalPrefixForParsing() + ')'); @@ -319,9 +326,13 @@ i18n.phonenumbers.AsYouTypeFormatter.prototype.createFormattingTemplate_ = // Replace any standalone digit (not the one in d{}) with \d numberPattern = numberPattern.replace(this.STANDALONE_DIGIT_PATTERN_, '\\d'); this.formattingTemplate_.clear(); - this.formattingTemplate_.append(this.getFormattingTemplate_(numberPattern, - numberFormat)); - return true; + /** @type {string} */ + var tempTemplate = this.getFormattingTemplate_(numberPattern, numberFormat); + if (tempTemplate.length > this.nationalNumber_.getLength()) { + this.formattingTemplate_.append(tempTemplate); + return true; + } + return false; }; @@ -779,8 +790,12 @@ i18n.phonenumbers.AsYouTypeFormatter.prototype.inputDigitHelper_ = this.lastMatchPosition_ = digitPatternStart; return tempTemplate.substring(0, this.lastMatchPosition_ + 1); } else { - // More digits are entered than we could handle. - this.ableToFormat_ = false; + if (this.possibleFormats_.length == 1) { + // More digits are entered than we could handle, and there are no other + // valid patterns to try. + this.ableToFormat_ = false; + } // else, we just reset the formatting pattern. + this.currentFormattingPattern_ = ''; return this.accruedInput_.toString(); } }; diff --git a/javascript/i18n/phonenumbers/asyoutypeformatter_test.js b/javascript/i18n/phonenumbers/asyoutypeformatter_test.js index 3f2dd8c..ee12daf 100644 --- a/javascript/i18n/phonenumbers/asyoutypeformatter_test.js +++ b/javascript/i18n/phonenumbers/asyoutypeformatter_test.js @@ -24,6 +24,29 @@ goog.require('goog.testing.jsunit'); goog.require('i18n.phonenumbers.AsYouTypeFormatter'); +function testInvalidRegion() { + /** @type {i18n.phonenumbers.AsYouTypeFormatter} */ + var f = new i18n.phonenumbers.AsYouTypeFormatter('ZZ'); + assertEquals('+', f.inputDigit('+')); + assertEquals('+4', f.inputDigit('4')); + assertEquals('+48 ', f.inputDigit('8')); + assertEquals('+48 8', f.inputDigit('8')); + assertEquals('+48 88', f.inputDigit('8')); + assertEquals('+48 88 1', f.inputDigit('1')); + assertEquals('+48 88 12', f.inputDigit('2')); + assertEquals('+48 88 123', f.inputDigit('3')); + assertEquals('+48 88 123 1', f.inputDigit('1')); + assertEquals('+48 88 123 12', f.inputDigit('2')); + + f.clear(); + assertEquals('6', f.inputDigit('6')); + assertEquals('65', f.inputDigit('5')); + assertEquals('650', f.inputDigit('0')); + assertEquals('6502', f.inputDigit('2')); + assertEquals('65025', f.inputDigit('5')); + assertEquals('650253', f.inputDigit('3')); +} + function testAYTFUS() { /** @type {i18n.phonenumbers.AsYouTypeFormatter} */ var f = new i18n.phonenumbers.AsYouTypeFormatter('US'); @@ -375,13 +398,25 @@ function testAYTFDE() { assertEquals('030 123', f.inputDigit('3')); assertEquals('030 1234', f.inputDigit('4')); + // 04134 1234 + f.clear(); + assertEquals('0', f.inputDigit('0')); + assertEquals('04', f.inputDigit('4')); + assertEquals('041', f.inputDigit('1')); + assertEquals('041 3', f.inputDigit('3')); + assertEquals('041 34', f.inputDigit('4')); + assertEquals('04134 1', f.inputDigit('1')); + assertEquals('04134 12', f.inputDigit('2')); + assertEquals('04134 123', f.inputDigit('3')); + assertEquals('04134 1234', f.inputDigit('4')); + // 08021 2345 f.clear(); assertEquals('0', f.inputDigit('0')); assertEquals('08', f.inputDigit('8')); assertEquals('080', f.inputDigit('0')); - assertEquals('0802', f.inputDigit('2')); - assertEquals('08021', f.inputDigit('1')); + assertEquals('080 2', f.inputDigit('2')); + assertEquals('080 21', f.inputDigit('1')); assertEquals('08021 2', f.inputDigit('2')); assertEquals('08021 23', f.inputDigit('3')); assertEquals('08021 234', f.inputDigit('4')); diff --git a/javascript/i18n/phonenumbers/metadata.js b/javascript/i18n/phonenumbers/metadata.js index e8e5382..839e957 100644 --- a/javascript/i18n/phonenumbers/metadata.js +++ b/javascript/i18n/phonenumbers/metadata.js @@ -607,7 +607,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ] ,"BF":[,[,,"[2457]\\d{7}","\\d{8}"] ,[,,"(?:20(?:49|5[23]|9[016-9])|40(?:4[569]|55|7[0179])|50[34]\\d)\\d{4}","\\d{8}",,,"20491234"] -,[,,"7(?:[024-6]\\d|1[0-489]|3[01]|8[013-9]|9[012])\\d{5}","\\d{8}",,,"70123456"] +,[,,"7(?:[024-6]\\d|1[0-489]|3[0124]|7[01]|8[013-9]|9[0-4])\\d{5}","\\d{8}",,,"70123456"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] @@ -733,9 +733,9 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,"BO",591,"00(1\\d)?","0",,,"0(1\\d)?",,,,[[,"([234])(\\d{7})","$1 $2",["[234]"] -,"",""] +,"","0$CC $1"] ,[,"([67]\\d{7})","$1",["[67]"] -,"",""] +,"","0$CC $1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -749,8 +749,8 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"(?:400\\d|3003)\\d{4}","\\d{8,10}",,,"40041234"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"BR",55,"00(?:1[45]|2[135]|[34]1|43)","0",,,"0(?:(?:1[245]|2[135]|[34]1)(\\d{10}))?","$1",,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["[1-9][1-9]"] -,"($1)","0 $CC $1"] +,"BR",55,"00(?:1[45]|2[135]|[34]1|43)","0",,,"0(?:(1[245]|2[135]|[34]1)(\\d{10}))?","$2",,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["[1-9][1-9]"] +,"($1)","0 $CC ($1)"] ,[,"([34]00\\d)(\\d{4})","$1-$2",["[34]00","400|3003"] ,"",""] ,[,"([3589]00)(\\d{2,3})(\\d{4})","$1 $2 $3",["[3589]00"] @@ -951,10 +951,10 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"44\\d{7}","\\d{9}",,,"441234567"] -,"CL",56,"(?:0|1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018]))0","0",,,"0|1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018])",,,,[[,"(2)(\\d{3})(\\d{4})","$1 $2 $3",["2"] -,"0$1",""] +,"CL",56,"(?:0|1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018]))0","0",,,"0|(1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018]))",,,,[[,"(2)(\\d{3})(\\d{4})","$1 $2 $3",["2"] +,"($1)","$CC ($1)"] ,[,"(\\d{2})(\\d{2,3})(\\d{4})","$1 $2 $3",["[357]|4[1-35]|6[13-57]"] -,"0$1",""] +,"($1)","$CC ($1)"] ,[,"(9)([6-9]\\d{3})(\\d{4})","$1 $2 $3",["9"] ,"0$1",""] ,[,"(44)(\\d{3})(\\d{4})","$1 $2 $3",["44"] @@ -1043,10 +1043,10 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"CO",57,"00[579]|#555|#999","0",,,"0(?:[3579]|4(?:44|56))",,,,[[,"(\\d)(\\d{7})","($1) $2",["1(?:8[2-9]|9[0-3]|[2-7])|[24-8]","1(?:8[2-9]|9(?:09|[1-3])|[2-7])|[24-8]"] -,"",""] +,"CO",57,"00[579]|#555|#999","0",,,"0([3579]|4(?:44|56))",,,,[[,"(\\d)(\\d{7})","$1 $2",["1(?:8[2-9]|9[0-3]|[2-7])|[24-8]","1(?:8[2-9]|9(?:09|[1-3])|[2-7])|[24-8]"] +,"($1)","0$CC $1"] ,[,"(\\d{3})(\\d{7})","$1 $2",["3"] -,"",""] +,"","0$CC $1"] ,[,"(1)(\\d{3})(\\d{7})","$1-$2-$3",["1(?:80|9[04])","1(?:800|9(?:0[01]|4[78]))"] ,"0$1",""] ] @@ -1061,18 +1061,18 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,,,[,,"NA","NA"] ,[,,"NA","NA"] ] -,"CR":[,[,,"[289]\\d{7,9}","\\d{8,10}"] +,"CR":[,[,,"[2489]\\d{7,9}","\\d{8,10}"] ,[,,"2[24-7]\\d{6}","\\d{8}",,,"22123456"] ,[,,"8[389]\\d{6}","\\d{8}",,,"83123456"] ,[,,"800\\d{7}","\\d{10}",,,"8001234567"] ,[,,"90[059]\\d{7}","\\d{10}",,,"9001234567"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,[,,"NA","NA"] -,"CR",506,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1 $2",["2|8[389]"] -,"",""] +,[,,"4000\\d{4}","\\d{8}",,,"40001234"] +,"CR",506,"00",,,,"(1900)",,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[24]|8[389]"] +,"","$CC $1"] ,[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[89]0"] -,"",""] +,"","$CC $1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -1182,7 +1182,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ] ,"DK":[,[,,"[1-9]\\d{7}","\\d{8}"] ,[,,"(?:3[2-9]|4[3-9]|5[4-9]|6[2-9]|7[02-9]|8[26-9]|9[6-9])\\d{6}","\\d{8}",,,"32123456"] -,[,,"(?:2[0-9]|3[0-2]|4[0-2]|5[0-3]|6[01]|72|99)\\d{6}","\\d{8}",,,"20123456"] +,[,,"(?:2[0-9]|3[0-2]|4[0-2]|5[0-3]|6[01]|7[12]|81|99)\\d{6}","\\d{8}",,,"20123456"] ,[,,"80\\d{6}","\\d{8}",,,"80123456"] ,[,,"90\\d{6}","\\d{8}",,,"90123456"] ,[,,"NA","NA"] @@ -1408,7 +1408,9 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"(?:6[0-36]|88)\\d{4}","\\d{6}",,,"601234"] -,"FO",298,"00",,,,"10(?:01|[12]0|88)",,,,,,[,,"NA","NA"] +,"FO",298,"00",,,,"(10(?:01|[12]0|88))",,,,[[,"(\\d{6})","$1",,"","$CC $1"] +] +,,[,,"NA","NA"] ,,,[,,"NA","NA"] ,[,,"NA","NA"] ] @@ -1491,8 +1493,8 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,,"473",[,,"NA","NA"] ,[,,"NA","NA"] ] -,"GE":[,[,,"[1-3579]\\d{7}|8\\d{8}","\\d{3,9}"] -,[,,"(?:122|2(?:22|36|5[03])|3(?:1[0-35-8]|[24-6]\\d|3[1-35679]|7[0-39]|9[1-35-7])|44[2-6])\\d{5}","\\d{3,8}",,,"32123456"] +,"GE":[,[,,"[1-579]\\d{7}|8\\d{8}","\\d{5,9}"] +,[,,"(?:122|2(?:22|36|5[035])|3(?:1[0-35-8]|3[1-35679]|4\\d|7[0-39]|9[1-35-7])|3(?:[256]\\d|4[124-9]|7[0-4])|4(?:1\\d|2[2-7]|3[1-79]|4[2-8]|7[239]|9[1-7]))\\d{5}","\\d{5,8}",,,"32123456"] ,[,,"(?:5[1578]|6[28]|7[0147-9]|9[0135-9])\\d{6}","\\d{8}",,,"55123456"] ,[,,"800\\d{6}","\\d{9}",,,"800123456"] ,[,,"NA","NA"] @@ -1500,12 +1502,10 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,"GE",995,"8~10","8",,,"8",,,,[[,"(32)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["32"] -,"8 $1",""] -,[,"(\\d{3})(\\d{5})","$1 $2",["2|3[13-79]|446"] -,"8 $1",""] -,[,"(\\d{4})(\\d{3,4})","$1 $2",["44[2-5]"] -,"8 $1",""] -,[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[5679]"] +,"8 ($1)",""] +,[,"(\\d{3})(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24]|3[13-79]"] +,"8 ($1)",""] +,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5679]"] ,"8 $1",""] ,[,"(800)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"] ,"8 $1",""] @@ -2212,28 +2212,28 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"50\\d{8}","\\d{10}",,,"5012345678"] ,[,,"70\\d{8}","\\d{10}",,,"7012345678"] -,"KR",82,"00(?:[124-68]|[37]\\d{2})","0",,,"0(?:8[1-46-8]|85\\d{2})?",,,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["1(?:0|1[19]|[69]9|5[458])|[57]0","1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"] -,"0$1",""] +,"KR",82,"00(?:[124-68]|[37]\\d{2})","0",,,"0(8[1-46-8]|85\\d{2})?",,,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["1(?:0|1[19]|[69]9|5[458])|[57]0","1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"] +,"0$1","0$CC-$1"] ,[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-9][1-9][2-9]","1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{3})(\\d)(\\d{4})","$1-$2-$3",["131","1312"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3",["131","131[13-9]"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["13[2-9]"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{2})(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3-$4",["30"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d)(\\d{4})(\\d{4})","$1-$2-$3",["2(?:[26]|3[0-467])","2(?:[26]|3(?:01|1[45]|2[17-9]|39|4|6[67]|7[078]))"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d)(\\d{3})(\\d{4})","$1-$2-$3",["2(?:3[0-35-9]|[457-9])","2(?:3(?:0[02-9]|1[0-36-9]|2[02-6]|3[0-8]|6[0-589]|7[1-69]|[589])|[457-9])"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d)(\\d{3,4})","$1-$2",["21[0-46-9]"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{2})(\\d{3,4})","$1-$2",["[3-9][1-9]1","[3-9][1-9]1(?:[0-46-9])"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{4})(\\d{4})","$1-$2",["1(?:5[46-9]|6[04678])","1(?:5(?:44|66|77|88|99)|6(?:00|44|6[16]|70|88))"] -,"$1",""] +,"$1","0$CC-$1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -2241,7 +2241,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ] ,"KW":[,[,,"[12569]\\d{6,7}","\\d{7,8}"] ,[,,"(?:18\\d|2(?:[23]\\d{2}|4[1-35-9]\\d|5(?:0[034]|[2-46]\\d|5[1-3]|7[1-7])))\\d{4}","\\d{7,8}",,,"22345678"] -,[,,"(?:5(?:0[02]|5\\d)|6(?:0[03679]|5[015-9]|6\\d|7[067])|9(?:0[09]|4[049]|[79]\\d))\\d{5}","\\d{8}",,,"50012345"] +,[,,"(?:5(?:0[02]|5\\d)|6(?:0[034679]|5[015-9]|6\\d|7[067])|9(?:0[09]|4[049]|[79]\\d))\\d{5}","\\d{8}",,,"50012345"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] @@ -2282,15 +2282,13 @@ i18n.phonenumbers.metadata.countryToMetadata = { ] ,"LA":[,[,,"[2-57]\\d{7,9}","\\d{6,10}"] ,[,,"(?:[2-57]1|54)\\d{6}","\\d{6,8}",,,"21212862"] -,[,,"20(?:[23]|5[4-6]|77|9[89])\\d{6}","\\d{9,10}",,,"202345678"] +,[,,"20(?:2[23]|5[4-6]|77|9[89])\\d{6}","\\d{10}",,,"2023123456"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"LA",856,"00","0",,,"0",,,,[[,"(20)([23])(\\d{3})(\\d{3})","$1 $2 $3 $4",["20[23]"] -,"0$1",""] -,[,"(20)([579]\\d)(\\d{3})(\\d{3})","$1 $2 $3 $4",["20[579]"] +,"LA",856,"00","0",,,"0",,,,[[,"(20)(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4",["20"] ,"0$1",""] ,[,"([2-57]\\d)(\\d{3})(\\d{3})","$1 $2 $3",["21|[3-57]"] ,"0$1",""] @@ -2424,24 +2422,24 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"801\\d{5}","\\d{8}",,,"80112345"] ,[,,"70\\d{6}","\\d{8}",,,"70123456"] ,[,,"20\\d{2,8}","\\d{4,10}",,,"2012345"] -,"LU",352,"00",,,,"15(?:0[06]|1[12]|35|4[04]|55|6[26]|77|88|99)\\d",,,,[[,"(\\d{2})(\\d{3})","$1 $2",["[23-5]|7[1-9]|[89](?:[1-9]|0[2-9])"] -,"",""] +,"LU",352,"00",,,,"(15(?:0[06]|1[12]|35|4[04]|55|6[26]|77|88|99)\\d)",,,,[[,"(\\d{2})(\\d{3})","$1 $2",["[23-5]|7[1-9]|[89](?:[1-9]|0[2-9])"] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["[23-5]|7[1-9]|[89](?:[1-9]|0[2-9])"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["20"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4",["2(?:[0367]|4[3-8])"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["20"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4 $5",["2(?:[0367]|4[3-8])"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{1,4})","$1 $2 $3 $4",["2(?:[12589]|4[12])|[3-5]|7[1-9]|[89](?:[1-9]|0[2-9])"] -,"",""] +,"","$CC $1"] ,[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[89]0[01]|70"] -,"",""] +,"","$CC $1"] ,[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6"] -,"",""] +,"","$CC $1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -2754,7 +2752,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"MU",230,"020",,,,,,,,[[,"([2-9]\\d{2})(\\d{4})","$1 $2",,"",""] +,"MU",230,"0(?:[2-7]0|33)",,,,,,"020",,[[,"([2-9]\\d{2})(\\d{4})","$1 $2",,"",""] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -3446,7 +3444,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,[,,"(?:4?4[1-3]|6?47)\\d{4}","\\d{6,7}",,,"4410123"] +,[,,"(?:44[1-3]|647)\\d{4}","\\d{7}",,,"4410123"] ,"SC",248,"0[0-2]",,,,,,"00",,[[,"(\\d{3})(\\d{3})","$1 $2",["[23578]|[46][0-35-9]"] ,"",""] ,[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[46]4"] @@ -3537,15 +3535,15 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,,,[,,"NA","NA"] ,[,,"7000\\d{7}","\\d{11}",,,"70001234567"] ] -,"SH":[,[] -,[] -,[] +,"SH":[,[,,"[2-9]\\d{3}","\\d{4}"] +,[,,"(?:[2-468]\\d|7[01])\\d{2}","\\d{4}",,,"2158"] ,[,,"NA","NA"] ,[,,"NA","NA"] +,[,,"(?:[59]\\d|7[2-9])\\d{2}","\\d{4}",,,"5012"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"SH",290,"00",,,,,,,1,,,[,,"NA","NA"] +,"SH",290,"00",,,,,,,,,,[,,"NA","NA"] ,,,[,,"NA","NA"] ,[,,"NA","NA"] ] @@ -3892,19 +3890,24 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,,,[,,"NA","NA"] ,[,,"NA","NA"] ] -,"TR":[,[,,"[2-589]\\d{9}","\\d{10}"] -,[,,"[2-4]\\d{9}|850\\d{7}","\\d{10}",,,"2123456789"] -,[,,"5\\d{9}","\\d{10}",,,"5123456789"] +,"TR":[,[,,"[2-589]\\d{9}|444\\d{4}","\\d{7,10}"] +,[,,"(?:2(?:[13][26]|[28][2468]|[45][268]|[67][246])|3(?:[13][28]|[24-6][2468]|[78][02468]|92)|4(?:[16][246]|[23578][2468]|4[26]))\\d{7}","\\d{10}",,,"2123456789"] +,[,,"5(?:0[1-35-7]|22|3\\d|4[1-79]|5[1-5]|9[246])\\d{7}","\\d{10}",,,"5012345678"] ,[,,"800\\d{7}","\\d{10}",,,"8001234567"] ,[,,"900\\d{7}","\\d{10}",,,"9001234567"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"TR",90,"00","0",,,"0",,,,[[,"([2-589]\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",,"0$1",""] +,"TR",90,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[23]|4(?:[0-35-9]|4[0-35-9])"] +,"(0$1)",""] +,[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[589]"] +,"0$1",""] +,[,"(444)(\\d{1})(\\d{3})","$1 $2 $3",["444"] +,"",""] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] -,[,,"NA","NA"] +,[,,"444\\d{4}|850\\d{7}","\\d{7,10}",,,"4441444"] ] ,"TT":[,[,,"[89]\\d{9}","\\d{7,10}"] ,[,,"868(?:2(?:01|2[1-4])|6(?:1[4-6]|2[1-9]|[3-6]\\d|7[0-79]|9[0-8])|82[12])\\d{4}","\\d{7,10}",,,"8682211234"] @@ -4081,7 +4084,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"VE",58,"00","0",,,"1\\d{2}|0",,,,[[,"(\\d{3})(\\d{7})","$1-$2",,"0$1",""] +,"VE",58,"00","0",,,"(1\\d{2})|0",,,,[[,"(\\d{3})(\\d{7})","$1-$2",,"0$1","$CC $1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] diff --git a/javascript/i18n/phonenumbers/metadatafortesting.js b/javascript/i18n/phonenumbers/metadatafortesting.js index 4c3a611..11c4bc6 100644 --- a/javascript/i18n/phonenumbers/metadatafortesting.js +++ b/javascript/i18n/phonenumbers/metadatafortesting.js @@ -94,7 +94,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,"9(11)(\\d{4})(\\d{4})","$1 15 $2-$3",["911"] ,"0$1",""] ,[,"9(\\d{4})(\\d{2})(\\d{4})","$1 $2-$3",["9(?:1[02-9]|[23])"] -,"0$1","$1 $CC"] +,"0$1","0$1 $CC"] ,[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[68]"] ,"0$1",""] ] @@ -154,6 +154,8 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,"0$1",""] ,[,"(\\d{2})(\\d{4,9})","$1 $2",["[34]0|[68]9"] ,"0$1",""] +,[,"([4-9]\\d)(\\d{2})","$1 $2",["[4-9]","[4-6]|[7-9](?:\\d[1-9]|[1-9]\\d)"] +,"0$1",""] ,[,"([4-9]\\d{3})(\\d{2,7})","$1 $2",["[4-9]","[4-6]|[7-9](?:\\d[1-9]|[1-9]\\d)"] ,"0$1",""] ,[,"(\\d{3})(\\d{1})(\\d{6})","$1 $2 $3",["800"] @@ -236,7 +238,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"50\\d{8}","\\d{10}",,,"5012345678"] ,[,,"70\\d{8}","\\d{10}",,,"7012345678"] -,"KR",82,"00(?:[124-68]|[37]\\d{2})","0",,,"0(?:8[1-46-8]|85\\d{2})?",,,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["1(?:0|1[19]|[69]9|5[458])|[57]0","1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"] +,"KR",82,"00(?:[124-68]|[37]\\d{2})","0",,,"0(8[1-46-8]|85\\d{2})?",,,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["1(?:0|1[19]|[69]9|5[458])|[57]0","1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"] ,"0$1",""] ,[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-9][1-9][2-9]","1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]"] ,"0$1",""] diff --git a/javascript/i18n/phonenumbers/metadatalite.js b/javascript/i18n/phonenumbers/metadatalite.js index 3add8c8..878bc5e 100644 --- a/javascript/i18n/phonenumbers/metadatalite.js +++ b/javascript/i18n/phonenumbers/metadatalite.js @@ -607,7 +607,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ] ,"BF":[,[,,"[2457]\\d{7}","\\d{8}"] ,[,,"(?:20(?:49|5[23]|9[016-9])|40(?:4[569]|55|7[0179])|50[34]\\d)\\d{4}","\\d{8}"] -,[,,"7(?:[024-6]\\d|1[0-489]|3[01]|8[013-9]|9[012])\\d{5}","\\d{8}"] +,[,,"7(?:[024-6]\\d|1[0-489]|3[0124]|7[01]|8[013-9]|9[0-4])\\d{5}","\\d{8}"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] @@ -733,9 +733,9 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,"BO",591,"00(1\\d)?","0",,,"0(1\\d)?",,,,[[,"([234])(\\d{7})","$1 $2",["[234]"] -,"",""] +,"","0$CC $1"] ,[,"([67]\\d{7})","$1",["[67]"] -,"",""] +,"","0$CC $1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -749,8 +749,8 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"(?:400\\d|3003)\\d{4}","\\d{8,10}"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"BR",55,"00(?:1[45]|2[135]|[34]1|43)","0",,,"0(?:(?:1[245]|2[135]|[34]1)(\\d{10}))?","$1",,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["[1-9][1-9]"] -,"($1)","0 $CC $1"] +,"BR",55,"00(?:1[45]|2[135]|[34]1|43)","0",,,"0(?:(1[245]|2[135]|[34]1)(\\d{10}))?","$2",,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1 $2-$3",["[1-9][1-9]"] +,"($1)","0 $CC ($1)"] ,[,"([34]00\\d)(\\d{4})","$1-$2",["[34]00","400|3003"] ,"",""] ,[,"([3589]00)(\\d{2,3})(\\d{4})","$1 $2 $3",["[3589]00"] @@ -951,10 +951,10 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"44\\d{7}","\\d{9}"] -,"CL",56,"(?:0|1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018]))0","0",,,"0|1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018])",,,,[[,"(2)(\\d{3})(\\d{4})","$1 $2 $3",["2"] -,"0$1",""] +,"CL",56,"(?:0|1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018]))0","0",,,"0|(1(?:1[0-69]|2[0-57]|5[13-58]|69|7[0167]|8[018]))",,,,[[,"(2)(\\d{3})(\\d{4})","$1 $2 $3",["2"] +,"($1)","$CC ($1)"] ,[,"(\\d{2})(\\d{2,3})(\\d{4})","$1 $2 $3",["[357]|4[1-35]|6[13-57]"] -,"0$1",""] +,"($1)","$CC ($1)"] ,[,"(9)([6-9]\\d{3})(\\d{4})","$1 $2 $3",["9"] ,"0$1",""] ,[,"(44)(\\d{3})(\\d{4})","$1 $2 $3",["44"] @@ -1043,10 +1043,10 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"CO",57,"00[579]|#555|#999","0",,,"0(?:[3579]|4(?:44|56))",,,,[[,"(\\d)(\\d{7})","($1) $2",["1(?:8[2-9]|9[0-3]|[2-7])|[24-8]","1(?:8[2-9]|9(?:09|[1-3])|[2-7])|[24-8]"] -,"",""] +,"CO",57,"00[579]|#555|#999","0",,,"0([3579]|4(?:44|56))",,,,[[,"(\\d)(\\d{7})","$1 $2",["1(?:8[2-9]|9[0-3]|[2-7])|[24-8]","1(?:8[2-9]|9(?:09|[1-3])|[2-7])|[24-8]"] +,"($1)","0$CC $1"] ,[,"(\\d{3})(\\d{7})","$1 $2",["3"] -,"",""] +,"","0$CC $1"] ,[,"(1)(\\d{3})(\\d{7})","$1-$2-$3",["1(?:80|9[04])","1(?:800|9(?:0[01]|4[78]))"] ,"0$1",""] ] @@ -1061,18 +1061,18 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,,,[,,"NA","NA"] ,[,,"NA","NA"] ] -,"CR":[,[,,"[289]\\d{7,9}","\\d{8,10}"] +,"CR":[,[,,"[2489]\\d{7,9}","\\d{8,10}"] ,[,,"2[24-7]\\d{6}","\\d{8}"] ,[,,"8[389]\\d{6}","\\d{8}"] ,[,,"800\\d{7}","\\d{10}"] ,[,,"90[059]\\d{7}","\\d{10}"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,[,,"NA","NA"] -,"CR",506,"00",,,,,,,,[[,"(\\d{4})(\\d{4})","$1 $2",["2|8[389]"] -,"",""] +,[,,"4000\\d{4}","\\d{8}"] +,"CR",506,"00",,,,"(1900)",,,,[[,"(\\d{4})(\\d{4})","$1 $2",["[24]|8[389]"] +,"","$CC $1"] ,[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["[89]0"] -,"",""] +,"","$CC $1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -1182,7 +1182,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ] ,"DK":[,[,,"[1-9]\\d{7}","\\d{8}"] ,[,,"(?:3[2-9]|4[3-9]|5[4-9]|6[2-9]|7[02-9]|8[26-9]|9[6-9])\\d{6}","\\d{8}"] -,[,,"(?:2[0-9]|3[0-2]|4[0-2]|5[0-3]|6[01]|72|99)\\d{6}","\\d{8}"] +,[,,"(?:2[0-9]|3[0-2]|4[0-2]|5[0-3]|6[01]|7[12]|81|99)\\d{6}","\\d{8}"] ,[,,"80\\d{6}","\\d{8}"] ,[,,"90\\d{6}","\\d{8}"] ,[,,"NA","NA"] @@ -1408,7 +1408,9 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"(?:6[0-36]|88)\\d{4}","\\d{6}"] -,"FO",298,"00",,,,"10(?:01|[12]0|88)",,,,,,[,,"NA","NA"] +,"FO",298,"00",,,,"(10(?:01|[12]0|88))",,,,[[,"(\\d{6})","$1",,"","$CC $1"] +] +,,[,,"NA","NA"] ,,,[,,"NA","NA"] ,[,,"NA","NA"] ] @@ -1491,8 +1493,8 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,,"473",[,,"NA","NA"] ,[,,"NA","NA"] ] -,"GE":[,[,,"[1-3579]\\d{7}|8\\d{8}","\\d{3,9}"] -,[,,"(?:122|2(?:22|36|5[03])|3(?:1[0-35-8]|[24-6]\\d|3[1-35679]|7[0-39]|9[1-35-7])|44[2-6])\\d{5}","\\d{3,8}"] +,"GE":[,[,,"[1-579]\\d{7}|8\\d{8}","\\d{5,9}"] +,[,,"(?:122|2(?:22|36|5[035])|3(?:1[0-35-8]|3[1-35679]|4\\d|7[0-39]|9[1-35-7])|3(?:[256]\\d|4[124-9]|7[0-4])|4(?:1\\d|2[2-7]|3[1-79]|4[2-8]|7[239]|9[1-7]))\\d{5}","\\d{5,8}"] ,[,,"(?:5[1578]|6[28]|7[0147-9]|9[0135-9])\\d{6}","\\d{8}"] ,[,,"800\\d{6}","\\d{9}"] ,[,,"NA","NA"] @@ -1500,12 +1502,10 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,"GE",995,"8~10","8",,,"8",,,,[[,"(32)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["32"] -,"8 $1",""] -,[,"(\\d{3})(\\d{5})","$1 $2",["2|3[13-79]|446"] -,"8 $1",""] -,[,"(\\d{4})(\\d{3,4})","$1 $2",["44[2-5]"] -,"8 $1",""] -,[,"(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3",["[5679]"] +,"8 ($1)",""] +,[,"(\\d{3})(\\d)(\\d{2})(\\d{2})","$1 $2 $3 $4",["[24]|3[13-79]"] +,"8 ($1)",""] +,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["[5679]"] ,"8 $1",""] ,[,"(800)(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3 $4",["8"] ,"8 $1",""] @@ -2212,28 +2212,28 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"50\\d{8}","\\d{10}"] ,[,,"70\\d{8}","\\d{10}"] -,"KR",82,"00(?:[124-68]|[37]\\d{2})","0",,,"0(?:8[1-46-8]|85\\d{2})?",,,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["1(?:0|1[19]|[69]9|5[458])|[57]0","1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"] -,"0$1",""] +,"KR",82,"00(?:[124-68]|[37]\\d{2})","0",,,"0(8[1-46-8]|85\\d{2})?",,,,[[,"(\\d{2})(\\d{4})(\\d{4})","$1-$2-$3",["1(?:0|1[19]|[69]9|5[458])|[57]0","1(?:0|1[19]|[69]9|5(?:44|59|8))|[57]0"] +,"0$1","0$CC-$1"] ,[,"(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3",["1(?:[169][2-8]|[78]|5[1-4])|[68]0|[3-9][1-9][2-9]","1(?:[169][2-8]|[78]|5(?:[1-3]|4[56]))|[68]0|[3-9][1-9][2-9]"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{3})(\\d)(\\d{4})","$1-$2-$3",["131","1312"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{3})(\\d{2})(\\d{4})","$1-$2-$3",["131","131[13-9]"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{3})(\\d{3})(\\d{4})","$1-$2-$3",["13[2-9]"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{2})(\\d{2})(\\d{3})(\\d{4})","$1-$2-$3-$4",["30"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d)(\\d{4})(\\d{4})","$1-$2-$3",["2(?:[26]|3[0-467])","2(?:[26]|3(?:01|1[45]|2[17-9]|39|4|6[67]|7[078]))"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d)(\\d{3})(\\d{4})","$1-$2-$3",["2(?:3[0-35-9]|[457-9])","2(?:3(?:0[02-9]|1[0-36-9]|2[02-6]|3[0-8]|6[0-589]|7[1-69]|[589])|[457-9])"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d)(\\d{3,4})","$1-$2",["21[0-46-9]"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{2})(\\d{3,4})","$1-$2",["[3-9][1-9]1","[3-9][1-9]1(?:[0-46-9])"] -,"0$1",""] +,"0$1","0$CC-$1"] ,[,"(\\d{4})(\\d{4})","$1-$2",["1(?:5[46-9]|6[04678])","1(?:5(?:44|66|77|88|99)|6(?:00|44|6[16]|70|88))"] -,"$1",""] +,"$1","0$CC-$1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -2241,7 +2241,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ] ,"KW":[,[,,"[12569]\\d{6,7}","\\d{7,8}"] ,[,,"(?:18\\d|2(?:[23]\\d{2}|4[1-35-9]\\d|5(?:0[034]|[2-46]\\d|5[1-3]|7[1-7])))\\d{4}","\\d{7,8}"] -,[,,"(?:5(?:0[02]|5\\d)|6(?:0[03679]|5[015-9]|6\\d|7[067])|9(?:0[09]|4[049]|[79]\\d))\\d{5}","\\d{8}"] +,[,,"(?:5(?:0[02]|5\\d)|6(?:0[034679]|5[015-9]|6\\d|7[067])|9(?:0[09]|4[049]|[79]\\d))\\d{5}","\\d{8}"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] @@ -2282,15 +2282,13 @@ i18n.phonenumbers.metadata.countryToMetadata = { ] ,"LA":[,[,,"[2-57]\\d{7,9}","\\d{6,10}"] ,[,,"(?:[2-57]1|54)\\d{6}","\\d{6,8}"] -,[,,"20(?:[23]|5[4-6]|77|9[89])\\d{6}","\\d{9,10}"] +,[,,"20(?:2[23]|5[4-6]|77|9[89])\\d{6}","\\d{10}"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"LA",856,"00","0",,,"0",,,,[[,"(20)([23])(\\d{3})(\\d{3})","$1 $2 $3 $4",["20[23]"] -,"0$1",""] -,[,"(20)([579]\\d)(\\d{3})(\\d{3})","$1 $2 $3 $4",["20[579]"] +,"LA",856,"00","0",,,"0",,,,[[,"(20)(\\d{2})(\\d{3})(\\d{3})","$1 $2 $3 $4",["20"] ,"0$1",""] ,[,"([2-57]\\d)(\\d{3})(\\d{3})","$1 $2 $3",["21|[3-57]"] ,"0$1",""] @@ -2424,24 +2422,24 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"801\\d{5}","\\d{8}"] ,[,,"70\\d{6}","\\d{8}"] ,[,,"20\\d{2,8}","\\d{4,10}"] -,"LU",352,"00",,,,"15(?:0[06]|1[12]|35|4[04]|55|6[26]|77|88|99)\\d",,,,[[,"(\\d{2})(\\d{3})","$1 $2",["[23-5]|7[1-9]|[89](?:[1-9]|0[2-9])"] -,"",""] +,"LU",352,"00",,,,"(15(?:0[06]|1[12]|35|4[04]|55|6[26]|77|88|99)\\d)",,,,[[,"(\\d{2})(\\d{3})","$1 $2",["[23-5]|7[1-9]|[89](?:[1-9]|0[2-9])"] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})","$1 $2 $3",["[23-5]|7[1-9]|[89](?:[1-9]|0[2-9])"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3",["20"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4",["2(?:[0367]|4[3-8])"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{3})","$1 $2 $3 $4",["20"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{2})(\\d{1,2})","$1 $2 $3 $4 $5",["2(?:[0367]|4[3-8])"] -,"",""] +,"","$CC $1"] ,[,"(\\d{2})(\\d{2})(\\d{2})(\\d{1,4})","$1 $2 $3 $4",["2(?:[12589]|4[12])|[3-5]|7[1-9]|[89](?:[1-9]|0[2-9])"] -,"",""] +,"","$CC $1"] ,[,"(\\d{3})(\\d{2})(\\d{3})","$1 $2 $3",["[89]0[01]|70"] -,"",""] +,"","$CC $1"] ,[,"(\\d{3})(\\d{3})(\\d{3})","$1 $2 $3",["6"] -,"",""] +,"","$CC $1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -2754,7 +2752,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"MU",230,"020",,,,,,,,[[,"([2-9]\\d{2})(\\d{4})","$1 $2",,"",""] +,"MU",230,"0(?:[2-7]0|33)",,,,,,"020",,[[,"([2-9]\\d{2})(\\d{4})","$1 $2",,"",""] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] @@ -3446,7 +3444,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,[,,"(?:4?4[1-3]|6?47)\\d{4}","\\d{6,7}"] +,[,,"(?:44[1-3]|647)\\d{4}","\\d{7}"] ,"SC",248,"0[0-2]",,,,,,"00",,[[,"(\\d{3})(\\d{3})","$1 $2",["[23578]|[46][0-35-9]"] ,"",""] ,[,"(\\d)(\\d{3})(\\d{3})","$1 $2 $3",["[46]4"] @@ -3537,15 +3535,15 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,,,[,,"NA","NA"] ,[,,"7000\\d{7}","\\d{11}"] ] -,"SH":[,[] -,[] -,[] +,"SH":[,[,,"[2-9]\\d{3}","\\d{4}"] +,[,,"(?:[2-468]\\d|7[01])\\d{2}","\\d{4}"] ,[,,"NA","NA"] ,[,,"NA","NA"] +,[,,"(?:[59]\\d|7[2-9])\\d{2}","\\d{4}"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"SH",290,"00",,,,,,,1,,,[,,"NA","NA"] +,"SH",290,"00",,,,,,,,,,[,,"NA","NA"] ,,,[,,"NA","NA"] ,[,,"NA","NA"] ] @@ -3892,19 +3890,24 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,,,[,,"NA","NA"] ,[,,"NA","NA"] ] -,"TR":[,[,,"[2-589]\\d{9}","\\d{10}"] -,[,,"[2-4]\\d{9}|850\\d{7}","\\d{10}"] -,[,,"5\\d{9}","\\d{10}"] +,"TR":[,[,,"[2-589]\\d{9}|444\\d{4}","\\d{7,10}"] +,[,,"(?:2(?:[13][26]|[28][2468]|[45][268]|[67][246])|3(?:[13][28]|[24-6][2468]|[78][02468]|92)|4(?:[16][246]|[23578][2468]|4[26]))\\d{7}","\\d{10}"] +,[,,"5(?:0[1-35-7]|22|3\\d|4[1-79]|5[1-5]|9[246])\\d{7}","\\d{10}"] ,[,,"800\\d{7}","\\d{10}"] ,[,,"900\\d{7}","\\d{10}"] ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"TR",90,"00","0",,,"0",,,,[[,"([2-589]\\d{2})(\\d{3})(\\d{4})","$1 $2 $3",,"0$1",""] +,"TR",90,"00","0",,,"0",,,,[[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[23]|4(?:[0-35-9]|4[0-35-9])"] +,"(0$1)",""] +,[,"(\\d{3})(\\d{3})(\\d{4})","$1 $2 $3",["[589]"] +,"0$1",""] +,[,"(444)(\\d{1})(\\d{3})","$1 $2 $3",["444"] +,"",""] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] -,[,,"NA","NA"] +,[,,"444\\d{4}|850\\d{7}","\\d{7,10}"] ] ,"TT":[,[,,"[89]\\d{9}","\\d{7,10}"] ,[,,"868(?:2(?:01|2[1-4])|6(?:1[4-6]|2[1-9]|[3-6]\\d|7[0-79]|9[0-8])|82[12])\\d{4}","\\d{7,10}"] @@ -4081,7 +4084,7 @@ i18n.phonenumbers.metadata.countryToMetadata = { ,[,,"NA","NA"] ,[,,"NA","NA"] ,[,,"NA","NA"] -,"VE",58,"00","0",,,"1\\d{2}|0",,,,[[,"(\\d{3})(\\d{7})","$1-$2",,"0$1",""] +,"VE",58,"00","0",,,"(1\\d{2})|0",,,,[[,"(\\d{3})(\\d{7})","$1-$2",,"0$1","$CC $1"] ] ,,[,,"NA","NA"] ,,,[,,"NA","NA"] diff --git a/javascript/i18n/phonenumbers/phonenumber.pb.js b/javascript/i18n/phonenumbers/phonenumber.pb.js index b529a62..e62168a 100644 --- a/javascript/i18n/phonenumbers/phonenumber.pb.js +++ b/javascript/i18n/phonenumbers/phonenumber.pb.js @@ -355,6 +355,57 @@ i18n.phonenumbers.PhoneNumber.prototype.clearCountryCodeSource = function() { /** + * Gets the value of the preferred_domestic_carrier_code field. + * @return {?string} The value. + */ +i18n.phonenumbers.PhoneNumber.prototype.getPreferredDomesticCarrierCode = function() { + return /** @type {?string} */ (this.get$Value(7)); +}; + + +/** + * Gets the value of the preferred_domestic_carrier_code field or the default value if not set. + * @return {string} The value. + */ +i18n.phonenumbers.PhoneNumber.prototype.getPreferredDomesticCarrierCodeOrDefault = function() { + return /** @type {string} */ (this.get$ValueOrDefault(7)); +}; + + +/** + * Sets the value of the preferred_domestic_carrier_code field. + * @param {string} value The value. + */ +i18n.phonenumbers.PhoneNumber.prototype.setPreferredDomesticCarrierCode = function(value) { + this.set$Value(7, value); +}; + + +/** + * @return {boolean} Whether the preferred_domestic_carrier_code field has a value. + */ +i18n.phonenumbers.PhoneNumber.prototype.hasPreferredDomesticCarrierCode = function() { + return this.has$Value(7); +}; + + +/** + * @return {number} The number of values in the preferred_domestic_carrier_code field. + */ +i18n.phonenumbers.PhoneNumber.prototype.preferredDomesticCarrierCodeCount = function() { + return this.count$Values(7); +}; + + +/** + * Clears the values in the preferred_domestic_carrier_code field. + */ +i18n.phonenumbers.PhoneNumber.prototype.clearPreferredDomesticCarrierCode = function() { + this.clear$Field(7); +}; + + +/** * Enumeration CountryCodeSource. * @enum {number} */ @@ -403,5 +454,10 @@ goog.proto2.Message.set$Metadata(i18n.phonenumbers.PhoneNumber, { fieldType: goog.proto2.Message.FieldType.ENUM, defaultValue: i18n.phonenumbers.PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN, type: i18n.phonenumbers.PhoneNumber.CountryCodeSource + }, + 7: { + name: 'preferred_domestic_carrier_code', + fieldType: goog.proto2.Message.FieldType.STRING, + type: String } }); diff --git a/javascript/i18n/phonenumbers/phonenumberutil.js b/javascript/i18n/phonenumbers/phonenumberutil.js index 7fc3557..d4a10d1 100644 --- a/javascript/i18n/phonenumbers/phonenumberutil.js +++ b/javascript/i18n/phonenumbers/phonenumberutil.js @@ -848,8 +848,7 @@ i18n.phonenumbers.PhoneNumberUtil.convertAlphaCharactersInNumber = * - some geographical numbers have no area codes. * * @param {i18n.phonenumbers.PhoneNumber} number the PhoneNumber object for - * which clients want to know the length of the area code in the - * national_number field. + * which clients want to know the length of the area code. * @return {number} the length of area code of the PhoneNumber object passed in. */ i18n.phonenumbers.PhoneNumberUtil.prototype.getLengthOfGeographicalAreaCode = @@ -926,8 +925,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.getLengthOfNationalDestinationCode = // We don't want to alter the proto given to us, but we don't want to // include the extension when we format it, so we copy it and clear the // extension here. - copiedProto = new i18n.phonenumbers.PhoneNumber(); - copiedProto.mergeFrom(number); + copiedProto = number.clone(); copiedProto.clearExtension(); } else { copiedProto = number; @@ -1126,8 +1124,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.formatByPattern = // replacements for different numbers have the appropriate national // prefix. /** type {i18n.phonenumbers.NumberFormat} */ - var numFormatCopy = new i18n.phonenumbers.NumberFormat(); - numFormatCopy.mergeFrom(numFormat); + var numFormatCopy = numFormat.clone(); /** @type {string} */ var nationalPrefix = this.getMetadataForRegion(regionCode).getNationalPrefixOrDefault(); @@ -1167,9 +1164,17 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.formatByPattern = /** - * @param {i18n.phonenumbers.PhoneNumber} number - * @param {string} carrierCode - * @return {string} + * Formats a phone number in national format for dialing using the carrier as + * specified in the carrierCode. The carrierCode will always be used regardless + * of whether the phone number already has a preferred domestic carrier code + * stored. If carrierCode contains an empty string, return the number in + * national format without any carrier code. + * + * @param {i18n.phonenumbers.PhoneNumber} number the phone number to be + * formatted. + * @param {string} carrierCode the carrier selection code to be used. + * @return {string} the formatted phone number in national format for dialing + * using the carrier as specified in the carrierCode. */ i18n.phonenumbers.PhoneNumberUtil.prototype. formatNationalNumberWithCarrierCode = function(number, carrierCode) { @@ -1204,6 +1209,37 @@ i18n.phonenumbers.PhoneNumberUtil.prototype. /** + * Formats a phone number in national format for dialing using the carrier as + * specified in the preferred_domestic_carrier_code field of the PhoneNumber + * object passed in. If that is missing, use the fallbackCarrierCode passed in + * instead. If there is no preferred_domestic_carrier_code, and the + * fallbackCarrierCode contains an empty string, return the number in national + * format without any carrier code. + * + * Use formatNationalNumberWithCarrierCode instead if the carrier code passed in + * should take precedence over the number's preferred_domestic_carrier_code when + * formatting. + * + * @param {i18n.phonenumbers.PhoneNumber} number the phone number to be + * formatted. + * @param {string} fallbackCarrierCode the carrier selection code to be used, if + * none is found in the phone number itself. + * @return {string} the formatted phone number in national format for dialing + * using the number's preferred_domestic_carrier_code, or the + * fallbackCarrierCode passed in if none is found. + */ +i18n.phonenumbers.PhoneNumberUtil.prototype. + formatNationalNumberWithPreferredCarrierCode = function( + number, fallbackCarrierCode) { + return this.formatNationalNumberWithCarrierCode( + number, + number.hasPreferredDomesticCarrierCode() ? + number.getPreferredDomesticCarrierCodeOrDefault() : + fallbackCarrierCode); +}; + + +/** * Formats a phone number for out-of-country dialing purpose. If no * countryCallingFrom is supplied, we format the number in its INTERNATIONAL * format. If the countryCallingFrom is the same as the country where the number @@ -1425,8 +1461,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.formatNationalNumber_ = /** * Note that carrierCode is optional - if NULL or an empty string, no carrier - * code replacement will take place. Carrier code replacement occurs before - * national prefix replacement. + * code replacement will take place. * * @param {string} nationalNumber a string of characters representing a phone * number. @@ -1456,39 +1491,42 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.formatAccordingToFormats_ = .search(numFormat.getLeadingDigitsPattern(size - 1)) == 0) { /** @type {RegExp} */ var patternToMatch = new RegExp(numFormat.getPattern()); - /** @type {string} */ - var numberFormatRule = numFormat.getFormatOrDefault(); if (i18n.phonenumbers.PhoneNumberUtil.matchesEntirely_(patternToMatch, nationalNumber)) { - if (opt_carrierCode != null && opt_carrierCode.length > 0) { - /** @type {string} */ - var domesticCarrierCodeFormattingRule = - numFormat.getDomesticCarrierCodeFormattingRuleOrDefault(); - if (domesticCarrierCodeFormattingRule.length > 0) { - // Replace the $CC in the formatting rule with the desired carrier - // code. - /** @type {string} */ - var carrierCodeFormattingRule = domesticCarrierCodeFormattingRule - .replace(i18n.phonenumbers.PhoneNumberUtil.CC_PATTERN_, - opt_carrierCode); - // Now replace the $FG in the formatting rule with the first group - // and the carrier code combined in the appropriate way. - numberFormatRule = numberFormatRule.replace( - i18n.phonenumbers.PhoneNumberUtil.FIRST_GROUP_PATTERN_, - carrierCodeFormattingRule); - } - } /** @type {string} */ - var nationalPrefixFormattingRule = - numFormat.getNationalPrefixFormattingRuleOrDefault(); + var numberFormatRule = numFormat.getFormatOrDefault(); + /** @type {string} */ + var domesticCarrierCodeFormattingRule = + numFormat.getDomesticCarrierCodeFormattingRuleOrDefault(); if (numberFormat == i18n.phonenumbers.PhoneNumberFormat.NATIONAL && - nationalPrefixFormattingRule != null && - nationalPrefixFormattingRule.length > 0) { - return nationalNumber.replace(patternToMatch, numberFormatRule - .replace(i18n.phonenumbers.PhoneNumberUtil.FIRST_GROUP_PATTERN_, - nationalPrefixFormattingRule)); - } else { + opt_carrierCode != null && opt_carrierCode.length > 0 && + domesticCarrierCodeFormattingRule.length > 0) { + // Replace the $CC in the formatting rule with the desired carrier + // code. + /** @type {string} */ + var carrierCodeFormattingRule = domesticCarrierCodeFormattingRule + .replace(i18n.phonenumbers.PhoneNumberUtil.CC_PATTERN_, + opt_carrierCode); + // Now replace the $FG in the formatting rule with the first group + // and the carrier code combined in the appropriate way. + numberFormatRule = numberFormatRule.replace( + i18n.phonenumbers.PhoneNumberUtil.FIRST_GROUP_PATTERN_, + carrierCodeFormattingRule); return nationalNumber.replace(patternToMatch, numberFormatRule); + } else { + // Use the national prefix formatting rule instead. + /** @type {string} */ + var nationalPrefixFormattingRule = + numFormat.getNationalPrefixFormattingRuleOrDefault(); + if (numberFormat == i18n.phonenumbers.PhoneNumberFormat.NATIONAL && + nationalPrefixFormattingRule != null && + nationalPrefixFormattingRule.length > 0) { + return nationalNumber.replace(patternToMatch, numberFormatRule + .replace(i18n.phonenumbers.PhoneNumberUtil.FIRST_GROUP_PATTERN_, + nationalPrefixFormattingRule)); + } else { + return nationalNumber.replace(patternToMatch, numberFormatRule); + } } } } @@ -2145,8 +2183,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.truncateTooLongNumber = return true; } /** @type {i18n.phonenumbers.PhoneNumber} */ - var numberCopy = new i18n.phonenumbers.PhoneNumber(); - numberCopy.mergeFrom(number); + var numberCopy = number.clone(); /** @type {number} */ var nationalNumber = number.getNationalNumberOrDefault(); do { @@ -2223,7 +2260,8 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.extractCountryCode = * the national significant number in, in the case that a country code was * extracted. The number is appended to any existing contents. If no country * code was extracted, this will be left unchanged. - * @param {boolean} storeCountryCodeSource true if the country_code_source field + * @param {boolean} keepRawInput true if the country_code_source and + * preferred_carrier_code fields of phoneNumber should be populated. * of phoneNumber should be populated. * @param {i18n.phonenumbers.PhoneNumber} phoneNumber the PhoneNumber object * that needs to be populated with country code and country code source. @@ -2234,7 +2272,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.extractCountryCode = */ i18n.phonenumbers.PhoneNumberUtil.prototype.maybeExtractCountryCode = function(number, defaultRegionMetadata, nationalNumber, - storeCountryCodeSource, phoneNumber) { + keepRawInput, phoneNumber) { if (number.length == 0) { return 0; @@ -2254,7 +2292,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.maybeExtractCountryCode = /** @type {i18n.phonenumbers.PhoneNumber.CountryCodeSource} */ var countryCodeSource = this.maybeStripInternationalPrefixAndNormalize( fullNumber, possibleCountryIddPrefix); - if (storeCountryCodeSource) { + if (keepRawInput) { phoneNumber.setCountryCodeSource(countryCodeSource); } if (countryCodeSource != @@ -2295,10 +2333,8 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.maybeExtractCountryCode = /** @type {!goog.string.StringBuffer} */ var potentialNationalNumber = new goog.string.StringBuffer( normalizedNumber.substring(defaultCountryCodeString.length)); - this.maybeStripNationalPrefix(potentialNationalNumber, - defaultRegionMetadata.getNationalPrefixForParsing(), - defaultRegionMetadata.getNationalPrefixTransformRule(), - validNumberPattern); + this.maybeStripNationalPrefixAndCarrierCode( + potentialNationalNumber, defaultRegionMetadata); /** @type {string} */ var potentialNationalNumberStr = potentialNationalNumber.toString(); /** @type {Array. } */ @@ -2315,7 +2351,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.maybeExtractCountryCode = possibleNumberMatchedLength > 0 && possibleNumberMatchedLength != potentialNationalNumberStr.length) { nationalNumber.append(potentialNationalNumberStr); - if (storeCountryCodeSource) { + if (keepRawInput) { phoneNumber.setCountryCodeSource( i18n.phonenumbers.PhoneNumber.CountryCodeSource .FROM_NUMBER_WITHOUT_PLUS_SIGN); @@ -2427,53 +2463,64 @@ i18n.phonenumbers.PhoneNumberUtil.prototype. * * @param {!goog.string.StringBuffer} number the normalized telephone number * that we wish to strip any national dialing prefix from. - * @param {?string} possibleNationalPrefix a regex that represents the national - * direct dialing prefix from the country we think this number may be dialed - * in. - * @param {?string} transformRule the string that specifies how number should be - * transformed according to the regex specified in possibleNationalPrefix. - * @param {RegExp} nationalNumberRule a regular expression that specifies what a - * valid phonenumber from this region should look like after any national - * prefix was stripped or transformed. - */ -i18n.phonenumbers.PhoneNumberUtil.prototype.maybeStripNationalPrefix = - function(number, possibleNationalPrefix, transformRule, - nationalNumberRule) { + * @param {i18n.phonenumbers.PhoneMetadata} metadata the metadata for the + * country that we think this number is from. + * @return {string} the carrier code extracted if it is present, otherwise + * return an empty string. + */ +i18n.phonenumbers.PhoneNumberUtil.prototype. + maybeStripNationalPrefixAndCarrierCode = function(number, metadata) { /** @type {string} */ + var carrierCode = ''; + /** @type {string} */ var numberStr = number.toString(); /** @type {number} */ var numberLength = numberStr.length; + /** @type {?string} */ + var possibleNationalPrefix = metadata.getNationalPrefixForParsing(); if (numberLength == 0 || possibleNationalPrefix == null || possibleNationalPrefix.length == 0) { // Early return for numbers of zero length. - return; + return carrierCode; } // Attempt to parse the first digits as a national prefix. /** @type {RegExp} */ - var re = new RegExp('^' + possibleNationalPrefix); + var prefixPattern = new RegExp('^' + possibleNationalPrefix); /** @type {Array.} */ - var m = re.exec(numberStr); - if (m) { + var prefixMatcher = prefixPattern.exec(numberStr); + if (prefixMatcher) { + /** @type {RegExp} */ + var nationalNumberRule = new RegExp( + metadata.getGeneralDesc().getNationalNumberPattern()); + // prefixMatcher[numOfGroups] == null implies nothing was captured by the + // capturing groups in possibleNationalPrefix; therefore, no transformation + // is necessary, and we just remove the national prefix. + /** @type {number} */ + var numOfGroups = prefixMatcher.length - 1; + /** @type {?string} */ + var transformRule = metadata.getNationalPrefixTransformRule(); /** @type {string} */ var transformedNumber; - // m[1] == null implies nothing was captured by the capturing groups in - // possibleNationalPrefix; therefore, no transformation is necessary, and - // we just remove the national prefix. - if (transformRule == null || transformRule.length == 0 || m[1] == null || - m[1].length == 0) { - transformedNumber = numberStr.substring(m[0].length); + if (transformRule == null || transformRule.length == 0 || + prefixMatcher[numOfGroups] == null || + prefixMatcher[numOfGroups].length == 0) { + transformedNumber = numberStr.substring(prefixMatcher[0].length); } else { - transformedNumber = numberStr.replace(re, transformRule); + transformedNumber = numberStr.replace(prefixPattern, transformRule); } // Check that the resultant number is viable. If not, return. if (!i18n.phonenumbers.PhoneNumberUtil.matchesEntirely_(nationalNumberRule, transformedNumber)) { - return; + return carrierCode; + } + if (numOfGroups > 0) { + carrierCode = prefixMatcher[1]; } number.clear(); number.append(transformedNumber); } + return carrierCode; }; @@ -2690,12 +2737,12 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.parseHelper_ = } if (countryMetadata != null) { - /** @type {RegExp} */ - var validNumberPattern = - new RegExp(countryMetadata.getGeneralDesc().getNationalNumberPattern()); - this.maybeStripNationalPrefix(normalizedNationalNumber, countryMetadata - .getNationalPrefixForParsing(), countryMetadata - .getNationalPrefixTransformRule(), validNumberPattern); + /** @type {string} */ + var carrierCode = this.maybeStripNationalPrefixAndCarrierCode( + normalizedNationalNumber, countryMetadata); + if (keepRawInput) { + phoneNumber.setPreferredDomesticCarrierCode(carrierCode); + } } /** @type {string} */ var normalizedNationalNumberStr = normalizedNationalNumber.toString(); @@ -2794,8 +2841,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isNumberMatch = } } } else { - firstNumber = new i18n.phonenumbers.PhoneNumber(); - firstNumber.mergeFrom(firstNumberIn); + firstNumber = firstNumberIn.clone(); } if (typeof secondNumberIn == 'string') { try { @@ -2809,16 +2855,17 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isNumberMatch = return this.isNumberMatch(secondNumberIn, firstNumber); } } else { - secondNumber = new i18n.phonenumbers.PhoneNumber(); - secondNumber.mergeFrom(secondNumberIn); + secondNumber = secondNumberIn.clone(); } - // First clear raw_input and country_code_source field and any empty-string - // extensions so that - // we can use the PhoneNumber.exactlySameAs() method. + // First clear raw_input, country_code_source and + // preferred_domestic_carrier_code fields and any empty-string extensions so + // that we can use the proto-buffer equality method. firstNumber.clearRawInput(); firstNumber.clearCountryCodeSource(); + firstNumber.clearPreferredDomesticCarrierCode(); secondNumber.clearRawInput(); secondNumber.clearCountryCodeSource(); + secondNumber.clearPreferredDomesticCarrierCode(); if (firstNumber.hasExtension() && firstNumber.getExtension().length == 0) { firstNumber.clearExtension(); } @@ -2837,7 +2884,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isNumberMatch = var secondNumberCountryCode = secondNumber.getCountryCodeOrDefault(); // Both had country code specified. if (firstNumberCountryCode != 0 && secondNumberCountryCode != 0) { - if (firstNumber.exactlySameAs(secondNumber)) { + if (firstNumber.equals(secondNumber)) { return i18n.phonenumbers.PhoneNumberUtil.MatchType.EXACT_MATCH; } else if (firstNumberCountryCode == secondNumberCountryCode && this.isNationalNumberSuffixOfTheOther_(firstNumber, secondNumber)) { @@ -2855,7 +2902,7 @@ i18n.phonenumbers.PhoneNumberUtil.prototype.isNumberMatch = firstNumber.setCountryCode(0); secondNumber.setCountryCode(0); // If all else was the same, then this is an NSN_MATCH. - if (firstNumber.exactlySameAs(secondNumber)) { + if (firstNumber.equals(secondNumber)) { return i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH; } if (this.isNationalNumberSuffixOfTheOther_(firstNumber, secondNumber)) { @@ -2937,56 +2984,3 @@ i18n.phonenumbers.PhoneNumberUtil.matchesEntirely_ = function(regex, str) { } return false; }; - - -/** - * @param {i18n.phonenumbers.PhoneNumber} other - * @return {boolean} - */ -i18n.phonenumbers.PhoneNumber.prototype.exactlySameAs = function(other) { - return other != null && - this.getCountryCode() == other.getCountryCode() && - this.getNationalNumber() == other.getNationalNumber() && - this.getExtension() == other.getExtension() && - this.getItalianLeadingZero() == other.getItalianLeadingZero() && - this.getRawInput() == other.getRawInput() && - this.getCountryCodeSource() == other.getCountryCodeSource(); -}; - - -/** - * @param {i18n.phonenumbers.PhoneNumberDesc} other - * @return {boolean} - */ -i18n.phonenumbers.PhoneNumberDesc.prototype.exactlySameAs = function(other) { - return other != null && - this.getNationalNumberPattern() == other.getNationalNumberPattern() && - this.getPossibleNumberPattern() == other.getPossibleNumberPattern() && - this.getExampleNumber() == other.getExampleNumber(); -}; - - -/** - * @param {i18n.phonenumbers.PhoneNumber} other - * @return {i18n.phonenumbers.PhoneNumber} - * @suppress {accessControls} - */ -i18n.phonenumbers.PhoneNumber.prototype.mergeFrom = function(other) { - if (other) { - this.values_ = goog.cloneObject(other.values_); - } - return this; -}; - - -/** - * @param {i18n.phonenumbers.NumberFormat} other - * @return {i18n.phonenumbers.NumberFormat} - * @suppress {accessControls} - */ -i18n.phonenumbers.NumberFormat.prototype.mergeFrom = function(other) { - if (other) { - this.values_ = goog.cloneObject(other.values_); - } - return this; -}; diff --git a/javascript/i18n/phonenumbers/phonenumberutil_test.js b/javascript/i18n/phonenumbers/phonenumberutil_test.js index 49f41a4..e084313 100644 --- a/javascript/i18n/phonenumbers/phonenumberutil_test.js +++ b/javascript/i18n/phonenumbers/phonenumberutil_test.js @@ -28,6 +28,131 @@ goog.require('i18n.phonenumbers.PhoneNumberUtil'); /** @type {i18n.phonenumbers.PhoneNumberUtil} */ var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance(); + +// Set up some test numbers to re-use. +/** @type {i18n.phonenumbers.PhoneNumber} */ +var ALPHA_NUMERIC_NUMBER = new i18n.phonenumbers.PhoneNumber(); +ALPHA_NUMERIC_NUMBER.setCountryCode(1); +ALPHA_NUMERIC_NUMBER.setNationalNumber(80074935247); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var AR_MOBILE = new i18n.phonenumbers.PhoneNumber(); +AR_MOBILE.setCountryCode(54); +AR_MOBILE.setNationalNumber(91187654321); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var AR_NUMBER = new i18n.phonenumbers.PhoneNumber(); +AR_NUMBER.setCountryCode(54); +AR_NUMBER.setNationalNumber(1187654321); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var AU_NUMBER = new i18n.phonenumbers.PhoneNumber(); +AU_NUMBER.setCountryCode(61); +AU_NUMBER.setNationalNumber(236618300); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var BS_MOBILE = new i18n.phonenumbers.PhoneNumber(); +BS_MOBILE.setCountryCode(1); +BS_MOBILE.setNationalNumber(2423570000); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var BS_NUMBER = new i18n.phonenumbers.PhoneNumber(); +BS_NUMBER.setCountryCode(1); +BS_NUMBER.setNationalNumber(2423651234); + + +// Note that this is the same as the example number for DE in the metadata. +/** @type {i18n.phonenumbers.PhoneNumber} */ +var DE_NUMBER = new i18n.phonenumbers.PhoneNumber(); +DE_NUMBER.setCountryCode(49); +DE_NUMBER.setNationalNumber(30123456); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var DE_SHORT_NUMBER = new i18n.phonenumbers.PhoneNumber(); +DE_SHORT_NUMBER.setCountryCode(49); +DE_SHORT_NUMBER.setNationalNumber(1234); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var GB_MOBILE = new i18n.phonenumbers.PhoneNumber(); +GB_MOBILE.setCountryCode(44); +GB_MOBILE.setNationalNumber(7912345678); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var GB_NUMBER = new i18n.phonenumbers.PhoneNumber(); +GB_NUMBER.setCountryCode(44); +GB_NUMBER.setNationalNumber(2070313000); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var IT_MOBILE = new i18n.phonenumbers.PhoneNumber(); +IT_MOBILE.setCountryCode(39); +IT_MOBILE.setNationalNumber(345678901); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var IT_NUMBER = new i18n.phonenumbers.PhoneNumber(); +IT_NUMBER.setCountryCode(39); +IT_NUMBER.setNationalNumber(236618300); +IT_NUMBER.setItalianLeadingZero(true); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var NZ_NUMBER = new i18n.phonenumbers.PhoneNumber(); +NZ_NUMBER.setCountryCode(64); +NZ_NUMBER.setNationalNumber(33316005); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var SG_NUMBER = new i18n.phonenumbers.PhoneNumber(); +SG_NUMBER.setCountryCode(65); +SG_NUMBER.setNationalNumber(65218000); + + +// A too-long and hence invalid US number. +/** @type {i18n.phonenumbers.PhoneNumber} */ +var US_LONG_NUMBER = new i18n.phonenumbers.PhoneNumber(); +US_LONG_NUMBER.setCountryCode(1); +US_LONG_NUMBER.setNationalNumber(65025300001); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var US_NUMBER = new i18n.phonenumbers.PhoneNumber(); +US_NUMBER.setCountryCode(1); +US_NUMBER.setNationalNumber(6502530000); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var US_PREMIUM = new i18n.phonenumbers.PhoneNumber(); +US_PREMIUM.setCountryCode(1); +US_PREMIUM.setNationalNumber(9002530000); + + +// Too short, but still possible US numbers. +/** @type {i18n.phonenumbers.PhoneNumber} */ +var US_LOCAL_NUMBER = new i18n.phonenumbers.PhoneNumber(); +US_LOCAL_NUMBER.setCountryCode(1); +US_LOCAL_NUMBER.setNationalNumber(2530000); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var US_SHORT_BY_ONE_NUMBER = new i18n.phonenumbers.PhoneNumber(); +US_SHORT_BY_ONE_NUMBER.setCountryCode(1); +US_SHORT_BY_ONE_NUMBER.setNationalNumber(650253000); + + +/** @type {i18n.phonenumbers.PhoneNumber} */ +var US_TOLLFREE = new i18n.phonenumbers.PhoneNumber(); +US_TOLLFREE.setCountryCode(1); +US_TOLLFREE.setNationalNumber(8002530000); + function testGetInstanceLoadUSMetadata() { /** @type {i18n.phonenumbers.PhoneMetadata} */ var metadata = phoneUtil.getMetadataForRegion('US'); @@ -43,7 +168,7 @@ function testGetInstanceLoadUSMetadata() { metadata.getGeneralDesc().getNationalNumberPattern()); assertEquals('\\d{7,10}', metadata.getGeneralDesc().getPossibleNumberPattern()); - assertTrue(metadata.getGeneralDesc().exactlySameAs(metadata.getFixedLine())); + assertTrue(metadata.getGeneralDesc().equals(metadata.getFixedLine())); assertEquals('\\d{10}', metadata.getTollFree().getPossibleNumberPattern()); assertEquals('900\\d{7}', @@ -60,12 +185,12 @@ function testGetInstanceLoadDEMetadata() { assertEquals(49, metadata.getCountryCode()); assertEquals('00', metadata.getInternationalPrefix()); assertEquals('0', metadata.getNationalPrefix()); - assertEquals(5, metadata.numberFormatCount()); - assertEquals(1, metadata.getNumberFormat(4).leadingDigitsPatternCount()); - assertEquals('900', metadata.getNumberFormat(4).getLeadingDigitsPattern(0)); + assertEquals(6, metadata.numberFormatCount()); + assertEquals(1, metadata.getNumberFormat(5).leadingDigitsPatternCount()); + assertEquals('900', metadata.getNumberFormat(5).getLeadingDigitsPattern(0)); assertEquals('(\\d{3})(\\d{3,4})(\\d{4})', - metadata.getNumberFormat(4).getPattern()); - assertEquals('$1 $2 $3', metadata.getNumberFormat(4).getFormat()); + metadata.getNumberFormat(5).getPattern()); + assertEquals('$1 $2 $3', metadata.getNumberFormat(5).getFormat()); assertEquals('(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:[1-9]\\d|0[2-9]))\\d{3,8}', metadata.getFixedLine().getNationalNumberPattern()); assertEquals('\\d{2,14}', metadata.getFixedLine().getPossibleNumberPattern()); @@ -93,136 +218,90 @@ function testGetInstanceLoadARMetadata() { } function testGetLengthOfGeographicalAreaCode() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var number = new i18n.phonenumbers.PhoneNumber(); // Google MTV, which has area code '650'. - number.setCountryCode(1); - number.setNationalNumber(6502530000); - assertEquals(3, phoneUtil.getLengthOfGeographicalAreaCode(number)); + assertEquals(3, phoneUtil.getLengthOfGeographicalAreaCode(US_NUMBER)); // A North America toll-free number, which has no area code. - number.setCountryCode(1); - number.setNationalNumber(8002530000); - assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number)); - - // An invalid US number (1 digit shorter), which has no area code. - number.setCountryCode(1); - number.setNationalNumber(650253000); - assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number)); + assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(US_TOLLFREE)); // Google London, which has area code '20'. - number.setCountryCode(44); - number.setNationalNumber(2070313000); - assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(number)); + assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(GB_NUMBER)); // A UK mobile phone, which has no area code. - number.setCountryCode(44); - number.setNationalNumber(7123456789); - assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number)); + assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(GB_MOBILE)); // Google Buenos Aires, which has area code '11'. - number.setCountryCode(54); - number.setNationalNumber(1155303000); - assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(number)); + assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(AR_NUMBER)); // Google Sydney, which has area code '2'. - number.setCountryCode(61); - number.setNationalNumber(293744000); - assertEquals(1, phoneUtil.getLengthOfGeographicalAreaCode(number)); + assertEquals(1, phoneUtil.getLengthOfGeographicalAreaCode(AU_NUMBER)); // Google Singapore. Singapore has no area code and no national prefix. - number.setCountryCode(65); - number.setNationalNumber(65218000); - assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number)); + assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(SG_NUMBER)); + + // An invalid US number (1 digit shorter), which has no area code. + assertEquals(0, + phoneUtil.getLengthOfGeographicalAreaCode(US_SHORT_BY_ONE_NUMBER)); } function testGetLengthOfNationalDestinationCode() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var number = new i18n.phonenumbers.PhoneNumber(); + // Google MTV, which has national destination code (NDC) '650'. + assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(US_NUMBER)); - // Google MTV, which has national destination code (NDC) "650". - number.setCountryCode(1); - number.setNationalNumber(6502530000); - assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(number)); + // A North America toll-free number, which has NDC '800'. + assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(US_TOLLFREE)); - // A North America toll-free number, which has NDC "800". - number.setCountryCode(1); - number.setNationalNumber(8002530000); - assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(number)); - - // Google London, which has NDC "20". - number.setCountryCode(44); - number.setNationalNumber(2070313000); - assertEquals(2, phoneUtil.getLengthOfNationalDestinationCode(number)); + // Google London, which has NDC '20'. + assertEquals(2, phoneUtil.getLengthOfNationalDestinationCode(GB_NUMBER)); - // A UK mobile phone, which has NDC "7123". - number.setCountryCode(44); - number.setNationalNumber(7123456789); - assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(number)); + // A UK mobile phone, which has NDC '7912'. + assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(GB_MOBILE)); - // Google Buenos Aires, which has NDC "11". - number.setCountryCode(54); - number.setNationalNumber(1155303000); - assertEquals(2, phoneUtil.getLengthOfNationalDestinationCode(number)); + // Google Buenos Aires, which has NDC '11'. + assertEquals(2, phoneUtil.getLengthOfNationalDestinationCode(AR_NUMBER)); - // An Argentinian mobile which has NDC "911". - number.setCountryCode(54); - number.setNationalNumber(91155303001); - assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(number)); + // An Argentinian mobile which has NDC '911'. + assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(AR_MOBILE)); - // Google Sydney, which has NDC "2". - number.setCountryCode(61); - number.setNationalNumber(293744000); - assertEquals(1, phoneUtil.getLengthOfNationalDestinationCode(number)); + // Google Sydney, which has NDC '2'. + assertEquals(1, phoneUtil.getLengthOfNationalDestinationCode(AU_NUMBER)); - // Google Singapore, which has NDC "6521". - number.setCountryCode(65); - number.setNationalNumber(65218000); - assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(number)); + // Google Singapore, which has NDC '6521'. + assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(SG_NUMBER)); // An invalid US number (1 digit shorter), which has no NDC. - number.setCountryCode(1); - number.setNationalNumber(650253000); - assertEquals(0, phoneUtil.getLengthOfNationalDestinationCode(number)); + assertEquals(0, + phoneUtil.getLengthOfNationalDestinationCode(US_SHORT_BY_ONE_NUMBER)); // A number containing an invalid country code, which shouldn't have any NDC. + /** @type {i18n.phonenumbers.PhoneNumber} */ + var number = new i18n.phonenumbers.PhoneNumber(); number.setCountryCode(123); number.setNationalNumber(6502530000); assertEquals(0, phoneUtil.getLengthOfNationalDestinationCode(number)); } function testGetNationalSignificantNumber() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var number = new i18n.phonenumbers.PhoneNumber(); - number.setCountryCode(1); - number.setNationalNumber(6502530000); assertEquals('6502530000', - i18n.phonenumbers.PhoneNumberUtil.getNationalSignificantNumber(number)); + i18n.phonenumbers.PhoneNumberUtil.getNationalSignificantNumber( + US_NUMBER)); // An Italian mobile number. - number.setCountryCode(39); - number.setNationalNumber(312345678); - assertEquals('312345678', - i18n.phonenumbers.PhoneNumberUtil.getNationalSignificantNumber(number)); + assertEquals('345678901', + i18n.phonenumbers.PhoneNumberUtil.getNationalSignificantNumber( + IT_MOBILE)); // An Italian fixed line number. - number.setCountryCode(39); - number.setNationalNumber(236618300); - number.setItalianLeadingZero(true); assertEquals('0236618300', - i18n.phonenumbers.PhoneNumberUtil.getNationalSignificantNumber(number)); + i18n.phonenumbers.PhoneNumberUtil.getNationalSignificantNumber( + IT_NUMBER)); } function testGetExampleNumber() { var PNT = i18n.phonenumbers.PhoneNumberType; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var deNumber = new i18n.phonenumbers.PhoneNumber(); - deNumber.setCountryCode(49); - deNumber.setNationalNumber(30123456); - assertTrue(deNumber.exactlySameAs(phoneUtil.getExampleNumber('DE'))); - assertTrue(deNumber.exactlySameAs(phoneUtil.getExampleNumber('de'))); + assertTrue(DE_NUMBER.equals(phoneUtil.getExampleNumber('DE'))); - assertTrue(deNumber.exactlySameAs( + assertTrue(DE_NUMBER.equals( phoneUtil.getExampleNumberForType('DE', PNT.FIXED_LINE))); assertNull(phoneUtil.getExampleNumberForType('DE', PNT.MOBILE)); // For the US, the example number is placed under general description, and @@ -280,78 +359,41 @@ function testNormaliseStripAlphaCharacters() { function testFormatUSNumber() { var PNF = i18n.phonenumbers.PhoneNumberFormat; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6502530000); assertEquals('650 253 0000', - phoneUtil.format(usNumber, PNF.NATIONAL)); + phoneUtil.format(US_NUMBER, PNF.NATIONAL)); assertEquals('+1 650 253 0000', - phoneUtil.format(usNumber, PNF.INTERNATIONAL)); + phoneUtil.format(US_NUMBER, PNF.INTERNATIONAL)); - usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(8002530000); assertEquals('800 253 0000', - phoneUtil.format(usNumber, PNF.NATIONAL)); + phoneUtil.format(US_TOLLFREE, PNF.NATIONAL)); assertEquals('+1 800 253 0000', - phoneUtil.format(usNumber, PNF.INTERNATIONAL)); + phoneUtil.format(US_TOLLFREE, PNF.INTERNATIONAL)); - usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(9002530000); assertEquals('900 253 0000', - phoneUtil.format(usNumber, PNF.NATIONAL)); + phoneUtil.format(US_PREMIUM, PNF.NATIONAL)); assertEquals('+1 900 253 0000', - phoneUtil.format(usNumber, PNF.INTERNATIONAL)); + phoneUtil.format(US_PREMIUM, PNF.INTERNATIONAL)); } function testFormatBSNumber() { var PNF = i18n.phonenumbers.PhoneNumberFormat; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var bsNumber = new i18n.phonenumbers.PhoneNumber(); - bsNumber.setCountryCode(1); - bsNumber.setNationalNumber(2421234567); - assertEquals('242 123 4567', - phoneUtil.format(bsNumber, PNF.NATIONAL)); - assertEquals('+1 242 123 4567', - phoneUtil.format(bsNumber, PNF.INTERNATIONAL)); - - bsNumber = new i18n.phonenumbers.PhoneNumber(); - bsNumber.setCountryCode(1); - bsNumber.setNationalNumber(8002530000); - assertEquals('800 253 0000', - phoneUtil.format(bsNumber, PNF.NATIONAL)); - assertEquals('+1 800 253 0000', - phoneUtil.format(bsNumber, PNF.INTERNATIONAL)); - - bsNumber = new i18n.phonenumbers.PhoneNumber(); - bsNumber.setCountryCode(1); - bsNumber.setNationalNumber(9002530000); - assertEquals('900 253 0000', - phoneUtil.format(bsNumber, PNF.NATIONAL)); - assertEquals('+1 900 253 0000', - phoneUtil.format(bsNumber, PNF.INTERNATIONAL)); + assertEquals('242 365 1234', + phoneUtil.format(BS_NUMBER, PNF.NATIONAL)); + assertEquals('+1 242 365 1234', + phoneUtil.format(BS_NUMBER, PNF.INTERNATIONAL)); } function testFormatGBNumber() { var PNF = i18n.phonenumbers.PhoneNumberFormat; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var gbNumber = new i18n.phonenumbers.PhoneNumber(); - gbNumber.setCountryCode(44); - gbNumber.setNationalNumber(2087389353); - assertEquals('(020) 8738 9353', - phoneUtil.format(gbNumber, PNF.NATIONAL)); - assertEquals('+44 20 8738 9353', - phoneUtil.format(gbNumber, PNF.INTERNATIONAL)); + assertEquals('(020) 7031 3000', + phoneUtil.format(GB_NUMBER, PNF.NATIONAL)); + assertEquals('+44 20 7031 3000', + phoneUtil.format(GB_NUMBER, PNF.INTERNATIONAL)); - gbNumber = new i18n.phonenumbers.PhoneNumber(); - gbNumber.setCountryCode(44); - gbNumber.setNationalNumber(7912345678); assertEquals('(07912) 345 678', - phoneUtil.format(gbNumber, PNF.NATIONAL)); + phoneUtil.format(GB_MOBILE, PNF.NATIONAL)); assertEquals('+44 7912 345 678', - phoneUtil.format(gbNumber, PNF.INTERNATIONAL)); + phoneUtil.format(GB_MOBILE, PNF.INTERNATIONAL)); } function testFormatDENumber() { @@ -383,10 +425,10 @@ function testFormatDENumber() { deNumber = new i18n.phonenumbers.PhoneNumber(); deNumber.setCountryCode(49); - deNumber.setNationalNumber(9123123); - assertEquals('09123 123', + deNumber.setNationalNumber(912312345); + assertEquals('09123 12345', phoneUtil.format(deNumber, PNF.NATIONAL)); - assertEquals('+49 9123 123', + assertEquals('+49 9123 12345', phoneUtil.format(deNumber, PNF.INTERNATIONAL)); deNumber = new i18n.phonenumbers.PhoneNumber(); @@ -397,57 +439,49 @@ function testFormatDENumber() { assertEquals('+49 8021 2345', phoneUtil.format(deNumber, PNF.INTERNATIONAL)); + // Note this number is correctly formatted without national prefix. Most of + // the numbers that are treated as invalid numbers by the library are short + // numbers, and they are usually not dialed with national prefix. + assertEquals('1234', + phoneUtil.format(DE_SHORT_NUMBER, PNF.NATIONAL)); + assertEquals('+49 1234', + phoneUtil.format(DE_SHORT_NUMBER, PNF.INTERNATIONAL)); + deNumber = new i18n.phonenumbers.PhoneNumber(); deNumber.setCountryCode(49); - deNumber.setNationalNumber(1234); - // Note this number is correctly formatted without national prefix. - // Most of the numbers that are treated as invalid numbers by the library are - // short numbers, and they are usually not dialed with national prefix. - assertEquals('1234', + deNumber.setNationalNumber(41341234); + assertEquals('04134 1234', phoneUtil.format(deNumber, PNF.NATIONAL)); - assertEquals('+49 1234', - phoneUtil.format(deNumber, PNF.INTERNATIONAL)); } function testFormatITNumber() { var PNF = i18n.phonenumbers.PhoneNumberFormat; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(236618300); - itNumber.setItalianLeadingZero(true); assertEquals('02 3661 8300', - phoneUtil.format(itNumber, PNF.NATIONAL)); + phoneUtil.format(IT_NUMBER, PNF.NATIONAL)); assertEquals('+39 02 3661 8300', - phoneUtil.format(itNumber, PNF.INTERNATIONAL)); + phoneUtil.format(IT_NUMBER, PNF.INTERNATIONAL)); assertEquals('+390236618300', - phoneUtil.format(itNumber, PNF.E164)); + phoneUtil.format(IT_NUMBER, PNF.E164)); - itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(345678901); assertEquals('345 678 901', - phoneUtil.format(itNumber, PNF.NATIONAL)); + phoneUtil.format(IT_MOBILE, PNF.NATIONAL)); assertEquals('+39 345 678 901', - phoneUtil.format(itNumber, PNF.INTERNATIONAL)); + phoneUtil.format(IT_MOBILE, PNF.INTERNATIONAL)); assertEquals('+39345678901', - phoneUtil.format(itNumber, PNF.E164)); + phoneUtil.format(IT_MOBILE, PNF.E164)); } function testFormatAUNumber() { var PNF = i18n.phonenumbers.PhoneNumberFormat; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var auNumber = new i18n.phonenumbers.PhoneNumber(); - auNumber.setCountryCode(61); - auNumber.setNationalNumber(236618300); assertEquals('02 3661 8300', - phoneUtil.format(auNumber, PNF.NATIONAL)); + phoneUtil.format(AU_NUMBER, PNF.NATIONAL)); assertEquals('+61 2 3661 8300', - phoneUtil.format(auNumber, PNF.INTERNATIONAL)); + phoneUtil.format(AU_NUMBER, PNF.INTERNATIONAL)); assertEquals('+61236618300', - phoneUtil.format(auNumber, PNF.E164)); + phoneUtil.format(AU_NUMBER, PNF.E164)); - auNumber = new i18n.phonenumbers.PhoneNumber(); + /** @type {i18n.phonenumbers.PhoneNumber} */ + var auNumber = new i18n.phonenumbers.PhoneNumber(); auNumber.setCountryCode(61); auNumber.setNationalNumber(1800123456); assertEquals('1800 123 456', @@ -460,268 +494,221 @@ function testFormatAUNumber() { function testFormatARNumber() { var PNF = i18n.phonenumbers.PhoneNumberFormat; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var arNumber = new i18n.phonenumbers.PhoneNumber(); - arNumber.setCountryCode(54); - arNumber.setNationalNumber(1187654321); assertEquals('011 8765-4321', - phoneUtil.format(arNumber, PNF.NATIONAL)); + phoneUtil.format(AR_NUMBER, PNF.NATIONAL)); assertEquals('+54 11 8765-4321', - phoneUtil.format(arNumber, PNF.INTERNATIONAL)); + phoneUtil.format(AR_NUMBER, PNF.INTERNATIONAL)); assertEquals('+541187654321', - phoneUtil.format(arNumber, PNF.E164)); + phoneUtil.format(AR_NUMBER, PNF.E164)); - arNumber = new i18n.phonenumbers.PhoneNumber(); - arNumber.setCountryCode(54); - arNumber.setNationalNumber(91187654321); assertEquals('011 15 8765-4321', - phoneUtil.format(arNumber, PNF.NATIONAL)); + phoneUtil.format(AR_MOBILE, PNF.NATIONAL)); assertEquals('+54 9 11 8765 4321', - phoneUtil.format(arNumber, PNF.INTERNATIONAL)); + phoneUtil.format(AR_MOBILE, PNF.INTERNATIONAL)); assertEquals('+5491187654321', - phoneUtil.format(arNumber, PNF.E164)); + phoneUtil.format(AR_MOBILE, PNF.E164)); } function testFormatOutOfCountryCallingNumber() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(9002530000); assertEquals('00 1 900 253 0000', - phoneUtil.formatOutOfCountryCallingNumber(usNumber, 'DE')); + phoneUtil.formatOutOfCountryCallingNumber(US_PREMIUM, 'DE')); - usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6502530000); assertEquals('1 650 253 0000', - phoneUtil.formatOutOfCountryCallingNumber(usNumber, 'BS')); + phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, 'BS')); assertEquals('0~0 1 650 253 0000', - phoneUtil.formatOutOfCountryCallingNumber(usNumber, 'PL')); + phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, 'PL')); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var gbNumber = new i18n.phonenumbers.PhoneNumber(); - gbNumber.setCountryCode(44); - gbNumber.setNationalNumber(7912345678); assertEquals('011 44 7912 345 678', - phoneUtil.formatOutOfCountryCallingNumber(gbNumber, 'US')); + phoneUtil.formatOutOfCountryCallingNumber(GB_MOBILE, 'US')); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var deNumber = new i18n.phonenumbers.PhoneNumber(); - deNumber.setCountryCode(49); - deNumber.setNationalNumber(1234); assertEquals('00 49 1234', - phoneUtil.formatOutOfCountryCallingNumber(deNumber, 'GB')); - // Note this number is correctly formatted without national prefix. - // Most of the numbers that are treated as invalid numbers by the library are - // short numbers, and they are usually not dialed with national prefix. + phoneUtil.formatOutOfCountryCallingNumber(DE_SHORT_NUMBER, 'GB')); + // Note this number is correctly formatted without national prefix. Most of + // the numbers that are treated as invalid numbers by the library are short + // numbers, and they are usually not dialed with national prefix. assertEquals('1234', - phoneUtil.formatOutOfCountryCallingNumber(deNumber, 'DE')); + phoneUtil.formatOutOfCountryCallingNumber(DE_SHORT_NUMBER, 'DE')); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(236618300); - itNumber.setItalianLeadingZero(true); assertEquals('011 39 02 3661 8300', - phoneUtil.formatOutOfCountryCallingNumber(itNumber, 'US')); + phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, 'US')); assertEquals('02 3661 8300', - phoneUtil.formatOutOfCountryCallingNumber(itNumber, 'IT')); + phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, 'IT')); assertEquals('+39 02 3661 8300', - phoneUtil.formatOutOfCountryCallingNumber(itNumber, 'SG')); + phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, 'SG')); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var sgNumber = new i18n.phonenumbers.PhoneNumber(); - sgNumber.setCountryCode(65); - sgNumber.setNationalNumber(94777892); - assertEquals('9477 7892', - phoneUtil.formatOutOfCountryCallingNumber(sgNumber, 'SG')); + assertEquals('6521 8000', + phoneUtil.formatOutOfCountryCallingNumber(SG_NUMBER, 'SG')); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var arNumber = new i18n.phonenumbers.PhoneNumber(); - arNumber.setCountryCode(54); - arNumber.setNationalNumber(91187654321); assertEquals('011 54 9 11 8765 4321', - phoneUtil.formatOutOfCountryCallingNumber(arNumber, 'US')); + phoneUtil.formatOutOfCountryCallingNumber(AR_MOBILE, 'US')); - arNumber.setExtension('1234'); + /** @type {i18n.phonenumbers.PhoneNumber} */ + var arNumberWithExtn = AR_MOBILE.clone(); + arNumberWithExtn.setExtension('1234'); assertEquals('011 54 9 11 8765 4321 ext. 1234', - phoneUtil.formatOutOfCountryCallingNumber(arNumber, 'US')); + phoneUtil.formatOutOfCountryCallingNumber(arNumberWithExtn, 'US')); assertEquals('0011 54 9 11 8765 4321 ext. 1234', - phoneUtil.formatOutOfCountryCallingNumber(arNumber, 'AU')); + phoneUtil.formatOutOfCountryCallingNumber(arNumberWithExtn, 'AU')); assertEquals('011 15 8765-4321 ext. 1234', - phoneUtil.formatOutOfCountryCallingNumber(arNumber, 'AR')); + phoneUtil.formatOutOfCountryCallingNumber(arNumberWithExtn, 'AR')); } function testFormatOutOfCountryWithPreferredIntlPrefix() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(236618300); - itNumber.setItalianLeadingZero(true); // This should use 0011, since that is the preferred international prefix // (both 0011 and 0012 are accepted as possible international prefixes in our // test metadta.) assertEquals('0011 39 02 3661 8300', - phoneUtil.formatOutOfCountryCallingNumber(itNumber, 'AU')); + phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, 'AU')); } function testFormatWithCarrierCode() { var PNF = i18n.phonenumbers.PhoneNumberFormat; + // We only support this for AR in our test metadata, and only for mobile + // numbers starting with certain values. + /** @type {i18n.phonenumbers.PhoneNumber} */ + var arMobile = new i18n.phonenumbers.PhoneNumber(); + arMobile.setCountryCode(54); + arMobile.setNationalNumber(92234654321); + assertEquals('02234 65-4321', phoneUtil.format(arMobile, PNF.NATIONAL)); + // Here we force 14 as the carrier code. + assertEquals('02234 14 65-4321', + phoneUtil.formatNationalNumberWithCarrierCode(arMobile, '14')); + // Here we force the number to be shown with no carrier code. + assertEquals('02234 65-4321', + phoneUtil.formatNationalNumberWithCarrierCode(arMobile, '')); + // Here the international rule is used, so no carrier code should be present. + assertEquals('+5492234654321', phoneUtil.format(arMobile, PNF.E164)); + // We don't support this for the US so there should be no change. + assertEquals('650 253 0000', + phoneUtil.formatNationalNumberWithCarrierCode(US_NUMBER, '15')); +} + +function testFormatWithPreferredCarrierCode() { + var PNF = i18n.phonenumbers.PhoneNumberFormat; // We only support this for AR in our test metadata. /** @type {i18n.phonenumbers.PhoneNumber} */ var arNumber = new i18n.phonenumbers.PhoneNumber(); arNumber.setCountryCode(54); arNumber.setNationalNumber(91234125678); - assertEquals('01234 12-5678', - phoneUtil.format(arNumber, PNF.NATIONAL)); - // Test formatting with a carrier code. + // Test formatting with no preferred carrier code stored in the number itself. assertEquals('01234 15 12-5678', - phoneUtil.formatNationalNumberWithCarrierCode(arNumber, '15')); - // Here the international rule is used, so no carrier code should be present. - assertEquals('+5491234125678', - phoneUtil.format(arNumber, PNF.E164)); + phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, '15')); + assertEquals('01234 12-5678', + phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, '')); + // Test formatting with preferred carrier code present. + arNumber.setPreferredDomesticCarrierCode('19'); + assertEquals('01234 12-5678', phoneUtil.format(arNumber, PNF.NATIONAL)); + assertEquals('01234 19 12-5678', + phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, '15')); + assertEquals('01234 19 12-5678', + phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, '')); + // When the preferred_domestic_carrier_code is present (even when it contains + // an empty string), use it instead of the default carrier code passed in. + arNumber.setPreferredDomesticCarrierCode(''); + assertEquals('01234 12-5678', + phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, '15')); // We don't support this for the US so there should be no change. /** @type {i18n.phonenumbers.PhoneNumber} */ var usNumber = new i18n.phonenumbers.PhoneNumber(); usNumber.setCountryCode(1); usNumber.setNationalNumber(4241231234); + usNumber.setPreferredDomesticCarrierCode('99'); + assertEquals('424 123 1234', phoneUtil.format(usNumber, PNF.NATIONAL)); assertEquals('424 123 1234', - phoneUtil.format(usNumber, PNF.NATIONAL)); - assertEquals('424 123 1234', - phoneUtil.formatNationalNumberWithCarrierCode(usNumber, '15')); + phoneUtil.formatNationalNumberWithPreferredCarrierCode(usNumber, '15')); } function testFormatByPattern() { var PNF = i18n.phonenumbers.PhoneNumberFormat; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6502530000); /** @type {i18n.phonenumbers.NumberFormat} */ var newNumFormat = new i18n.phonenumbers.NumberFormat(); newNumFormat.setPattern('(\\d{3})(\\d{3})(\\d{4})'); newNumFormat.setFormat('($1) $2-$3'); - /** @type {Array.} */ - var newNumberFormats = []; - newNumberFormats[0] = newNumFormat; assertEquals('(650) 253-0000', - phoneUtil.formatByPattern(usNumber, + phoneUtil.formatByPattern(US_NUMBER, PNF.NATIONAL, - newNumberFormats)); + [newNumFormat])); assertEquals('+1 (650) 253-0000', - phoneUtil.formatByPattern(usNumber, + phoneUtil.formatByPattern(US_NUMBER, PNF.INTERNATIONAL, - newNumberFormats)); + [newNumFormat])); // $NP is set to '1' for the US. Here we check that for other NANPA countries // the US rules are followed. newNumFormat.setNationalPrefixFormattingRule('$NP ($FG)'); newNumFormat.setFormat('$1 $2-$3'); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var bsNumber = new i18n.phonenumbers.PhoneNumber(); - bsNumber.setCountryCode(1); - bsNumber.setNationalNumber(4168819999); - assertEquals('1 (416) 881-9999', - phoneUtil.formatByPattern(bsNumber, + assertEquals('1 (242) 365-1234', + phoneUtil.formatByPattern(BS_NUMBER, PNF.NATIONAL, - newNumberFormats)); - assertEquals('+1 416 881-9999', - phoneUtil.formatByPattern(bsNumber, + [newNumFormat])); + assertEquals('+1 242 365-1234', + phoneUtil.formatByPattern(BS_NUMBER, PNF.INTERNATIONAL, - newNumberFormats)); - - /** @type {i18n.phonenumbers.PhoneNumber} */ - var itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(236618300); - itNumber.setItalianLeadingZero(true); + [newNumFormat])); newNumFormat.setPattern('(\\d{2})(\\d{5})(\\d{3})'); newNumFormat.setFormat('$1-$2 $3'); - newNumberFormats[0] = newNumFormat; assertEquals('02-36618 300', - phoneUtil.formatByPattern(itNumber, + phoneUtil.formatByPattern(IT_NUMBER, PNF.NATIONAL, - newNumberFormats)); + [newNumFormat])); assertEquals('+39 02-36618 300', - phoneUtil.formatByPattern(itNumber, + phoneUtil.formatByPattern(IT_NUMBER, PNF.INTERNATIONAL, - newNumberFormats)); - - /** @type {i18n.phonenumbers.PhoneNumber} */ - var gbNumber = new i18n.phonenumbers.PhoneNumber(); - gbNumber.setCountryCode(44); - gbNumber.setNationalNumber(2012345678); + [newNumFormat])); newNumFormat.setNationalPrefixFormattingRule('$NP$FG'); newNumFormat.setPattern('(\\d{2})(\\d{4})(\\d{4})'); newNumFormat.setFormat('$1 $2 $3'); - newNumberFormats[0] = newNumFormat; - assertEquals('020 1234 5678', - phoneUtil.formatByPattern(gbNumber, + assertEquals('020 7031 3000', + phoneUtil.formatByPattern(GB_NUMBER, PNF.NATIONAL, - newNumberFormats)); + [newNumFormat])); newNumFormat.setNationalPrefixFormattingRule('($NP$FG)'); - newNumberFormats[0] = newNumFormat; - assertEquals('(020) 1234 5678', - phoneUtil.formatByPattern(gbNumber, + assertEquals('(020) 7031 3000', + phoneUtil.formatByPattern(GB_NUMBER, PNF.NATIONAL, - newNumberFormats)); + [newNumFormat])); newNumFormat.setNationalPrefixFormattingRule(''); - newNumberFormats[0] = newNumFormat; - assertEquals('20 1234 5678', - phoneUtil.formatByPattern(gbNumber, + assertEquals('20 7031 3000', + phoneUtil.formatByPattern(GB_NUMBER, PNF.NATIONAL, - newNumberFormats)); + [newNumFormat])); - newNumFormat.setNationalPrefixFormattingRule(''); - newNumberFormats[0] = newNumFormat; - assertEquals('+44 20 1234 5678', - phoneUtil.formatByPattern(gbNumber, + assertEquals('+44 20 7031 3000', + phoneUtil.formatByPattern(GB_NUMBER, PNF.INTERNATIONAL, - newNumberFormats)); + [newNumFormat])); } function testFormatE164Number() { var PNF = i18n.phonenumbers.PhoneNumberFormat; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6502530000); - assertEquals('+16502530000', phoneUtil.format(usNumber, PNF.E164)); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var deNumber = new i18n.phonenumbers.PhoneNumber(); - deNumber.setCountryCode(49); - deNumber.setNationalNumber(301234); - assertEquals('+49301234', phoneUtil.format(deNumber, PNF.E164)); + assertEquals('+16502530000', phoneUtil.format(US_NUMBER, PNF.E164)); + assertEquals('+4930123456', phoneUtil.format(DE_NUMBER, PNF.E164)); } function testFormatNumberWithExtension() { var PNF = i18n.phonenumbers.PhoneNumberFormat; /** @type {i18n.phonenumbers.PhoneNumber} */ - var nzNumber = new i18n.phonenumbers.PhoneNumber(); - nzNumber.setCountryCode(64); - nzNumber.setNationalNumber(33316005); + var nzNumber = NZ_NUMBER.clone(); nzNumber.setExtension('1234'); // Uses default extension prefix: assertEquals('03-331 6005 ext. 1234', phoneUtil.format(nzNumber, PNF.NATIONAL)); // Extension prefix overridden in the territory information for the US: /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6502530000); - usNumber.setExtension('4567'); + var usNumberWithExtension = US_NUMBER.clone(); + usNumberWithExtension.setExtension('4567'); assertEquals('650 253 0000 extn. 4567', - phoneUtil.format(usNumber, PNF.NATIONAL)); + phoneUtil.format(usNumberWithExtension, PNF.NATIONAL)); } -function testFormatInOriginalFormat() { +function testFormatUsingOriginalNumberFormat() { /** @type {i18n.phonenumbers.PhoneNumber} */ var number1 = phoneUtil.parseAndKeepRawInput('+442087654321', 'GB'); assertEquals('+44 20 8765 4321', @@ -750,13 +737,10 @@ function testFormatInOriginalFormat() { function testIsPremiumRate() { var PNT = i18n.phonenumbers.PhoneNumberType; + assertEquals(PNT.PREMIUM_RATE, phoneUtil.getNumberType(US_PREMIUM)); + /** @type {i18n.phonenumbers.PhoneNumber} */ var premiumRateNumber = new i18n.phonenumbers.PhoneNumber(); - - premiumRateNumber.setCountryCode(1); - premiumRateNumber.setNationalNumber(9004433030); - assertEquals(PNT.PREMIUM_RATE, phoneUtil.getNumberType(premiumRateNumber)); - premiumRateNumber = new i18n.phonenumbers.PhoneNumber(); premiumRateNumber.setCountryCode(39); premiumRateNumber.setNationalNumber(892123); @@ -805,73 +789,33 @@ function testIsTollFree() { function testIsMobile() { var PNT = i18n.phonenumbers.PhoneNumberType; + assertEquals(PNT.MOBILE, phoneUtil.getNumberType(BS_MOBILE)); + assertEquals(PNT.MOBILE, phoneUtil.getNumberType(GB_MOBILE)); + assertEquals(PNT.MOBILE, phoneUtil.getNumberType(IT_MOBILE)); + assertEquals(PNT.MOBILE, phoneUtil.getNumberType(AR_MOBILE)); + /** @type {i18n.phonenumbers.PhoneNumber} */ var mobileNumber = new i18n.phonenumbers.PhoneNumber(); - - // A Bahama mobile number - mobileNumber.setCountryCode(1); - mobileNumber.setNationalNumber(2423570000); - assertEquals(PNT.MOBILE, phoneUtil.getNumberType(mobileNumber)); - - mobileNumber = new i18n.phonenumbers.PhoneNumber(); - mobileNumber.setCountryCode(39); - mobileNumber.setNationalNumber(312345678); - assertEquals(PNT.MOBILE, phoneUtil.getNumberType(mobileNumber)); - - mobileNumber = new i18n.phonenumbers.PhoneNumber(); - mobileNumber.setCountryCode(44); - mobileNumber.setNationalNumber(7912345678); - assertEquals(PNT.MOBILE, phoneUtil.getNumberType(mobileNumber)); - - mobileNumber = new i18n.phonenumbers.PhoneNumber(); mobileNumber.setCountryCode(49); mobileNumber.setNationalNumber(15123456789); assertEquals(PNT.MOBILE, phoneUtil.getNumberType(mobileNumber)); - - mobileNumber = new i18n.phonenumbers.PhoneNumber(); - mobileNumber.setCountryCode(54); - mobileNumber.setNationalNumber(91187654321); - assertEquals(PNT.MOBILE, phoneUtil.getNumberType(mobileNumber)); } function testIsFixedLine() { var PNT = i18n.phonenumbers.PhoneNumberType; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var fixedLineNumber = new i18n.phonenumbers.PhoneNumber(); - - // A Bahama fixed-line number - fixedLineNumber.setCountryCode(1); - fixedLineNumber.setNationalNumber(2423651234); - assertEquals(PNT.FIXED_LINE, phoneUtil.getNumberType(fixedLineNumber)); - - // An Italian fixed-line number - fixedLineNumber = new i18n.phonenumbers.PhoneNumber(); - fixedLineNumber.setCountryCode(39); - fixedLineNumber.setNationalNumber(236618300); - fixedLineNumber.setItalianLeadingZero(true); - assertEquals(PNT.FIXED_LINE, phoneUtil.getNumberType(fixedLineNumber)); - - fixedLineNumber = new i18n.phonenumbers.PhoneNumber(); - fixedLineNumber.setCountryCode(44); - fixedLineNumber.setNationalNumber(2012345678); - assertEquals(PNT.FIXED_LINE, phoneUtil.getNumberType(fixedLineNumber)); - - fixedLineNumber = new i18n.phonenumbers.PhoneNumber(); - fixedLineNumber.setCountryCode(49); - fixedLineNumber.setNationalNumber(301234); - assertEquals(PNT.FIXED_LINE, phoneUtil.getNumberType(fixedLineNumber)); + assertEquals(PNT.FIXED_LINE, phoneUtil.getNumberType(BS_NUMBER)); + assertEquals(PNT.FIXED_LINE, phoneUtil.getNumberType(IT_NUMBER)); + assertEquals(PNT.FIXED_LINE, phoneUtil.getNumberType(GB_NUMBER)); + assertEquals(PNT.FIXED_LINE, phoneUtil.getNumberType(DE_NUMBER)); } function testIsFixedLineAndMobile() { var PNT = i18n.phonenumbers.PhoneNumberType; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var fixedLineAndMobileNumber = new i18n.phonenumbers.PhoneNumber(); - fixedLineAndMobileNumber.setCountryCode(1); - fixedLineAndMobileNumber.setNationalNumber(6502531111); assertEquals(PNT.FIXED_LINE_OR_MOBILE, - phoneUtil.getNumberType(fixedLineAndMobileNumber)); + phoneUtil.getNumberType(US_NUMBER)); - fixedLineAndMobileNumber = new i18n.phonenumbers.PhoneNumber(); + /** @type {i18n.phonenumbers.PhoneNumber} */ + var fixedLineAndMobileNumber = new i18n.phonenumbers.PhoneNumber(); fixedLineAndMobileNumber.setCountryCode(54); fixedLineAndMobileNumber.setNationalNumber(1987654321); assertEquals(PNT.FIXED_LINE_OR_MOBILE, @@ -907,32 +851,14 @@ function testIsPersonalNumber() { function testIsUnknown() { var PNT = i18n.phonenumbers.PhoneNumberType; - /** @type {i18n.phonenumbers.PhoneNumber} */ - var unknownNumber = new i18n.phonenumbers.PhoneNumber(); - unknownNumber.setCountryCode(1); - unknownNumber.setNationalNumber(65025311111); - assertEquals(PNT.UNKNOWN, phoneUtil.getNumberType(unknownNumber)); + // Invalid numbers should be of type UNKNOWN. + assertEquals(PNT.UNKNOWN, phoneUtil.getNumberType(US_LOCAL_NUMBER)); } function testIsValidNumber() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6502530000); - assertTrue(phoneUtil.isValidNumber(usNumber)); - - /** @type {i18n.phonenumbers.PhoneNumber} */ - var itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(236618300); - itNumber.setItalianLeadingZero(true); - assertTrue(phoneUtil.isValidNumber(itNumber)); - - /** @type {i18n.phonenumbers.PhoneNumber} */ - var gbNumber = new i18n.phonenumbers.PhoneNumber(); - gbNumber.setCountryCode(44); - gbNumber.setNationalNumber(7912345678); - assertTrue(phoneUtil.isValidNumber(gbNumber)); + assertTrue(phoneUtil.isValidNumber(US_NUMBER)); + assertTrue(phoneUtil.isValidNumber(IT_NUMBER)); + assertTrue(phoneUtil.isValidNumber(GB_MOBILE)); /** @type {i18n.phonenumbers.PhoneNumber} */ var nzNumber = new i18n.phonenumbers.PhoneNumber(); @@ -941,20 +867,18 @@ function testIsValidNumber() { assertTrue(phoneUtil.isValidNumber(nzNumber)); } - function testIsValidForRegion() { // This number is valid for the Bahamas, but is not a valid US number. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var bsNumber = new i18n.phonenumbers.PhoneNumber(); - bsNumber.setCountryCode(1); - bsNumber.setNationalNumber(2423232345); - assertTrue(phoneUtil.isValidNumber(bsNumber)); - assertTrue(phoneUtil.isValidNumberForRegion(bsNumber, 'BS')); - assertTrue(phoneUtil.isValidNumberForRegion(bsNumber, 'bs')); - assertFalse(phoneUtil.isValidNumberForRegion(bsNumber, 'US')); - bsNumber.setNationalNumber(2421232345); + assertTrue(phoneUtil.isValidNumber(BS_NUMBER)); + assertTrue(phoneUtil.isValidNumberForRegion(BS_NUMBER, 'BS')); + assertTrue(phoneUtil.isValidNumberForRegion(BS_NUMBER, 'bs')); + assertFalse(phoneUtil.isValidNumberForRegion(BS_NUMBER, 'US')); + /** @type {i18n.phonenumbers.PhoneNumber} */ + var bsInvalidNumber = new i18n.phonenumbers.PhoneNumber(); + bsInvalidNumber.setCountryCode(1); + bsInvalidNumber.setNationalNumber(2421232345); // This number is no longer valid. - assertFalse(phoneUtil.isValidNumber(bsNumber)); + assertFalse(phoneUtil.isValidNumber(bsInvalidNumber)); // La Mayotte and Reunion use 'leadingDigits' to differentiate them. /** @type {i18n.phonenumbers.PhoneNumber} */ @@ -983,36 +907,29 @@ function testIsValidForRegion() { } function testIsNotValidNumber() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(2530000); - assertFalse(phoneUtil.isValidNumber(usNumber)); + assertFalse(phoneUtil.isValidNumber(US_LOCAL_NUMBER)); /** @type {i18n.phonenumbers.PhoneNumber} */ - var itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(23661830000); - itNumber.setItalianLeadingZero(true); - assertFalse(phoneUtil.isValidNumber(itNumber)); + var invalidNumber = new i18n.phonenumbers.PhoneNumber(); + invalidNumber.setCountryCode(39); + invalidNumber.setNationalNumber(23661830000); + invalidNumber.setItalianLeadingZero(true); + assertFalse(phoneUtil.isValidNumber(invalidNumber)); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var gbNumber = new i18n.phonenumbers.PhoneNumber(); - gbNumber.setCountryCode(44); - gbNumber.setNationalNumber(791234567); - assertFalse(phoneUtil.isValidNumber(gbNumber)); + invalidNumber = new i18n.phonenumbers.PhoneNumber(); + invalidNumber.setCountryCode(44); + invalidNumber.setNationalNumber(791234567); + assertFalse(phoneUtil.isValidNumber(invalidNumber)); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var deNumber = new i18n.phonenumbers.PhoneNumber(); - deNumber.setCountryCode(49); - deNumber.setNationalNumber(1234); - assertFalse(phoneUtil.isValidNumber(deNumber)); + invalidNumber = new i18n.phonenumbers.PhoneNumber(); + invalidNumber.setCountryCode(49); + invalidNumber.setNationalNumber(1234); + assertFalse(phoneUtil.isValidNumber(invalidNumber)); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var nzNumber = new i18n.phonenumbers.PhoneNumber(); - nzNumber.setCountryCode(64); - nzNumber.setNationalNumber(3316005); - assertFalse(phoneUtil.isValidNumber(nzNumber)); + invalidNumber = new i18n.phonenumbers.PhoneNumber(); + invalidNumber.setCountryCode(64); + invalidNumber.setNationalNumber(3316005); + assertFalse(phoneUtil.isValidNumber(invalidNumber)); } function testGetRegionCodeForCountryCode() { @@ -1022,23 +939,9 @@ function testGetRegionCodeForCountryCode() { } function testGetRegionCodeForNumber() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var bsNumber = new i18n.phonenumbers.PhoneNumber(); - bsNumber.setCountryCode(1); - bsNumber.setNationalNumber(2423027000); - assertEquals('BS', phoneUtil.getRegionCodeForNumber(bsNumber)); - - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6502530000); - assertEquals('US', phoneUtil.getRegionCodeForNumber(usNumber)); - - /** @type {i18n.phonenumbers.PhoneNumber} */ - var gbNumber = new i18n.phonenumbers.PhoneNumber(); - gbNumber.setCountryCode(44); - gbNumber.setNationalNumber(7912345678); - assertEquals('GB', phoneUtil.getRegionCodeForNumber(gbNumber)); + assertEquals('BS', phoneUtil.getRegionCodeForNumber(BS_NUMBER)); + assertEquals('US', phoneUtil.getRegionCodeForNumber(US_NUMBER)); + assertEquals('GB', phoneUtil.getRegionCodeForNumber(GB_MOBILE)); } function testGetCountryCodeForRegion() { @@ -1060,10 +963,11 @@ function testGetNationalDiallingPrefixForRegion() { // Test case with non digit in the national prefix. assertEquals('0~0', phoneUtil.getNddPrefixForRegion('AO', false)); assertEquals('00', phoneUtil.getNddPrefixForRegion('AO', true)); - // Test case with invalid region. - assertEquals(null, phoneUtil.getNddPrefixForRegion('ZZ', false)); + // Test cases with invalid regions. + assertNull(phoneUtil.getNddPrefixForRegion(null, false)); + assertNull(phoneUtil.getNddPrefixForRegion('ZZ', false)); // CS is already deprecated so the library doesn't support it. - assertEquals(null, phoneUtil.getNddPrefixForRegion('CS', false)); + assertNull(phoneUtil.getNddPrefixForRegion('CS', false)); } function testIsNANPACountry() { @@ -1073,21 +977,9 @@ function testIsNANPACountry() { } function testIsPossibleNumber() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var number = new i18n.phonenumbers.PhoneNumber(); - number.setCountryCode(1); - number.setNationalNumber(6502530000); - assertTrue(phoneUtil.isPossibleNumber(number)); - - number = new i18n.phonenumbers.PhoneNumber(); - number.setCountryCode(1); - number.setNationalNumber(2530000); - assertTrue(phoneUtil.isPossibleNumber(number)); - - number = new i18n.phonenumbers.PhoneNumber(); - number.setCountryCode(44); - number.setNationalNumber(2070313000); - assertTrue(phoneUtil.isPossibleNumber(number)); + assertTrue(phoneUtil.isPossibleNumber(US_NUMBER)); + assertTrue(phoneUtil.isPossibleNumber(US_LOCAL_NUMBER)); + assertTrue(phoneUtil.isPossibleNumber(GB_NUMBER)); assertTrue(phoneUtil.isPossibleNumberString('+1 650 253 0000', 'US')); assertTrue(phoneUtil.isPossibleNumberString('+1 650 GOO OGLE', 'US')); @@ -1105,20 +997,17 @@ function testIsPossibleNumberWithReason() { var VR = i18n.phonenumbers.PhoneNumberUtil.ValidationResult; // FYI, national numbers for country code +1 that are within 7 to 10 digits // are possible. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var number = new i18n.phonenumbers.PhoneNumber(); - number.setCountryCode(1); - number.setNationalNumber(6502530000); assertEquals(VR.IS_POSSIBLE, - phoneUtil.isPossibleNumberWithReason(number)); + phoneUtil.isPossibleNumberWithReason(US_NUMBER)); - number = new i18n.phonenumbers.PhoneNumber(); - number.setCountryCode(1); - number.setNationalNumber(2530000); assertEquals(VR.IS_POSSIBLE, - phoneUtil.isPossibleNumberWithReason(number)); + phoneUtil.isPossibleNumberWithReason(US_LOCAL_NUMBER)); - number = new i18n.phonenumbers.PhoneNumber(); + assertEquals(VR.TOO_LONG, + phoneUtil.isPossibleNumberWithReason(US_LONG_NUMBER)); + + /** @type {i18n.phonenumbers.PhoneNumber} */ + var number = new i18n.phonenumbers.PhoneNumber(); number.setCountryCode(0); number.setNationalNumber(2530000); assertEquals(VR.INVALID_COUNTRY_CODE, @@ -1130,12 +1019,6 @@ function testIsPossibleNumberWithReason() { assertEquals(VR.TOO_SHORT, phoneUtil.isPossibleNumberWithReason(number)); - number = new i18n.phonenumbers.PhoneNumber(); - number.setCountryCode(1); - number.setNationalNumber(65025300000); - assertEquals(VR.TOO_LONG, - phoneUtil.isPossibleNumberWithReason(number)); - // Try with number that we don't have metadata for. /** @type {i18n.phonenumbers.PhoneNumber} */ var adNumber = new i18n.phonenumbers.PhoneNumber(); @@ -1154,14 +1037,11 @@ function testIsPossibleNumberWithReason() { } function testIsNotPossibleNumber() { + assertFalse(phoneUtil.isPossibleNumber(US_LONG_NUMBER)); + /** @type {i18n.phonenumbers.PhoneNumber} */ var number = new i18n.phonenumbers.PhoneNumber(); number.setCountryCode(1); - number.setNationalNumber(65025300000); - assertFalse(phoneUtil.isPossibleNumber(number)); - - number = new i18n.phonenumbers.PhoneNumber(); - number.setCountryCode(1); number.setNationalNumber(253000); assertFalse(phoneUtil.isPossibleNumber(number)); @@ -1180,26 +1060,20 @@ function testIsNotPossibleNumber() { function testTruncateTooLongNumber() { // US number 650-253-0000, but entered with one additional digit at the end. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var tooLongNumber = new i18n.phonenumbers.PhoneNumber(); - tooLongNumber.setCountryCode(1); - tooLongNumber.setNationalNumber(65025300001); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var validNumber = new i18n.phonenumbers.PhoneNumber(); - validNumber.setCountryCode(1); - validNumber.setNationalNumber(6502530000); - assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber)); - assertTrue(validNumber.exactlySameAs(tooLongNumber)); + assertTrue(phoneUtil.truncateTooLongNumber(US_LONG_NUMBER)); + assertTrue(US_NUMBER.equals(US_LONG_NUMBER)); // GB number 080 1234 5678, but entered with 4 extra digits at the end. - tooLongNumber = new i18n.phonenumbers.PhoneNumber(); + /** @type {i18n.phonenumbers.PhoneNumber} */ + var tooLongNumber = new i18n.phonenumbers.PhoneNumber(); tooLongNumber.setCountryCode(44); tooLongNumber.setNationalNumber(80123456780123); - validNumber = new i18n.phonenumbers.PhoneNumber(); + /** @type {i18n.phonenumbers.PhoneNumber} */ + var validNumber = new i18n.phonenumbers.PhoneNumber(); validNumber.setCountryCode(44); validNumber.setNationalNumber(8012345678); assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber)); - assertTrue(validNumber.exactlySameAs(tooLongNumber)); + assertTrue(validNumber.equals(tooLongNumber)); // IT number 022 3456 7890, but entered with 3 extra digits at the end. tooLongNumber = new i18n.phonenumbers.PhoneNumber(); @@ -1211,15 +1085,14 @@ function testTruncateTooLongNumber() { validNumber.setNationalNumber(2234567890); validNumber.setItalianLeadingZero(true); assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber)); - assertTrue(validNumber.exactlySameAs(tooLongNumber)); + assertTrue(validNumber.equals(tooLongNumber)); // Tests what happens when a valid number is passed in. /** @type {i18n.phonenumbers.PhoneNumber} */ - var validNumberCopy = new i18n.phonenumbers.PhoneNumber(); - validNumberCopy.mergeFrom(validNumber); + var validNumberCopy = validNumber.clone(); assertTrue(phoneUtil.truncateTooLongNumber(validNumber)); // Tests the number is not modified. - assertTrue(validNumber.exactlySameAs(validNumberCopy)); + assertTrue(validNumber.equals(validNumberCopy)); // Tests what happens when a number with invalid prefix is passed in. /** @type {i18n.phonenumbers.PhoneNumber} */ @@ -1228,11 +1101,10 @@ function testTruncateTooLongNumber() { numberWithInvalidPrefix.setCountryCode(1); numberWithInvalidPrefix.setNationalNumber(2401234567); /** @type {i18n.phonenumbers.PhoneNumber} */ - var invalidNumberCopy = new i18n.phonenumbers.PhoneNumber(); - invalidNumberCopy.mergeFrom(numberWithInvalidPrefix); + var invalidNumberCopy = numberWithInvalidPrefix.clone(); assertFalse(phoneUtil.truncateTooLongNumber(numberWithInvalidPrefix)); // Tests the number is not modified. - assertTrue(numberWithInvalidPrefix.exactlySameAs(invalidNumberCopy)); + assertTrue(numberWithInvalidPrefix.equals(invalidNumberCopy)); // Tests what happens when a too short number is passed in. /** @type {i18n.phonenumbers.PhoneNumber} */ @@ -1240,11 +1112,10 @@ function testTruncateTooLongNumber() { tooShortNumber.setCountryCode(1); tooShortNumber.setNationalNumber(1234); /** @type {i18n.phonenumbers.PhoneNumber} */ - var tooShortNumberCopy = new i18n.phonenumbers.PhoneNumber(); - tooShortNumberCopy.mergeFrom(tooShortNumber); + var tooShortNumberCopy = tooShortNumber.clone(); assertFalse(phoneUtil.truncateTooLongNumber(tooShortNumber)); // Tests the number is not modified. - assertTrue(tooShortNumber.exactlySameAs(tooShortNumberCopy)); + assertTrue(tooShortNumber.equals(tooShortNumberCopy)); } function testIsViablePhoneNumber() { @@ -1294,40 +1165,58 @@ function testExtractPossibleNumber() { } function testMaybeStripNationalPrefix() { - /** @type {string} */ - var nationalPrefix = '34'; + /** @type {i18n.phonenumbers.PhoneMetadata} */ + var metadata = new i18n.phonenumbers.PhoneMetadata(); + metadata.setNationalPrefixForParsing('34'); + /** @type {i18n.phonenumbers.PhoneNumberDesc} */ + var generalDesc = new i18n.phonenumbers.PhoneNumberDesc(); + generalDesc.setNationalNumberPattern('\\d{4,8}'); + metadata.setGeneralDesc(generalDesc); /** @type {!goog.string.StringBuffer} */ var numberToStrip = new goog.string.StringBuffer('34356778'); /** @type {string} */ var strippedNumber = '356778'; - /** @type {RegExp} */ - var nationalRule = /\d{4,7}/; - phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, '', - nationalRule); + phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata); assertEquals('Should have had national prefix stripped.', strippedNumber, numberToStrip.toString()); // Retry stripping - now the number should not start with the national prefix, // so no more stripping should occur. - phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, '', - nationalRule); + phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata); assertEquals('Should have had no change - no national prefix present.', strippedNumber, numberToStrip.toString()); // Some countries have no national prefix. Repeat test with none specified. - nationalPrefix = ''; - phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, '', - nationalRule); + metadata.setNationalPrefixForParsing(''); + phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata); assertEquals('Should not strip anything with empty national prefix.', strippedNumber, numberToStrip.toString()); // If the resultant number doesn't match the national rule, it shouldn't be // stripped. - nationalPrefix = '3'; + metadata.setNationalPrefixForParsing('3'); numberToStrip = new goog.string.StringBuffer('3123'); strippedNumber = '3123'; - phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, '', - nationalRule); + phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata); assertEquals('Should have had no change - after stripping, it would not ' + 'have matched the national rule.', strippedNumber, numberToStrip.toString()); + // Test extracting carrier selection code. + metadata.setNationalPrefixForParsing('0(81)?'); + numberToStrip = new goog.string.StringBuffer('08122123456'); + strippedNumber = '22123456'; + assertEquals('81', + phoneUtil.maybeStripNationalPrefixAndCarrierCode( + numberToStrip, metadata)); + assertEquals('Should have had national prefix and carrier code stripped.', + strippedNumber, numberToStrip.toString()); + // If there was a transform rule, check it was applied. + metadata.setNationalPrefixTransformRule('5$15'); + // Note that a capturing group is present here. + metadata.setNationalPrefixForParsing('0(\\d{2})'); + numberToStrip = new goog.string.StringBuffer('031123'); + /** @type {string} */ + var transformedNumber = '5315123'; + phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata); + assertEquals('Should transform the 031 to a 5315.', + transformedNumber, numberToStrip.toString()); } function testMaybeStripInternationalPrefix() { @@ -1536,37 +1425,29 @@ function testMaybeExtractCountryCode() { } function testParseNationalNumber() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var nzNumber = new i18n.phonenumbers.PhoneNumber(); - nzNumber.setCountryCode(64); - nzNumber.setNationalNumber(33316005); - // National prefix attached. - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('033316005', 'NZ'))); - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('033316005', 'nz'))); - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('33316005', 'NZ'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('033316005', 'NZ'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('033316005', 'nz'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('33316005', 'NZ'))); // National prefix attached and some formatting present. - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('03-331 6005', 'NZ'))); - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('03 331 6005', 'NZ'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('03-331 6005', 'NZ'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('03 331 6005', 'NZ'))); // Testing international prefixes. // Should strip country code. - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('0064 3 331 6005', 'NZ'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('0064 3 331 6005', 'NZ'))); // Try again, but this time we have an international number with Region Code // US. It should recognise the country code and parse accordingly. - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('01164 3 331 6005', 'US'))); - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('+64 3 331 6005', 'US'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('01164 3 331 6005', 'US'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('+64 3 331 6005', 'US'))); - nzNumber = new i18n.phonenumbers.PhoneNumber(); + /** @type {i18n.phonenumbers.PhoneNumber} */ + var nzNumber = new i18n.phonenumbers.PhoneNumber(); nzNumber.setCountryCode(64); nzNumber.setNationalNumber(64123456); - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('64(0)64123456', 'NZ'))); + assertTrue(nzNumber.equals(phoneUtil.parse('64(0)64123456', 'NZ'))); // Check that using a '/' is fine in a phone number. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var deNumber = new i18n.phonenumbers.PhoneNumber(); - deNumber.setCountryCode(49); - deNumber.setNationalNumber(12345678); - assertTrue(deNumber.exactlySameAs(phoneUtil.parse('123/45678', 'DE'))); + assertTrue(DE_NUMBER.equals(phoneUtil.parse('301/23456', 'DE'))); /** @type {i18n.phonenumbers.PhoneNumber} */ var usNumber = new i18n.phonenumbers.PhoneNumber(); @@ -1574,7 +1455,7 @@ function testParseNationalNumber() { // number was already possible. usNumber.setCountryCode(1); usNumber.setNationalNumber(1234567890); - assertTrue(usNumber.exactlySameAs(phoneUtil.parse('123-456-7890', 'US'))); + assertTrue(usNumber.equals(phoneUtil.parse('123-456-7890', 'US'))); } function testParseNumberWithAlphaCharacters() { @@ -1583,131 +1464,112 @@ function testParseNumberWithAlphaCharacters() { var tollfreeNumber = new i18n.phonenumbers.PhoneNumber(); tollfreeNumber.setCountryCode(64); tollfreeNumber.setNationalNumber(800332005); - assertTrue(tollfreeNumber.exactlySameAs( + assertTrue(tollfreeNumber.equals( phoneUtil.parse('0800 DDA 005', 'NZ'))); /** @type {i18n.phonenumbers.PhoneNumber} */ var premiumNumber = new i18n.phonenumbers.PhoneNumber(); premiumNumber.setCountryCode(64); premiumNumber.setNationalNumber(9003326005); - assertTrue(premiumNumber.exactlySameAs( + assertTrue(premiumNumber.equals( phoneUtil.parse('0900 DDA 6005', 'NZ'))); // Not enough alpha characters for them to be considered intentional, so they // are stripped. - assertTrue(premiumNumber.exactlySameAs( + assertTrue(premiumNumber.equals( phoneUtil.parse('0900 332 6005a', 'NZ'))); - assertTrue(premiumNumber.exactlySameAs( + assertTrue(premiumNumber.equals( phoneUtil.parse('0900 332 600a5', 'NZ'))); - assertTrue(premiumNumber.exactlySameAs( + assertTrue(premiumNumber.equals( phoneUtil.parse('0900 332 600A5', 'NZ'))); - assertTrue(premiumNumber.exactlySameAs( + assertTrue(premiumNumber.equals( phoneUtil.parse('0900 a332 600A5', 'NZ'))); } function testParseWithInternationalPrefixes() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6503336000); - assertTrue(usNumber.exactlySameAs( - phoneUtil.parse('+1 (650) 333-6000', 'NZ'))); - assertTrue(usNumber.exactlySameAs( - phoneUtil.parse('1-650-333-6000', 'US'))); + assertTrue(US_NUMBER.equals( + phoneUtil.parse('+1 (650) 253-0000', 'NZ'))); + assertTrue(US_NUMBER.equals( + phoneUtil.parse('1-650-253-0000', 'US'))); // Calling the US number from Singapore by using different service providers // 1st test: calling using SingTel IDD service (IDD is 001) - assertTrue(usNumber.exactlySameAs( - phoneUtil.parse('0011-650-333-6000', 'SG'))); + assertTrue(US_NUMBER.equals( + phoneUtil.parse('0011-650-253-0000', 'SG'))); // 2nd test: calling using StarHub IDD service (IDD is 008) - assertTrue(usNumber.exactlySameAs( - phoneUtil.parse('0081-650-333-6000', 'SG'))); + assertTrue(US_NUMBER.equals( + phoneUtil.parse('0081-650-253-0000', 'SG'))); // 3rd test: calling using SingTel V019 service (IDD is 019) - assertTrue(usNumber.exactlySameAs( - phoneUtil.parse('0191-650-333-6000', 'SG'))); + assertTrue(US_NUMBER.equals( + phoneUtil.parse('0191-650-253-0000', 'SG'))); // Calling the US number from Poland - assertTrue(usNumber.exactlySameAs( - phoneUtil.parse('0~01-650-333-6000', 'PL'))); + assertTrue(US_NUMBER.equals( + phoneUtil.parse('0~01-650-253-0000', 'PL'))); // Using '++' at the start. - assertTrue(usNumber.exactlySameAs( - phoneUtil.parse('++1 (650) 333-6000', 'PL'))); + assertTrue(US_NUMBER.equals( + phoneUtil.parse('++1 (650) 253-0000', 'PL'))); // Using a full-width plus sign. - assertTrue(usNumber.exactlySameAs( - phoneUtil.parse('\uFF0B1 (650) 333-6000', 'SG'))); + assertTrue(US_NUMBER.equals( + phoneUtil.parse('\uFF0B1 (650) 253-0000', 'SG'))); // The whole number, including punctuation, is here represented in full-width // form. - assertTrue(usNumber.exactlySameAs( + assertTrue(US_NUMBER.equals( phoneUtil.parse('\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09' + - '\u3000\uFF13\uFF13\uFF13\uFF0D\uFF16\uFF10\uFF10\uFF10', + '\u3000\uFF12\uFF15\uFF13\uFF0D\uFF10\uFF10\uFF10\uFF10', 'SG'))); // Using U+30FC dash instead. - assertTrue(usNumber.exactlySameAs( + assertTrue(US_NUMBER.equals( phoneUtil.parse('\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09' + - '\u3000\uFF13\uFF13\uFF13\u30FC\uFF16\uFF10\uFF10\uFF10', + '\u3000\uFF12\uFF15\uFF13\u30FC\uFF10\uFF10\uFF10\uFF10', 'SG'))); } function testParseWithLeadingZero() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(236618300); - itNumber.setItalianLeadingZero(true); - assertTrue(itNumber.exactlySameAs(phoneUtil.parse('+39 02-36618 300', 'NZ'))); - assertTrue(itNumber.exactlySameAs(phoneUtil.parse('02-36618 300', 'IT'))); + assertTrue(IT_NUMBER.equals(phoneUtil.parse('+39 02-36618 300', 'NZ'))); + assertTrue(IT_NUMBER.equals(phoneUtil.parse('02-36618 300', 'IT'))); - itNumber = new i18n.phonenumbers.PhoneNumber(); - itNumber.setCountryCode(39); - itNumber.setNationalNumber(312345678); - assertTrue(itNumber.exactlySameAs(phoneUtil.parse('312 345 678', 'IT'))); + assertTrue(IT_MOBILE.equals(phoneUtil.parse('345 678 901', 'IT'))); } function testParseNationalNumberArgentina() { // Test parsing mobile numbers of Argentina. /** @type {i18n.phonenumbers.PhoneNumber} */ var arNumber = new i18n.phonenumbers.PhoneNumber(); - arNumber.setCountryCode(54); arNumber.setNationalNumber(93435551212); - assertTrue(arNumber.exactlySameAs( + assertTrue(arNumber.equals( phoneUtil.parse('+54 9 343 555 1212', 'AR'))); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('0343 15 555 1212', 'AR'))); + assertTrue(arNumber.equals(phoneUtil.parse('0343 15 555 1212', 'AR'))); arNumber = new i18n.phonenumbers.PhoneNumber(); arNumber.setCountryCode(54); arNumber.setNationalNumber(93715654320); - assertTrue(arNumber.exactlySameAs( + assertTrue(arNumber.equals( phoneUtil.parse('+54 9 3715 65 4320', 'AR'))); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('03715 15 65 4320', 'AR'))); + assertTrue(arNumber.equals(phoneUtil.parse('03715 15 65 4320', 'AR'))); + assertTrue(AR_MOBILE.equals(phoneUtil.parse('911 876 54321', 'AR'))); // Test parsing fixed-line numbers of Argentina. - arNumber = new i18n.phonenumbers.PhoneNumber(); - arNumber.setCountryCode(54); - arNumber.setNationalNumber(1137970000); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('+54 11 3797 0000', 'AR'))); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('011 3797 0000', 'AR'))); + assertTrue(AR_NUMBER.equals(phoneUtil.parse('+54 11 8765 4321', 'AR'))); + assertTrue(AR_NUMBER.equals(phoneUtil.parse('011 8765 4321', 'AR'))); arNumber = new i18n.phonenumbers.PhoneNumber(); arNumber.setCountryCode(54); arNumber.setNationalNumber(3715654321); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('+54 3715 65 4321', 'AR'))); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('03715 65 4321', 'AR'))); + assertTrue(arNumber.equals(phoneUtil.parse('+54 3715 65 4321', 'AR'))); + assertTrue(arNumber.equals(phoneUtil.parse('03715 65 4321', 'AR'))); arNumber = new i18n.phonenumbers.PhoneNumber(); arNumber.setCountryCode(54); arNumber.setNationalNumber(2312340000); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('+54 23 1234 0000', 'AR'))); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('023 1234 0000', 'AR'))); + assertTrue(arNumber.equals(phoneUtil.parse('+54 23 1234 0000', 'AR'))); + assertTrue(arNumber.equals(phoneUtil.parse('023 1234 0000', 'AR'))); } function testParseWithXInNumber() { // Test that having an 'x' in the phone number at the start is ok and that it // just gets removed. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var arNumber = new i18n.phonenumbers.PhoneNumber(); - arNumber.setCountryCode(54); - arNumber.setNationalNumber(123456789); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('0123456789', 'AR'))); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('(0) 123456789', 'AR'))); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('0 123456789', 'AR'))); - assertTrue(arNumber.exactlySameAs(phoneUtil.parse('(0xx) 123456789', 'AR'))); + assertTrue(AR_NUMBER.equals(phoneUtil.parse('01187654321', 'AR'))); + assertTrue(AR_NUMBER.equals(phoneUtil.parse('(0) 1187654321', 'AR'))); + assertTrue(AR_NUMBER.equals(phoneUtil.parse('0 1187654321', 'AR'))); + assertTrue(AR_NUMBER.equals(phoneUtil.parse('(0xx) 1187654321', 'AR'))); /** @type {i18n.phonenumbers.PhoneNumber} */ var arFromUs = new i18n.phonenumbers.PhoneNumber(); arFromUs.setCountryCode(54); @@ -1717,7 +1579,7 @@ function testParseWithXInNumber() { // extension, as we allow extensions up to 7 digits. This assumption is okay // for now as all the countries where a carrier selection code is written in // the form of xx have a national significant number of length larger than 7. - assertTrue(arFromUs.exactlySameAs(phoneUtil.parse('011xx5481429712', 'US'))); + assertTrue(arFromUs.equals(phoneUtil.parse('011xx5481429712', 'US'))); } function testParseNumbersMexico() { @@ -1726,20 +1588,20 @@ function testParseNumbersMexico() { var mxNumber = new i18n.phonenumbers.PhoneNumber(); mxNumber.setCountryCode(52); mxNumber.setNationalNumber(4499780001); - assertTrue(mxNumber.exactlySameAs( + assertTrue(mxNumber.equals( phoneUtil.parse('+52 (449)978-0001', 'MX'))); - assertTrue(mxNumber.exactlySameAs(phoneUtil.parse('01 (449)978-0001', 'MX'))); - assertTrue(mxNumber.exactlySameAs(phoneUtil.parse('(449)978-0001', 'MX'))); + assertTrue(mxNumber.equals(phoneUtil.parse('01 (449)978-0001', 'MX'))); + assertTrue(mxNumber.equals(phoneUtil.parse('(449)978-0001', 'MX'))); // Test parsing mobile numbers of Mexico. mxNumber = new i18n.phonenumbers.PhoneNumber(); mxNumber.setCountryCode(52); mxNumber.setNationalNumber(13312345678); - assertTrue(mxNumber.exactlySameAs( + assertTrue(mxNumber.equals( phoneUtil.parse('+52 1 33 1234-5678', 'MX'))); - assertTrue(mxNumber.exactlySameAs( + assertTrue(mxNumber.equals( phoneUtil.parse('044 (33) 1234-5678', 'MX'))); - assertTrue(mxNumber.exactlySameAs( + assertTrue(mxNumber.equals( phoneUtil.parse('045 33 1234-5678', 'MX'))); } @@ -1910,27 +1772,29 @@ function testFailedParseOnInvalidNumbers() { } function testParseNumbersWithPlusWithNoRegion() { - /** @type {i18n.phonenumbers.PhoneNumber} */ - var nzNumber = new i18n.phonenumbers.PhoneNumber(); - nzNumber.setCountryCode(64); - nzNumber.setNationalNumber(33316005); // 'ZZ' is allowed only if the number starts with a '+' - then the country // code can be calculated. - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('+64 3 331 6005', 'ZZ'))); + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('+64 3 331 6005', 'ZZ'))); // Test with full-width plus. - assertTrue(nzNumber.exactlySameAs( + assertTrue(NZ_NUMBER.equals( phoneUtil.parse('\uFF0B64 3 331 6005', 'ZZ'))); // Test with normal plus but leading characters that need to be stripped. - assertTrue(nzNumber.exactlySameAs( + assertTrue(NZ_NUMBER.equals( phoneUtil.parse('Tel: +64 3 331 6005', 'ZZ'))); - assertTrue(nzNumber.exactlySameAs(phoneUtil.parse('+64 3 331 6005', null))); - nzNumber.setRawInput('+64 3 331 6005'); - nzNumber.setCountryCodeSource(i18n.phonenumbers.PhoneNumber + assertTrue(NZ_NUMBER.equals(phoneUtil.parse('+64 3 331 6005', null))); + + // It is important that we set the carrier code to an empty string, since we + // used ParseAndKeepRawInput and no carrier code was found. + /** @type {i18n.phonenumbers.PhoneNumber} */ + var nzNumberWithRawInput = NZ_NUMBER.clone(); + nzNumberWithRawInput.setRawInput('+64 3 331 6005'); + nzNumberWithRawInput.setCountryCodeSource(i18n.phonenumbers.PhoneNumber .CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN); - assertTrue(nzNumber.exactlySameAs( + nzNumberWithRawInput.setPreferredDomesticCarrierCode(''); + assertTrue(nzNumberWithRawInput.equals( phoneUtil.parseAndKeepRawInput('+64 3 331 6005', 'ZZ'))); // Null is also allowed for the region code in these cases. - assertTrue(nzNumber.exactlySameAs( + assertTrue(nzNumberWithRawInput.equals( phoneUtil.parseAndKeepRawInput('+64 3 331 6005', null))); } @@ -1940,36 +1804,30 @@ function testParseExtensions() { nzNumber.setCountryCode(64); nzNumber.setNationalNumber(33316005); nzNumber.setExtension('3456'); - assertTrue(nzNumber.exactlySameAs( + assertTrue(nzNumber.equals( phoneUtil.parse('03 331 6005 ext 3456', 'NZ'))); - assertTrue(nzNumber.exactlySameAs( + assertTrue(nzNumber.equals( phoneUtil.parse('03-3316005x3456', 'NZ'))); - assertTrue(nzNumber.exactlySameAs( + assertTrue(nzNumber.equals( phoneUtil.parse('03-3316005 int.3456', 'NZ'))); - assertTrue(nzNumber.exactlySameAs( + assertTrue(nzNumber.equals( phoneUtil.parse('03 3316005 #3456', 'NZ'))); // Test the following do not extract extensions: - /** @type {i18n.phonenumbers.PhoneNumber} */ - var nonExtnNumber = new i18n.phonenumbers.PhoneNumber(); - nonExtnNumber.setCountryCode(1); - nonExtnNumber.setNationalNumber(80074935247); - assertTrue(nonExtnNumber.exactlySameAs( + assertTrue(ALPHA_NUMERIC_NUMBER.equals( phoneUtil.parse('1800 six-flags', 'US'))); - assertTrue(nonExtnNumber.exactlySameAs( + assertTrue(ALPHA_NUMERIC_NUMBER.equals( phoneUtil.parse('1800 SIX FLAGS', 'US'))); - assertTrue(nonExtnNumber.exactlySameAs( + assertTrue(ALPHA_NUMERIC_NUMBER.equals( phoneUtil.parse('0~0 1800 7493 5247', 'PL'))); - assertTrue(nonExtnNumber.exactlySameAs( + assertTrue(ALPHA_NUMERIC_NUMBER.equals( phoneUtil.parse('(1800) 7493.5247', 'US'))); // Check that the last instance of an extension token is matched. /** @type {i18n.phonenumbers.PhoneNumber} */ - var extnNumber = new i18n.phonenumbers.PhoneNumber(); - extnNumber.setCountryCode(1); - extnNumber.setNationalNumber(80074935247); + var extnNumber = ALPHA_NUMERIC_NUMBER.clone(); extnNumber.setExtension('1234'); - assertTrue(extnNumber.exactlySameAs( + assertTrue(extnNumber.equals( phoneUtil.parse('0~0 1800 7493 5247 ~1234', 'PL'))); // Verifying bug-fix where the last digit of a number was previously omitted @@ -1980,21 +1838,21 @@ function testParseExtensions() { ukNumber.setCountryCode(44); ukNumber.setNationalNumber(2034567890); ukNumber.setExtension('456'); - assertTrue(ukNumber.exactlySameAs( + assertTrue(ukNumber.equals( phoneUtil.parse('+44 2034567890x456', 'NZ'))); - assertTrue(ukNumber.exactlySameAs( + assertTrue(ukNumber.equals( phoneUtil.parse('+44 2034567890x456', 'GB'))); - assertTrue(ukNumber.exactlySameAs( + assertTrue(ukNumber.equals( phoneUtil.parse('+44 2034567890 x456', 'GB'))); - assertTrue(ukNumber.exactlySameAs( + assertTrue(ukNumber.equals( phoneUtil.parse('+44 2034567890 X456', 'GB'))); - assertTrue(ukNumber.exactlySameAs( + assertTrue(ukNumber.equals( phoneUtil.parse('+44 2034567890 X 456', 'GB'))); - assertTrue(ukNumber.exactlySameAs( + assertTrue(ukNumber.equals( phoneUtil.parse('+44 2034567890 X 456', 'GB'))); - assertTrue(ukNumber.exactlySameAs( + assertTrue(ukNumber.equals( phoneUtil.parse('+44 2034567890 x 456 ', 'GB'))); - assertTrue(ukNumber.exactlySameAs( + assertTrue(ukNumber.equals( phoneUtil.parse('+44 2034567890 X 456', 'GB'))); /** @type {i18n.phonenumbers.PhoneNumber} */ @@ -2002,21 +1860,21 @@ function testParseExtensions() { usWithExtension.setCountryCode(1); usWithExtension.setNationalNumber(8009013355); usWithExtension.setExtension('7246433'); - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('(800) 901-3355 x 7246433', 'US'))); - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('(800) 901-3355 , ext 7246433', 'US'))); - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('(800) 901-3355 ,extension 7246433', 'US'))); - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('(800) 901-3355 ,extensi\u00F3n 7246433', 'US'))); // Repeat with the small letter o with acute accent created by combining // characters. - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('(800) 901-3355 ,extensio\u0301n 7246433', 'US'))); - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('(800) 901-3355 , 7246433', 'US'))); - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('(800) 901-3355 ext: 7246433', 'US'))); // Test that if a number has two extensions specified, we ignore the second. @@ -2025,11 +1883,11 @@ function testParseExtensions() { usWithTwoExtensionsNumber.setCountryCode(1); usWithTwoExtensionsNumber.setNationalNumber(2121231234); usWithTwoExtensionsNumber.setExtension('508'); - assertTrue(usWithTwoExtensionsNumber.exactlySameAs( + assertTrue(usWithTwoExtensionsNumber.equals( phoneUtil.parse('(212)123-1234 x508/x1234', 'US'))); - assertTrue(usWithTwoExtensionsNumber.exactlySameAs( + assertTrue(usWithTwoExtensionsNumber.equals( phoneUtil.parse('(212)123-1234 x508/ x1234', 'US'))); - assertTrue(usWithTwoExtensionsNumber.exactlySameAs( + assertTrue(usWithTwoExtensionsNumber.equals( phoneUtil.parse('(212)123-1234 x508\\x1234', 'US'))); // Test parsing numbers in the form (645) 123-1234-910# works, where the last @@ -2038,43 +1896,43 @@ function testParseExtensions() { usWithExtension.setCountryCode(1); usWithExtension.setNationalNumber(6451231234); usWithExtension.setExtension('910'); - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('+1 (645) 123 1234-910#', 'US'))); // Retry with the same number in a slightly different format. - assertTrue(usWithExtension.exactlySameAs( + assertTrue(usWithExtension.equals( phoneUtil.parse('+1 (645) 123 1234 ext. 910#', 'US'))); } function testParseAndKeepRaw() { var CCS = i18n.phonenumbers.PhoneNumber.CountryCodeSource; /** @type {i18n.phonenumbers.PhoneNumber} */ - var alphaNumericNumber = new i18n.phonenumbers.PhoneNumber(); - alphaNumericNumber.setCountryCode(1); - alphaNumericNumber.setNationalNumber(80074935247); + var alphaNumericNumber = ALPHA_NUMERIC_NUMBER.clone(); alphaNumericNumber.setRawInput('800 six-flags'); alphaNumericNumber.setCountryCodeSource(CCS.FROM_DEFAULT_COUNTRY); - assertTrue(alphaNumericNumber.exactlySameAs( + alphaNumericNumber.setPreferredDomesticCarrierCode(''); + assertTrue(alphaNumericNumber.equals( phoneUtil.parseAndKeepRawInput('800 six-flags', 'US'))); - alphaNumericNumber.setCountryCode(1); - alphaNumericNumber.setNationalNumber(8007493524); - alphaNumericNumber.setRawInput('1800 six-flag'); - alphaNumericNumber.setCountryCodeSource(CCS.FROM_NUMBER_WITHOUT_PLUS_SIGN); - assertTrue(alphaNumericNumber.exactlySameAs( + /** @type {i18n.phonenumbers.PhoneNumber} */ + var shorterAlphaNumber = new i18n.phonenumbers.PhoneNumber(); + shorterAlphaNumber.setCountryCode(1); + shorterAlphaNumber.setNationalNumber(8007493524); + shorterAlphaNumber.setRawInput('1800 six-flag'); + shorterAlphaNumber.setCountryCodeSource(CCS.FROM_NUMBER_WITHOUT_PLUS_SIGN); + shorterAlphaNumber.setPreferredDomesticCarrierCode(''); + assertTrue(shorterAlphaNumber.equals( phoneUtil.parseAndKeepRawInput('1800 six-flag', 'US'))); - alphaNumericNumber.setCountryCode(1); - alphaNumericNumber.setNationalNumber(8007493524); - alphaNumericNumber.setRawInput('+1800 six-flag'); - alphaNumericNumber.setCountryCodeSource(CCS.FROM_NUMBER_WITH_PLUS_SIGN); - assertTrue(alphaNumericNumber.exactlySameAs( + shorterAlphaNumber.setRawInput('+1800 six-flag'); + shorterAlphaNumber.setCountryCodeSource(CCS.FROM_NUMBER_WITH_PLUS_SIGN); + assertTrue(shorterAlphaNumber.equals( phoneUtil.parseAndKeepRawInput('+1800 six-flag', 'NZ'))); alphaNumericNumber.setCountryCode(1); alphaNumericNumber.setNationalNumber(8007493524); alphaNumericNumber.setRawInput('001800 six-flag'); alphaNumericNumber.setCountryCodeSource(CCS.FROM_NUMBER_WITH_IDD); - assertTrue(alphaNumericNumber.exactlySameAs( + assertTrue(alphaNumericNumber.equals( phoneUtil.parseAndKeepRawInput('001800 six-flag', 'NZ'))); // Invalid region code supplied. @@ -2087,6 +1945,16 @@ function testParseAndKeepRaw() { i18n.phonenumbers.Error.INVALID_COUNTRY_CODE, e); } + + /** @type {i18n.phonenumbers.PhoneNumber} */ + var koreanNumber = new i18n.phonenumbers.PhoneNumber(); + koreanNumber.setCountryCode(82); + koreanNumber.setNationalNumber(22123456); + koreanNumber.setRawInput('08122123456'); + koreanNumber.setCountryCodeSource(CCS.FROM_DEFAULT_COUNTRY); + koreanNumber.setPreferredDomesticCarrierCode('81'); + assertTrue(koreanNumber.equals( + phoneUtil.parseAndKeepRawInput('08122123456', 'KR'))); } function testCountryWithNoNumberDesc() { @@ -2105,12 +1973,8 @@ function testCountryWithNoNumberDesc() { assertTrue(phoneUtil.isValidNumber(adNumber)); // Test dialing a US number from within Andorra. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(6502530000); assertEquals('00 1 650 253 0000', - phoneUtil.formatOutOfCountryCallingNumber(usNumber, 'AD')); + phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, 'AD')); } function testUnknownCountryCallingCodeForValidation() { @@ -2148,28 +2012,42 @@ function testIsNumberMatchMatches() { phoneUtil.isNumberMatch('+64 3 331-6005 extn 1234', '+6433316005#1234')); // Test proto buffers. + assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.EXACT_MATCH, + phoneUtil.isNumberMatch(NZ_NUMBER, '+6403 331 6005')); + /** @type {i18n.phonenumbers.PhoneNumber} */ - var nzNumber = new i18n.phonenumbers.PhoneNumber(); - nzNumber.setCountryCode(64); - nzNumber.setNationalNumber(33316005); + var nzNumber = NZ_NUMBER.clone(); nzNumber.setExtension('3456'); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.EXACT_MATCH, phoneUtil.isNumberMatch(nzNumber, '+643 331 6005 ext 3456')); - nzNumber.clearExtension(); - assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.EXACT_MATCH, - phoneUtil.isNumberMatch(nzNumber, '+6403 331 6005')); // Check empty extensions are ignored. nzNumber.setExtension(''); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.EXACT_MATCH, phoneUtil.isNumberMatch(nzNumber, '+6403 331 6005')); // Check variant with two proto buffers. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var nzNumberTwo = new i18n.phonenumbers.PhoneNumber(); - nzNumberTwo.setCountryCode(64); - nzNumberTwo.setNationalNumber(33316005); - assertEquals('Number nzNumber did not match nzNumberTwo', + assertEquals('Numbers did not match', i18n.phonenumbers.PhoneNumberUtil.MatchType.EXACT_MATCH, - phoneUtil.isNumberMatch(nzNumber, nzNumberTwo)); + phoneUtil.isNumberMatch(nzNumber, NZ_NUMBER)); + + var CCS = i18n.phonenumbers.PhoneNumber.CountryCodeSource; + // Check raw_input, country_code_source and preferred_domestic_carrier_code + // are ignored. + /** @type {i18n.phonenumbers.PhoneNumber} */ + var brNumberOne = new i18n.phonenumbers.PhoneNumber(); + /** @type {i18n.phonenumbers.PhoneNumber} */ + var brNumberTwo = new i18n.phonenumbers.PhoneNumber(); + brNumberOne.setCountryCode(55); + brNumberOne.setNationalNumber(3121286979); + brNumberOne.setCountryCodeSource(CCS.FROM_NUMBER_WITH_PLUS_SIGN); + brNumberOne.setPreferredDomesticCarrierCode('12'); + brNumberOne.setRawInput('012 3121286979'); + brNumberTwo.setCountryCode(55); + brNumberTwo.setNationalNumber(3121286979); + brNumberTwo.setCountryCodeSource(CCS.FROM_DEFAULT_COUNTRY); + brNumberTwo.setPreferredDomesticCarrierCode('14'); + brNumberTwo.setRawInput('143121286979'); + assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.EXACT_MATCH, + phoneUtil.isNumberMatch(brNumberOne, brNumberTwo)); } function testIsNumberMatchNonMatches() { @@ -2208,52 +2086,38 @@ function testIsNumberMatchNsnMatches() { phoneUtil.isNumberMatch('+64 3 331-6005', '03 331 6005')); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, phoneUtil.isNumberMatch('3 331-6005', '03 331 6005')); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var nzNumber = new i18n.phonenumbers.PhoneNumber(); - nzNumber.setCountryCode(64); - nzNumber.setNationalNumber(33316005); - nzNumber.setExtension(''); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, - phoneUtil.isNumberMatch(nzNumber, '03 331 6005')); + phoneUtil.isNumberMatch(NZ_NUMBER, '03 331 6005')); // Here the second number possibly starts with the country code for // New Zealand, although we are unsure. - assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, - phoneUtil.isNumberMatch(nzNumber, '(64-3) 331 6005')); /** @type {i18n.phonenumbers.PhoneNumber} */ - var unchangedNzNumber = new i18n.phonenumbers.PhoneNumber(); - unchangedNzNumber.setCountryCode(64); - unchangedNzNumber.setNationalNumber(33316005); - unchangedNzNumber.setExtension(''); + var unchangedNzNumber = NZ_NUMBER.clone(); + assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, + phoneUtil.isNumberMatch(unchangedNzNumber, '(64-3) 331 6005')); // Check the phone number proto was not edited during the method call. - assertTrue(unchangedNzNumber.exactlySameAs(nzNumber)); + assertTrue(NZ_NUMBER.equals(unchangedNzNumber)); // Here, the 1 might be a national prefix, if we compare it to the US number, // so the resultant match is an NSN match. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(2345678901); - usNumber.setExtension(''); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, - phoneUtil.isNumberMatch(usNumber, '1-234-567-8901')); + phoneUtil.isNumberMatch(US_NUMBER, '1-650-253-0000')); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, - phoneUtil.isNumberMatch(usNumber, '2345678901')); + phoneUtil.isNumberMatch(US_NUMBER, '6502530000')); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, - phoneUtil.isNumberMatch('+1 234-567 8901', '1 234 567 8901')); + phoneUtil.isNumberMatch('+1 650-253 0000', '1 650 253 0000')); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, - phoneUtil.isNumberMatch('1 234-567 8901', '1 234 567 8901')); + phoneUtil.isNumberMatch('1 650-253 0000', '1 650 253 0000')); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.NSN_MATCH, - phoneUtil.isNumberMatch('1 234-567 8901', '+1 234 567 8901')); + phoneUtil.isNumberMatch('1 650-253 0000', '+1 650 253 0000')); // For this case, the match will be a short NSN match, because we cannot // assume that the 1 might be a national prefix, so don't remove it when // parsing. /** @type {i18n.phonenumbers.PhoneNumber} */ var randomNumber = new i18n.phonenumbers.PhoneNumber(); randomNumber.setCountryCode(41); - randomNumber.setNationalNumber(2345678901); - randomNumber.setExtension(''); + randomNumber.setNationalNumber(6502530000); assertEquals(i18n.phonenumbers.PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, - phoneUtil.isNumberMatch(randomNumber, '1-234-567-8901')); + phoneUtil.isNumberMatch(randomNumber, '1-650-253-0000')); } function testIsNumberMatchShortNsnMatches() { @@ -2297,30 +2161,16 @@ function testIsNumberMatchShortNsnMatches() { } function testCanBeInternationallyDialled() { - // We have no-international-dialling rules for the US in our test metadata. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usNumber = new i18n.phonenumbers.PhoneNumber(); - usNumber.setCountryCode(1); - usNumber.setNationalNumber(8001231234); - assertFalse(phoneUtil.canBeInternationallyDialled(usNumber)); + // We have no-international-dialling rules for the US in our test metadata + // that say that toll-free numbers cannot be dialled internationally. + assertFalse(phoneUtil.canBeInternationallyDialled(US_TOLLFREE)); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usInternationalNumber = new i18n.phonenumbers.PhoneNumber(); - usInternationalNumber.setCountryCode(1); - usInternationalNumber.setNationalNumber(2311231234); - assertTrue(phoneUtil.canBeInternationallyDialled(usInternationalNumber)); + // Normal US numbers can be internationally dialled. + assertTrue(phoneUtil.canBeInternationallyDialled(US_NUMBER)); - /** @type {i18n.phonenumbers.PhoneNumber} */ - var usInvalidNumber = new i18n.phonenumbers.PhoneNumber(); // Invalid number. - usInvalidNumber.setCountryCode(1); - usInvalidNumber.setNationalNumber(13112312); - assertTrue(phoneUtil.canBeInternationallyDialled(usInvalidNumber)); + assertTrue(phoneUtil.canBeInternationallyDialled(US_LOCAL_NUMBER)); // We have no data for NZ - should return true. - /** @type {i18n.phonenumbers.PhoneNumber} */ - var nzNumber = new i18n.phonenumbers.PhoneNumber(); - nzNumber.setCountryCode(64); - nzNumber.setNationalNumber(33316005); - assertTrue(phoneUtil.canBeInternationallyDialled(nzNumber)); + assertTrue(phoneUtil.canBeInternationallyDialled(NZ_NUMBER)); } -- 2.7.4