| /* |
| * Copyright (C) 2009 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.google.i18n.phonenumbers; |
| |
| import com.google.i18n.phonenumbers.Phonemetadata.NumberFormat; |
| import com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata; |
| import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; |
| import com.google.protobuf.MessageLite; |
| import junit.framework.TestCase; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Set; |
| import java.util.regex.Pattern; |
| |
| /** |
| * Unit tests for PhoneNumberUtil.java |
| * |
| * Note that these tests use the metadata contained in the file specified by TEST_META_DATA_FILE, |
| * not the normal metadata file, so should not be used for regression test purposes - these tests |
| * are illustrative only and test functionality. |
| * |
| * @author Shaopeng Jia |
| * @author Lara Rennie |
| */ |
| public class PhoneNumberUtilTest extends TestCase { |
| private PhoneNumberUtil phoneUtil; |
| private static final String TEST_META_DATA_FILE = |
| "/com/google/i18n/phonenumbers/test/generated_files/PhoneNumberMetadataProtoForTesting"; |
| |
| public PhoneNumberUtilTest() { |
| PhoneNumberUtil.resetInstance(); |
| InputStream in = PhoneNumberUtilTest.class.getResourceAsStream(TEST_META_DATA_FILE); |
| phoneUtil = PhoneNumberUtil.getInstance(in); |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| } |
| |
| private Boolean assertEquals(MessageLite message1, MessageLite message2) { |
| return PhoneNumberUtil.areSameMessages(message1, message2); |
| } |
| |
| public void testGetInstanceLoadUSMetadata() throws IOException { |
| PhoneMetadata metadata = phoneUtil.getPhoneMetadata("US"); |
| assertEquals("US", metadata.getId()); |
| assertEquals(1, metadata.getCountryCode()); |
| assertEquals("011", metadata.getInternationalPrefix()); |
| assertFalse(metadata.hasNationalPrefix()); |
| assertEquals(2, metadata.getNumberFormatCount()); |
| assertEquals("(\\d{3})(\\d{3})(\\d{4})", |
| metadata.getNumberFormat(0).getPattern()); |
| assertEquals("$1 $2 $3", metadata.getNumberFormat(0).getFormat()); |
| assertEquals("[13-9]\\d{9}|2[0-35-9]\\d{8}", |
| metadata.getGeneralDesc().getNationalNumberPattern()); |
| assertEquals("\\d{7,10}", metadata.getGeneralDesc().getPossibleNumberPattern()); |
| assertEquals(metadata.getGeneralDesc(), metadata.getFixedLine()); |
| assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern()); |
| assertEquals("900\\d{7}", metadata.getPremiumRate().getNationalNumberPattern()); |
| // No shared-cost data is available, so it should be initialised to "NA". |
| assertEquals("NA", metadata.getSharedCost().getNationalNumberPattern()); |
| assertEquals("NA", metadata.getSharedCost().getPossibleNumberPattern()); |
| } |
| |
| public void testGetInstanceLoadDEMetadata() { |
| PhoneMetadata metadata = phoneUtil.getPhoneMetadata("DE"); |
| assertEquals("DE", metadata.getId()); |
| assertEquals(49, metadata.getCountryCode()); |
| assertEquals("00", metadata.getInternationalPrefix()); |
| assertEquals("0", metadata.getNationalPrefix()); |
| assertEquals(6, metadata.getNumberFormatCount()); |
| assertEquals("9009", metadata.getNumberFormat(5).getLeadingDigits()); |
| assertEquals("(\\d{3})(\\d{4})(\\d{4})", |
| 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()); |
| assertEquals("30123456", metadata.getFixedLine().getExampleNumber()); |
| assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern()); |
| assertEquals("900([135]\\d{6}|9\\d{7})", metadata.getPremiumRate().getNationalNumberPattern()); |
| } |
| |
| public void testGetInstanceLoadARMetadata() { |
| PhoneMetadata metadata = phoneUtil.getPhoneMetadata("AR"); |
| assertEquals("AR", metadata.getId()); |
| assertEquals(54, metadata.getCountryCode()); |
| assertEquals("00", metadata.getInternationalPrefix()); |
| assertEquals("0", metadata.getNationalPrefix()); |
| assertEquals("0(?:(11|343|3715)15)?", metadata.getNationalPrefixForParsing()); |
| assertEquals("9$1", metadata.getNationalPrefixTransformRule()); |
| assertEquals("9(\\d{4})(\\d{2})(\\d{4})", |
| metadata.getNumberFormat(3).getPattern()); |
| assertEquals("$1 15 $2-$3", metadata.getNumberFormat(3).getFormat()); |
| assertEquals("(9)(\\d{4})(\\d{2})(\\d{4})", |
| metadata.getIntlNumberFormat(3).getPattern()); |
| assertEquals("$1 $2 $3 $4", metadata.getIntlNumberFormat(3).getFormat()); |
| } |
| |
| public void testGetExampleNumber() throws IOException { |
| PhoneNumber deNumber = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(30123456).build(); |
| assertEquals(deNumber, phoneUtil.getExampleNumber("DE")); |
| |
| assertEquals(deNumber, |
| phoneUtil.getExampleNumberForType("DE", |
| PhoneNumberUtil.PhoneNumberType.FIXED_LINE)); |
| assertEquals(null, |
| phoneUtil.getExampleNumberForType("DE", |
| PhoneNumberUtil.PhoneNumberType.MOBILE)); |
| // For the US, the example number is placed under general description, and hence should be used |
| // for both fixed line and mobile, so neither of these should return null. |
| assertNotNull(phoneUtil.getExampleNumberForType("US", |
| PhoneNumberUtil.PhoneNumberType.FIXED_LINE)); |
| assertNotNull(phoneUtil.getExampleNumberForType("US", |
| PhoneNumberUtil.PhoneNumberType.MOBILE)); |
| } |
| |
| public void testNormaliseRemovePunctuation() { |
| String inputNumber = "034-56&+#234"; |
| String expectedOutput = "03456234"; |
| assertEquals("Conversion did not correctly remove punctuation", |
| expectedOutput, |
| PhoneNumberUtil.normalize(inputNumber)); |
| } |
| |
| public void testNormaliseReplaceAlphaCharacters() { |
| String inputNumber = "034-I-am-HUNGRY"; |
| String expectedOutput = "034426486479"; |
| assertEquals("Conversion did not correctly replace alpha characters", |
| expectedOutput, |
| PhoneNumberUtil.normalize(inputNumber)); |
| } |
| |
| public void testNormaliseOtherDigits() { |
| String inputNumber = "\uFF125\u0665"; |
| String expectedOutput = "255"; |
| assertEquals("Conversion did not correctly replace non-latin digits", |
| expectedOutput, |
| PhoneNumberUtil.normalize(inputNumber)); |
| } |
| |
| public void testNormaliseStripAlphaCharacters() { |
| String inputNumber = "034-56&+a#234"; |
| String expectedOutput = "03456234"; |
| assertEquals("Conversion did not correctly remove alpha character", |
| expectedOutput, |
| PhoneNumberUtil.normalizeDigitsOnly(inputNumber)); |
| } |
| |
| public void testFormatUSNumber() { |
| PhoneNumber usNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6502530000L).build(); |
| assertEquals("650 253 0000", phoneUtil.format(usNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+1 650 253 0000", |
| phoneUtil.format(usNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| |
| PhoneNumber usNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(8002530000L).build(); |
| assertEquals("800 253 0000", phoneUtil.format(usNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+1 800 253 0000", |
| phoneUtil.format(usNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| |
| PhoneNumber usNumber3 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(9002530000L).build(); |
| assertEquals("900 253 0000", phoneUtil.format(usNumber3, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+1 900 253 0000", |
| phoneUtil.format(usNumber3, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| } |
| |
| public void testFormatBSNumber() { |
| PhoneNumber bsNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(2421234567L).build(); |
| assertEquals("242 123 4567", phoneUtil.format(bsNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+1 242 123 4567", |
| phoneUtil.format(bsNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| |
| PhoneNumber bsNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(8002530000L).build(); |
| assertEquals("800 253 0000", phoneUtil.format(bsNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+1 800 253 0000", |
| phoneUtil.format(bsNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| |
| PhoneNumber bsNumber3 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(9002530000L).build(); |
| assertEquals("900 253 0000", phoneUtil.format(bsNumber3, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+1 900 253 0000", |
| phoneUtil.format(bsNumber3, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| } |
| |
| public void testFormatGBNumber() { |
| PhoneNumber gbNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(2087389353L).build(); |
| assertEquals("(020) 8738 9353", phoneUtil.format(gbNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+44 20 8738 9353", |
| phoneUtil.format(gbNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| |
| PhoneNumber gbNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(7912345678L).build(); |
| assertEquals("(07912) 345 678", phoneUtil.format(gbNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+44 7912 345 678", |
| phoneUtil.format(gbNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| } |
| |
| public void testFormatDENumber() { |
| PhoneNumber deNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(301234L).build(); |
| assertEquals("030 1234", phoneUtil.format(deNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+49 30 1234", |
| phoneUtil.format(deNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| |
| PhoneNumber deNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(291123L).build(); |
| assertEquals("0291 123", phoneUtil.format(deNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+49 291 123", |
| phoneUtil.format(deNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| |
| PhoneNumber deNumber3 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(29112345678L).build(); |
| assertEquals("0291 12345678", phoneUtil.format(deNumber3, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+49 291 12345678", |
| phoneUtil.format(deNumber3, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| |
| PhoneNumber deNumber4 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(9123123L).build(); |
| assertEquals("09123 123", phoneUtil.format(deNumber4, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+49 9123 123", |
| phoneUtil.format(deNumber4, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| PhoneNumber deNumber5 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(1234L).build(); |
| // 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(deNumber5, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+49 1234", |
| phoneUtil.format(deNumber5, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| } |
| |
| public void testFormatITNumber() { |
| PhoneNumber itNumber1 = |
| PhoneNumber.newBuilder() |
| .setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true).build(); |
| assertEquals("02 3661 8300", phoneUtil.format(itNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+39 02 3661 8300", |
| phoneUtil.format(itNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| assertEquals("+390236618300", |
| phoneUtil.format(itNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| |
| PhoneNumber itNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(345678901L).build(); |
| assertEquals("345 678 901", phoneUtil.format(itNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+39 345 678 901", |
| phoneUtil.format(itNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| assertEquals("+39345678901", |
| phoneUtil.format(itNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| } |
| |
| public void testFormatAUNumber() { |
| PhoneNumber auNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(61).setNationalNumber(236618300L).build(); |
| assertEquals("02 3661 8300", phoneUtil.format(auNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+61 2 3661 8300", |
| phoneUtil.format(auNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| assertEquals("+61236618300", |
| phoneUtil.format(auNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| |
| PhoneNumber auNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(61).setNationalNumber(1800123456L).build(); |
| assertEquals("1800 123 456", phoneUtil.format(auNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+61 1800 123 456", |
| phoneUtil.format(auNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| assertEquals("+611800123456", |
| phoneUtil.format(auNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| } |
| |
| public void testFormatARNumber() { |
| PhoneNumber arNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(1187654321L).build(); |
| assertEquals("011 8765-4321", phoneUtil.format(arNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+54 11 8765-4321", |
| phoneUtil.format(arNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| assertEquals("+541187654321", |
| phoneUtil.format(arNumber1, |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| |
| PhoneNumber arNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(91187654321L).build(); |
| assertEquals("011 15 8765-4321", phoneUtil.format(arNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals("+54 9 11 8765 4321", |
| phoneUtil.format(arNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| assertEquals("+5491187654321", |
| phoneUtil.format(arNumber2, |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| } |
| |
| public void testFormatOutOfCountryCallingNumber() { |
| PhoneNumber usNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(9002530000L).build(); |
| assertEquals("00 1 900 253 0000", |
| phoneUtil.formatOutOfCountryCallingNumber(usNumber1, "DE")); |
| |
| PhoneNumber usNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6502530000L).build(); |
| assertEquals("1 650 253 0000", |
| phoneUtil.formatOutOfCountryCallingNumber(usNumber2, "BS")); |
| |
| assertEquals("0~0 1 650 253 0000", |
| phoneUtil.formatOutOfCountryCallingNumber(usNumber2, "PL")); |
| |
| PhoneNumber gbNumber = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(7912345678L).build(); |
| assertEquals("011 44 7912 345 678", |
| phoneUtil.formatOutOfCountryCallingNumber(gbNumber, "US")); |
| |
| PhoneNumber deNumber = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(1234L).build(); |
| 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. |
| assertEquals("1234", |
| phoneUtil.formatOutOfCountryCallingNumber(deNumber, "DE")); |
| |
| PhoneNumber itNumber = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(236618300L) |
| .setItalianLeadingZero(true).build(); |
| assertEquals("011 39 02 3661 8300", |
| phoneUtil.formatOutOfCountryCallingNumber(itNumber, "US")); |
| assertEquals("02 3661 8300", |
| phoneUtil.formatOutOfCountryCallingNumber(itNumber, "IT")); |
| assertEquals("+39 02 3661 8300", |
| phoneUtil.formatOutOfCountryCallingNumber(itNumber, "SG")); |
| |
| PhoneNumber sgNumber = |
| PhoneNumber.newBuilder().setCountryCode(65).setNationalNumber(94777892L).build(); |
| assertEquals("9477 7892", |
| phoneUtil.formatOutOfCountryCallingNumber(sgNumber, "SG")); |
| |
| PhoneNumber arNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(91187654321L).build(); |
| assertEquals("011 54 9 11 8765 4321", |
| phoneUtil.formatOutOfCountryCallingNumber(arNumber1, "US")); |
| |
| PhoneNumber arNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(91187654321L) |
| .setExtension("1234").build(); |
| assertEquals("011 54 9 11 8765 4321 ext. 1234", |
| phoneUtil.formatOutOfCountryCallingNumber(arNumber2, "US")); |
| assertEquals("0011 54 9 11 8765 4321 ext. 1234", |
| phoneUtil.formatOutOfCountryCallingNumber(arNumber2, "AU")); |
| assertEquals("011 15 8765-4321 ext. 1234", |
| phoneUtil.formatOutOfCountryCallingNumber(arNumber2, "AR")); |
| } |
| |
| public void testFormatOutOfCountryWithPreferredIntlPrefix() { |
| PhoneNumber.Builder itNumber = PhoneNumber.newBuilder(); |
| itNumber.setCountryCode(39).setNationalNumber(236618300L).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.build(), "AU")); |
| } |
| |
| public void testFormatByPattern() { |
| PhoneNumber usNumber = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6502530000L).build(); |
| NumberFormat newNumFormat1 = |
| NumberFormat.newBuilder().setPattern("(\\d{3})(\\d{3})(\\d{4})") |
| .setFormat("($1) $2-$3").build(); |
| List<NumberFormat> newNumberFormats = new ArrayList<NumberFormat>(); |
| newNumberFormats.add(newNumFormat1); |
| |
| assertEquals("(650) 253-0000", |
| phoneUtil.formatByPattern(usNumber, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL, |
| newNumberFormats)); |
| assertEquals("+1 (650) 253-0000", |
| phoneUtil.formatByPattern(usNumber, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL, |
| newNumberFormats)); |
| |
| PhoneNumber itNumber = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(236618300L) |
| .setItalianLeadingZero(true).build(); |
| NumberFormat newNumFormat2 = |
| NumberFormat.newBuilder().setPattern("(\\d{2})(\\d{5})(\\d{3})") |
| .setFormat("$1-$2 $3").build(); |
| newNumberFormats.set(0, newNumFormat2); |
| |
| assertEquals("02-36618 300", |
| phoneUtil.formatByPattern(itNumber, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL, |
| newNumberFormats)); |
| assertEquals("+39 02-36618 300", |
| phoneUtil.formatByPattern(itNumber, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL, |
| newNumberFormats)); |
| |
| PhoneNumber gbNumber = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(2012345678L).build(); |
| |
| NumberFormat newNumFormat3 = |
| NumberFormat.newBuilder().setNationalPrefixFormattingRule("$NP$FG") |
| .setPattern("(\\d{2})(\\d{4})(\\d{4})").setFormat("$1 $2 $3").build(); |
| newNumberFormats.set(0, newNumFormat3); |
| assertEquals("020 1234 5678", |
| phoneUtil.formatByPattern(gbNumber, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL, |
| newNumberFormats)); |
| |
| NumberFormat newNumFormat4 = |
| NumberFormat.newBuilder(newNumFormat3).setNationalPrefixFormattingRule("($NP$FG)").build(); |
| newNumberFormats.set(0, newNumFormat4); |
| assertEquals("(020) 1234 5678", |
| phoneUtil.formatByPattern(gbNumber, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL, |
| newNumberFormats)); |
| NumberFormat newNumFormat5 = |
| NumberFormat.newBuilder(newNumFormat4).setNationalPrefixFormattingRule("").build(); |
| newNumberFormats.set(0, newNumFormat5); |
| assertEquals("20 1234 5678", |
| phoneUtil.formatByPattern(gbNumber, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL, |
| newNumberFormats)); |
| |
| NumberFormat newNumFormat6 = |
| NumberFormat.newBuilder(newNumFormat5).setNationalPrefixFormattingRule("").build(); |
| newNumberFormats.set(0, newNumFormat6); |
| assertEquals("+44 20 1234 5678", |
| phoneUtil.formatByPattern(gbNumber, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL, |
| newNumberFormats)); |
| } |
| |
| public void testFormatE164Number() { |
| PhoneNumber.Builder usNumber = PhoneNumber.newBuilder(); |
| usNumber.setCountryCode(1).setNationalNumber(6502530000L); |
| assertEquals("+16502530000", phoneUtil.format(usNumber.build(), |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| PhoneNumber.Builder deNumber = PhoneNumber.newBuilder(); |
| deNumber.setCountryCode(49).setNationalNumber(301234L); |
| assertEquals("+49301234", phoneUtil.format(deNumber.build(), |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| } |
| |
| public void testFormatNumberWithExtension() { |
| PhoneNumber.Builder nzNumber = PhoneNumber.newBuilder(); |
| nzNumber.setCountryCode(64).setNationalNumber(33316005L).setExtension("1234"); |
| // Uses default extension prefix: |
| assertEquals("03-331 6005 ext. 1234", |
| phoneUtil.format(nzNumber.build(), |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| // Extension prefix overridden in the territory information for the US: |
| PhoneNumber.Builder usNumber = PhoneNumber.newBuilder(); |
| usNumber.setCountryCode(1).setNationalNumber(6502530000L).setExtension("4567"); |
| assertEquals("650 253 0000 extn. 4567", |
| phoneUtil.format(usNumber.build(), |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| } |
| |
| public void testIsPremiumRate() { |
| PhoneNumber premiumRateNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(9004433030L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, |
| phoneUtil.getNumberType(premiumRateNumber1)); |
| |
| PhoneNumber premiumRateNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(892123L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, |
| phoneUtil.getNumberType(premiumRateNumber2)); |
| |
| PhoneNumber premiumRateNumber3 = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(9187654321L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, |
| phoneUtil.getNumberType(premiumRateNumber3)); |
| |
| PhoneNumber premiumRateNumber4 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(9001654321L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, |
| phoneUtil.getNumberType(premiumRateNumber4)); |
| |
| PhoneNumber premiumRateNumber5 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(90091234567L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, |
| phoneUtil.getNumberType(premiumRateNumber5)); |
| } |
| |
| public void testIsTollFree() { |
| PhoneNumber tollFreeNumber1 |
| = PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(8881234567L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE, |
| phoneUtil.getNumberType(tollFreeNumber1)); |
| |
| PhoneNumber tollFreeNumber2 |
| = PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(803123L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE, |
| phoneUtil.getNumberType(tollFreeNumber2)); |
| |
| PhoneNumber tollFreeNumber3 |
| = PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(8012345678L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE, |
| phoneUtil.getNumberType(tollFreeNumber3)); |
| |
| PhoneNumber tollFreeNumber4 |
| = PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(8001234567L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE, |
| phoneUtil.getNumberType(tollFreeNumber4)); |
| } |
| |
| public void testIsMobile() { |
| PhoneNumber mobileNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(2423570000L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, |
| phoneUtil.getNumberType(mobileNumber1)); |
| |
| PhoneNumber mobileNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(312345678L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, |
| phoneUtil.getNumberType(mobileNumber2)); |
| |
| PhoneNumber mobileNumber3 = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(7912345678L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, |
| phoneUtil.getNumberType(mobileNumber3)); |
| |
| PhoneNumber mobileNumber4 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(15123456789L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, |
| phoneUtil.getNumberType(mobileNumber4)); |
| |
| PhoneNumber mobileNumber5 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(91187654321L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, |
| phoneUtil.getNumberType(mobileNumber5)); |
| } |
| |
| public void testIsFixedLine() { |
| // A Bahama fixed-line number |
| PhoneNumber fixedLineNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(2423651234L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE, |
| phoneUtil.getNumberType(fixedLineNumber1)); |
| |
| // An Italian fixed-line number |
| PhoneNumber fixedLineNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(236618300L) |
| .setItalianLeadingZero(true).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE, |
| phoneUtil.getNumberType(fixedLineNumber2)); |
| |
| PhoneNumber fixedLineNumber3 = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(2012345678L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE, |
| phoneUtil.getNumberType(fixedLineNumber3)); |
| |
| PhoneNumber fixedLineNumber4 = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(301234L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE, |
| phoneUtil.getNumberType(fixedLineNumber4)); |
| } |
| |
| public void testIsFixedLineAndMobile() { |
| PhoneNumber fixedLineAndMobileNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6502531111L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE_OR_MOBILE, |
| phoneUtil.getNumberType(fixedLineAndMobileNumber1)); |
| |
| PhoneNumber fixedLineAndMobileNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(1987654321L).build(); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE_OR_MOBILE, |
| phoneUtil.getNumberType(fixedLineAndMobileNumber2)); |
| } |
| |
| public void testIsSharedCost() { |
| PhoneNumber.Builder gbNumber = PhoneNumber.newBuilder(); |
| gbNumber.setCountryCode(44).setNationalNumber(8431231234L); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.SHARED_COST, |
| phoneUtil.getNumberType(gbNumber.build())); |
| } |
| |
| public void testIsVoip() { |
| PhoneNumber.Builder gbNumber = PhoneNumber.newBuilder(); |
| gbNumber.setCountryCode(44).setNationalNumber(5631231234L); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.VOIP, phoneUtil.getNumberType(gbNumber.build())); |
| } |
| |
| public void testIsPersonalNumber() { |
| PhoneNumber.Builder gbNumber = PhoneNumber.newBuilder(); |
| gbNumber.setCountryCode(44).setNationalNumber(7031231234L); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.PERSONAL_NUMBER, |
| phoneUtil.getNumberType(gbNumber.build())); |
| } |
| |
| public void testIsUnknown() { |
| PhoneNumber.Builder unknownNumber = PhoneNumber.newBuilder(); |
| unknownNumber.setCountryCode(1).setNationalNumber(65025311111L); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.UNKNOWN, |
| phoneUtil.getNumberType(unknownNumber.build())); |
| } |
| |
| public void testIsValidNumber() { |
| PhoneNumber.Builder usNumber = PhoneNumber.newBuilder(); |
| usNumber.setCountryCode(1).setNationalNumber(6502530000L); |
| assertTrue(phoneUtil.isValidNumber(usNumber.build())); |
| |
| PhoneNumber.Builder itNumber = PhoneNumber.newBuilder(); |
| itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true); |
| assertTrue(phoneUtil.isValidNumber(itNumber.build())); |
| |
| PhoneNumber.Builder gbNumber = PhoneNumber.newBuilder(); |
| gbNumber.setCountryCode(44).setNationalNumber(7912345678L); |
| assertTrue(phoneUtil.isValidNumber(gbNumber.build())); |
| |
| PhoneNumber.Builder nzNumber = PhoneNumber.newBuilder(); |
| nzNumber.setCountryCode(64).setNationalNumber(21387835L); |
| assertTrue(phoneUtil.isValidNumber(nzNumber.build())); |
| } |
| |
| public void testIsValidForRegion() { |
| // This number is valid for the Bahamas, but is not a valid US number. |
| PhoneNumber bsNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(2423232345L).build(); |
| assertTrue(phoneUtil.isValidNumber(bsNumber1)); |
| assertTrue(phoneUtil.isValidNumberForRegion(bsNumber1, "BS")); |
| assertFalse(phoneUtil.isValidNumberForRegion(bsNumber1, "US")); |
| PhoneNumber bsNumber2 = |
| PhoneNumber.newBuilder(bsNumber1).setNationalNumber(2421232345L).build(); |
| // This number is no longer valid. |
| assertFalse(phoneUtil.isValidNumber(bsNumber2)); |
| } |
| |
| public void testIsNotValidNumber() { |
| PhoneNumber.Builder usNumber = PhoneNumber.newBuilder(); |
| usNumber.setCountryCode(1).setNationalNumber(2530000L); |
| assertFalse(phoneUtil.isValidNumber(usNumber.build())); |
| |
| PhoneNumber.Builder itNumber = PhoneNumber.newBuilder(); |
| itNumber.setCountryCode(39).setNationalNumber(23661830000L).setItalianLeadingZero(true); |
| assertFalse(phoneUtil.isValidNumber(itNumber.build())); |
| |
| PhoneNumber.Builder gbNumber = PhoneNumber.newBuilder(); |
| gbNumber.setCountryCode(44).setNationalNumber(791234567L); |
| assertFalse(phoneUtil.isValidNumber(gbNumber.build())); |
| |
| PhoneNumber.Builder deNumber = PhoneNumber.newBuilder(); |
| deNumber.setCountryCode(49).setNationalNumber(1234L); |
| assertFalse(phoneUtil.isValidNumber(deNumber.build())); |
| |
| PhoneNumber.Builder nzNumber = PhoneNumber.newBuilder(); |
| nzNumber.setCountryCode(64).setNationalNumber(3316005L); |
| assertFalse(phoneUtil.isValidNumber(nzNumber.build())); |
| } |
| |
| public void testGetRegionCodeForCountryCode() { |
| assertEquals("US", phoneUtil.getRegionCodeForCountryCode(1)); |
| assertEquals("GB", phoneUtil.getRegionCodeForCountryCode(44)); |
| assertEquals("DE", phoneUtil.getRegionCodeForCountryCode(49)); |
| } |
| |
| public void testGetRegionCodeForNumber() { |
| PhoneNumber.Builder bsNumber = PhoneNumber.newBuilder(); |
| bsNumber.setCountryCode(1).setNationalNumber(2423027000L); |
| assertEquals("BS", phoneUtil.getRegionCodeForNumber(bsNumber.build())); |
| |
| PhoneNumber.Builder usNumber = PhoneNumber.newBuilder(); |
| usNumber.setCountryCode(1).setNationalNumber(6502530000L); |
| assertEquals("US", phoneUtil.getRegionCodeForNumber(usNumber.build())); |
| |
| PhoneNumber.Builder gbNumber = PhoneNumber.newBuilder(); |
| gbNumber.setCountryCode(44).setNationalNumber(7912345678L); |
| assertEquals("GB", phoneUtil.getRegionCodeForNumber(gbNumber.build())); |
| } |
| |
| public void testGetCountryCodeForRegion() { |
| assertEquals(1, phoneUtil.getCountryCodeForRegion("US")); |
| assertEquals(64, phoneUtil.getCountryCodeForRegion("NZ")); |
| } |
| |
| public void testGetNANPACountries() { |
| Set nanpaCountries = phoneUtil.getNANPACountries(); |
| assertEquals(2, nanpaCountries.size()); |
| assertTrue(nanpaCountries.contains("US")); |
| assertTrue(nanpaCountries.contains("BS")); |
| } |
| |
| public void testIsPossibleNumber() { |
| PhoneNumber number1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6502530000L).build(); |
| assertTrue(phoneUtil.isPossibleNumber(number1)); |
| |
| PhoneNumber number2 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(2530000L).build(); |
| assertTrue(phoneUtil.isPossibleNumber(number2)); |
| |
| PhoneNumber number3 = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(2070313000L).build(); |
| assertTrue(phoneUtil.isPossibleNumber(number3)); |
| assertTrue(phoneUtil.isPossibleNumber("+1 650 253 0000", "US")); |
| assertTrue(phoneUtil.isPossibleNumber("+1 650 GOO OGLE", "US")); |
| assertTrue(phoneUtil.isPossibleNumber("(650) 253-0000", "US")); |
| assertTrue(phoneUtil.isPossibleNumber("253-0000", "US")); |
| assertTrue(phoneUtil.isPossibleNumber("+1 650 253 0000", "GB")); |
| assertTrue(phoneUtil.isPossibleNumber("+44 20 7031 3000", "GB")); |
| assertTrue(phoneUtil.isPossibleNumber("(020) 7031 3000", "GB")); |
| assertTrue(phoneUtil.isPossibleNumber("7031 3000", "GB")); |
| assertTrue(phoneUtil.isPossibleNumber("3331 6005", "NZ")); |
| } |
| |
| public void testIsPossibleNumberWithReason() { |
| // FYI, national numbers for country code +1 that are within 7 to 10 digits are possible. |
| PhoneNumber number1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6502530000L).build(); |
| assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE, |
| phoneUtil.isPossibleNumberWithReason(number1)); |
| |
| PhoneNumber number2 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(2530000L).build(); |
| assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE, |
| phoneUtil.isPossibleNumberWithReason(number2)); |
| |
| PhoneNumber number3 = |
| PhoneNumber.newBuilder().setCountryCode(0).setNationalNumber(2530000L).build(); |
| assertEquals(PhoneNumberUtil.ValidationResult.INVALID_COUNTRY_CODE, |
| phoneUtil.isPossibleNumberWithReason(number3)); |
| |
| PhoneNumber number4 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(253000L).build(); |
| assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT, |
| phoneUtil.isPossibleNumberWithReason(number4)); |
| |
| PhoneNumber number5 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(65025300000L).build(); |
| assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG, |
| phoneUtil.isPossibleNumberWithReason(number5)); |
| } |
| |
| public void testIsNotPossibleNumber() { |
| PhoneNumber number1 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(65025300000L).build(); |
| assertFalse(phoneUtil.isPossibleNumber(number1)); |
| |
| PhoneNumber number2 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(253000L).build(); |
| assertFalse(phoneUtil.isPossibleNumber(number2)); |
| |
| PhoneNumber number3 = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(300L).build(); |
| assertFalse(phoneUtil.isPossibleNumber(number3)); |
| |
| assertFalse(phoneUtil.isPossibleNumber("+1 650 253 00000", "US")); |
| assertFalse(phoneUtil.isPossibleNumber("(650) 253-00000", "US")); |
| assertFalse(phoneUtil.isPossibleNumber("I want a Pizza", "US")); |
| assertFalse(phoneUtil.isPossibleNumber("253-000", "US")); |
| assertFalse(phoneUtil.isPossibleNumber("1 3000", "GB")); |
| assertFalse(phoneUtil.isPossibleNumber("+44 300", "GB")); |
| } |
| |
| public void testIsViablePhoneNumber() { |
| // Only one or two digits before strange non-possible punctuation. |
| assertFalse(PhoneNumberUtil.isViablePhoneNumber("12. March")); |
| assertFalse(PhoneNumberUtil.isViablePhoneNumber("1+1+1")); |
| assertFalse(PhoneNumberUtil.isViablePhoneNumber("80+0")); |
| assertFalse(PhoneNumberUtil.isViablePhoneNumber("00")); |
| // Three digits is viable. |
| assertTrue(PhoneNumberUtil.isViablePhoneNumber("111")); |
| // Alpha numbers. |
| assertTrue(PhoneNumberUtil.isViablePhoneNumber("0800-4-pizza")); |
| assertTrue(PhoneNumberUtil.isViablePhoneNumber("0800-4-PIZZA")); |
| // Only one or two digits before possible punctuation followed by more digits. |
| assertTrue(PhoneNumberUtil.isViablePhoneNumber("1\u300034")); |
| assertFalse(PhoneNumberUtil.isViablePhoneNumber("1\u30003+4")); |
| // Unicode variants of possible starting character and other allowed punctuation/digits. |
| assertTrue(PhoneNumberUtil.isViablePhoneNumber("\uFF081\uFF09\u30003456789")); |
| // Testing a leading + is okay. |
| assertTrue(PhoneNumberUtil.isViablePhoneNumber("+1\uFF09\u30003456789")); |
| } |
| |
| public void testExtractPossibleNumber() { |
| // Removes preceding funky punctuation and letters but leaves the rest untouched. |
| assertEquals("0800-345-600", PhoneNumberUtil.extractPossibleNumber("Tel:0800-345-600")); |
| assertEquals("0800 FOR PIZZA", PhoneNumberUtil.extractPossibleNumber("Tel:0800 FOR PIZZA")); |
| // Should not remove plus sign |
| assertEquals("+800-345-600", PhoneNumberUtil.extractPossibleNumber("Tel:+800-345-600")); |
| // Should recognise wide digits as possible start values. |
| assertEquals("\uFF10\uFF12\uFF13", |
| PhoneNumberUtil.extractPossibleNumber("\uFF10\uFF12\uFF13")); |
| // Dashes are not possible start values and should be removed. |
| assertEquals("\uFF11\uFF12\uFF13", |
| PhoneNumberUtil.extractPossibleNumber("Num-\uFF11\uFF12\uFF13")); |
| // If not possible number present, return empty string. |
| assertEquals("", PhoneNumberUtil.extractPossibleNumber("Num-....")); |
| // Leading brackets are stripped - these are not used when parsing. |
| assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000")); |
| } |
| |
| public void testMaybeStripNationalPrefix() { |
| String nationalPrefix = "34"; |
| StringBuffer numberToStrip = new StringBuffer("34356778"); |
| String strippedNumber = "356778"; |
| String nationalRuleRegExp = "\\d{4,7}"; |
| Pattern nationalRule = Pattern.compile(nationalRuleRegExp); |
| phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, "", nationalRule); |
| 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); |
| 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); |
| 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"; |
| numberToStrip = new StringBuffer("3123"); |
| strippedNumber = "3123"; |
| phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, "", nationalRule); |
| assertEquals("Should have had no change - after stripping, it wouldn't have matched " + |
| "the national rule.", |
| strippedNumber, numberToStrip.toString()); |
| } |
| |
| public void testMaybeStripInternationalPrefix() { |
| String internationalPrefix = "00[39]"; |
| StringBuffer numberToStrip = new StringBuffer("0034567700-3898003"); |
| // Note the dash is removed as part of the normalization. |
| StringBuffer strippedNumber = new StringBuffer("45677003898003"); |
| assertEquals(true, phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip, |
| internationalPrefix)); |
| assertEquals("The number supplied was not stripped of its international prefix.", |
| strippedNumber.toString(), numberToStrip.toString()); |
| // Now the number no longer starts with an IDD prefix, so it should now report false. |
| assertEquals(false, phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip, |
| internationalPrefix)); |
| |
| numberToStrip = new StringBuffer("00945677003898003"); |
| assertEquals(true, phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip, |
| internationalPrefix)); |
| assertEquals("The number supplied was not stripped of its international prefix.", |
| strippedNumber.toString(), numberToStrip.toString()); |
| // Test it works when the international prefix is broken up by spaces. |
| numberToStrip = new StringBuffer("00 9 45677003898003"); |
| assertEquals(true, phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip, |
| internationalPrefix)); |
| assertEquals("The number supplied was not stripped of its international prefix.", |
| strippedNumber.toString(), numberToStrip.toString()); |
| // Now the number no longer starts with an IDD prefix, so it should now report false. |
| assertEquals(false, phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip, |
| internationalPrefix)); |
| |
| // Test the + symbol is also recognised and stripped. |
| numberToStrip = new StringBuffer("+45677003898003"); |
| strippedNumber = new StringBuffer("45677003898003"); |
| assertEquals(true, phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip, |
| internationalPrefix)); |
| assertEquals("The number supplied was not stripped of the plus symbol.", |
| strippedNumber.toString(), numberToStrip.toString()); |
| |
| // If the number afterwards is a zero, we should not strip this - no country code begins with 0. |
| numberToStrip = new StringBuffer("0090112-3123"); |
| strippedNumber = new StringBuffer("00901123123"); |
| assertEquals(false, phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip, |
| internationalPrefix)); |
| assertEquals("The number supplied had a 0 after the match so shouldn't be stripped.", |
| strippedNumber.toString(), numberToStrip.toString()); |
| // Here the 0 is separated by a space from the IDD. |
| numberToStrip = new StringBuffer("009 0-112-3123"); |
| assertEquals(false, phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip, |
| internationalPrefix)); |
| } |
| |
| public void testMaybeExtractCountryCode() { |
| PhoneMetadata metadata = phoneUtil.getPhoneMetadata("US"); |
| // Note that for the US, the IDD is 011. |
| try { |
| String phoneNumber = "011112-3456789"; |
| String strippedNumber = "123456789"; |
| int countryCode = 1; |
| StringBuffer numberToFill = new StringBuffer(); |
| assertEquals("Did not extract country code " + countryCode + " correctly.", |
| countryCode, |
| phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill)); |
| // Should strip and normalize national significant number. |
| assertEquals("Did not strip off the country code correctly.", |
| strippedNumber, |
| numberToFill.toString()); |
| } catch (NumberParseException e) { |
| fail("Should not have thrown an exception: " + e.toString()); |
| } |
| try { |
| String phoneNumber = "+6423456789"; |
| int countryCode = 64; |
| StringBuffer numberToFill = new StringBuffer(); |
| assertEquals("Did not extract country code " + countryCode + " correctly.", |
| countryCode, |
| phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill)); |
| } catch (NumberParseException e) { |
| fail("Should not have thrown an exception: " + e.toString()); |
| } |
| try { |
| String phoneNumber = "2345-6789"; |
| StringBuffer numberToFill = new StringBuffer(); |
| assertEquals("Should not have extracted a country code - no international prefix present.", |
| 0, |
| phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill)); |
| } catch (NumberParseException e) { |
| fail("Should not have thrown an exception: " + e.toString()); |
| } |
| try { |
| String phoneNumber = "0119991123456789"; |
| StringBuffer numberToFill = new StringBuffer(); |
| phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, |
| numberToFill); |
| fail("Should have thrown an exception, no valid country code present."); |
| } catch (NumberParseException e) { |
| // Expected. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.INVALID_COUNTRY_CODE, |
| e.getErrorType()); |
| } |
| try { |
| String phoneNumber = "(1 610) 619 4466"; |
| int countryCode = 1; |
| StringBuffer numberToFill = new StringBuffer(); |
| assertEquals("Should have extracted the country code of the region passed in", |
| countryCode, |
| phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill)); |
| } catch (NumberParseException e) { |
| fail("Should not have thrown an exception: " + e.toString()); |
| } |
| try { |
| String phoneNumber = "(1 610) 619 446"; |
| StringBuffer numberToFill = new StringBuffer(); |
| assertEquals("Should not have extracted a country code - invalid number after extraction " + |
| "of uncertain country code.", |
| 0, |
| phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill)); |
| } catch (NumberParseException e) { |
| fail("Should not have thrown an exception: " + e.toString()); |
| } |
| try { |
| String phoneNumber = "(1 610) 619 43 446"; |
| StringBuffer numberToFill = new StringBuffer(); |
| assertEquals("Should not have extracted a country code - invalid number both before and " + |
| "after extraction of uncertain country code.", |
| 0, |
| phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, |
| numberToFill)); |
| } catch (NumberParseException e) { |
| fail("Should not have thrown an exception: " + e.toString()); |
| } |
| } |
| |
| public void testParseNationalNumber() throws Exception { |
| PhoneNumber nzNumber = |
| PhoneNumber.newBuilder().setCountryCode(64).setNationalNumber(33316005L).build(); |
| |
| // National prefix attached. |
| assertEquals(nzNumber, phoneUtil.parse("033316005", "NZ")); |
| assertEquals(nzNumber, phoneUtil.parse("33316005", "NZ")); |
| // National prefix attached and some formatting present. |
| assertEquals(nzNumber, phoneUtil.parse("03-331 6005", "NZ")); |
| assertEquals(nzNumber, phoneUtil.parse("03 331 6005", "NZ")); |
| // Test case with alpha characters. |
| PhoneNumber tollfreeNumber = |
| PhoneNumber.newBuilder().setCountryCode(64).setNationalNumber(800332005L).build(); |
| assertEquals(tollfreeNumber, phoneUtil.parse("0800 DDA 005", "NZ")); |
| PhoneNumber premiumNumber = |
| PhoneNumber.newBuilder().setCountryCode(64).setNationalNumber(9003326005L).build(); |
| assertEquals(premiumNumber, phoneUtil.parse("0900 DDA 6005", "NZ")); |
| // Not enough alpha characters for them to be considered intentional, so they are stripped. |
| assertEquals(premiumNumber, phoneUtil.parse("0900 332 6005a", "NZ")); |
| assertEquals(premiumNumber, phoneUtil.parse("0900 332 600a5", "NZ")); |
| assertEquals(premiumNumber, phoneUtil.parse("0900 332 600A5", "NZ")); |
| assertEquals(premiumNumber, phoneUtil.parse("0900 a332 600A5", "NZ")); |
| |
| // Testing international prefixes. |
| // Should strip country code. |
| assertEquals(nzNumber, 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. |
| assertEquals(nzNumber, phoneUtil.parse("01164 3 331 6005", "US")); |
| assertEquals(nzNumber, phoneUtil.parse("+64 3 331 6005", "US")); |
| |
| // Test for http://b/issue?id=2247493 |
| PhoneNumber nzNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(64).setNationalNumber(64123456L).build(); |
| assertEquals(nzNumber2, phoneUtil.parse("64(0)64123456", "NZ")); |
| |
| PhoneNumber usNumber = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6503336000L).build(); |
| assertEquals(usNumber, phoneUtil.parse("+1 (650) 333-6000", "NZ")); |
| assertEquals(usNumber, phoneUtil.parse("1-650-333-6000", "US")); |
| // Calling the US number from Singapore by using different service providers |
| // 1st test: calling using SingTel IDD service (IDD is 001) |
| assertEquals(usNumber, phoneUtil.parse("0011-650-333-6000", "SG")); |
| // 2nd test: calling using StarHub IDD service (IDD is 008) |
| assertEquals(usNumber, phoneUtil.parse("0081-650-333-6000", "SG")); |
| // 3rd test: calling using SingTel V019 service (IDD is 019) |
| assertEquals(usNumber, phoneUtil.parse("0191-650-333-6000", "SG")); |
| // Calling the US number from Poland |
| assertEquals(usNumber, phoneUtil.parse("0~01-650-333-6000", "PL")); |
| // Check it doesn't use the '1' as a country code when parsing if the phone number was already |
| // possible. |
| PhoneNumber usNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(1234567890L).build(); |
| assertEquals(usNumber2, phoneUtil.parse("123-456-7890", "US")); |
| |
| PhoneNumber itNumber = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(236618300L) |
| .setItalianLeadingZero(true).build(); |
| assertEquals(itNumber, phoneUtil.parse("+39 02-36618 300", "NZ")); |
| assertEquals(itNumber, phoneUtil.parse("02-36618 300", "IT")); |
| |
| PhoneNumber itNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(312345678L).build(); |
| assertEquals(itNumber2, phoneUtil.parse("312 345 678", "IT")); |
| |
| // Check that using a "/" is fine in a phone number. |
| PhoneNumber deNumber = |
| PhoneNumber.newBuilder().setCountryCode(49).setNationalNumber(12345678L).build(); |
| assertEquals(deNumber, phoneUtil.parse("123/45678", "DE")); |
| |
| // Test parsing mobile numbers of Argentina. |
| PhoneNumber arNumber = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(93435551212L).build(); |
| assertEquals(arNumber, phoneUtil.parse("+54 9 343 555 1212", "AR")); |
| assertEquals(arNumber, phoneUtil.parse("0343 15 555 1212", "AR")); |
| |
| PhoneNumber arNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(93715654320L).build(); |
| assertEquals(arNumber2, phoneUtil.parse("+54 9 3715 65 4320", "AR")); |
| assertEquals(arNumber2, phoneUtil.parse("03715 15 65 4320", "AR")); |
| |
| // Test parsing fixed-line numbers of Argentina. |
| PhoneNumber arNumber3 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(1137970000L).build(); |
| assertEquals(arNumber3, phoneUtil.parse("+54 11 3797 0000", "AR")); |
| assertEquals(arNumber3, phoneUtil.parse("011 3797 0000", "AR")); |
| |
| PhoneNumber arNumber4 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(3715654321L).build(); |
| assertEquals(arNumber4, phoneUtil.parse("+54 3715 65 4321", "AR")); |
| assertEquals(arNumber4, phoneUtil.parse("03715 65 4321", "AR")); |
| |
| PhoneNumber arNumber5 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(2312340000L).build(); |
| assertEquals(arNumber5, phoneUtil.parse("+54 23 1234 0000", "AR")); |
| assertEquals(arNumber5, phoneUtil.parse("023 1234 0000", "AR")); |
| |
| // Test that having an 'x' in the phone number at the start is ok and that it just gets removed. |
| PhoneNumber arNumber6 = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(123456789L).build(); |
| assertEquals(arNumber6, phoneUtil.parse("0123456789", "AR")); |
| assertEquals(arNumber6, phoneUtil.parse("(0) 123456789", "AR")); |
| assertEquals(arNumber6, phoneUtil.parse("0 123456789", "AR")); |
| assertEquals(arNumber6, phoneUtil.parse("(0xx) 123456789", "AR")); |
| PhoneNumber arFromUs = |
| PhoneNumber.newBuilder().setCountryCode(54).setNationalNumber(81429712L).build(); |
| // This test is intentionally constructed such that the number of digit after xx is larger than |
| // 7, so that the number won't be mistakenly treated as an 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. |
| assertEquals(arFromUs, phoneUtil.parse("011xx5481429712", "US")); |
| |
| // Test parsing fixed-line numbers of Mexico. |
| PhoneNumber mxNumber = |
| PhoneNumber.newBuilder().setCountryCode(52).setNationalNumber(4499780001L).build(); |
| assertEquals(mxNumber, phoneUtil.parse("+52 (449)978-0001", "MX")); |
| assertEquals(mxNumber, phoneUtil.parse("01 (449)978-0001", "MX")); |
| assertEquals(mxNumber, phoneUtil.parse("(449)978-0001", "MX")); |
| |
| // Test parsing mobile numbers of Mexico. |
| PhoneNumber mxNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(52).setNationalNumber(13312345678L).build(); |
| assertEquals(mxNumber2, phoneUtil.parse("+52 1 33 1234-5678", "MX")); |
| assertEquals(mxNumber2, phoneUtil.parse("044 (33) 1234-5678", "MX")); |
| assertEquals(mxNumber2, phoneUtil.parse("045 33 1234-5678", "MX")); |
| |
| // Test that if a number has two extensions specified, we ignore the second. |
| PhoneNumber usWithTwoExtensionsNumber = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(2121231234L) |
| .setExtension("508").build(); |
| assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508/x1234", |
| "US")); |
| assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508/ x1234", |
| "US")); |
| assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508\\x1234", |
| "US")); |
| |
| // Test parsing numbers in the form (645) 123-1234-910# works, where the last 3 digits before |
| // the # are an extension. |
| PhoneNumber usWithExtension = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6451231234L) |
| .setExtension("910").build(); |
| assertEquals(usWithExtension, phoneUtil.parse("+1 (645) 123 1234-910#", "US")); |
| } |
| |
| public void testFailedParseOnInvalidNumbers() { |
| try { |
| String sentencePhoneNumber = "This is not a phone number"; |
| phoneUtil.parse(sentencePhoneNumber, "NZ"); |
| fail("This should not parse without throwing an exception " + sentencePhoneNumber); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.NOT_A_NUMBER, |
| e.getErrorType()); |
| } |
| try { |
| String tooLongPhoneNumber = "01495 72553301873 810104"; |
| phoneUtil.parse(tooLongPhoneNumber, "GB"); |
| fail("This should not parse without throwing an exception " + tooLongPhoneNumber); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.TOO_LONG, |
| e.getErrorType()); |
| } |
| try { |
| String tooShortPhoneNumber = "+49 0"; |
| phoneUtil.parse(tooShortPhoneNumber, "DE"); |
| fail("This should not parse without throwing an exception " + tooShortPhoneNumber); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.TOO_SHORT_NSN, |
| e.getErrorType()); |
| } |
| try { |
| String invalidCountryCode = "+210 3456 56789"; |
| phoneUtil.parse(invalidCountryCode, "NZ"); |
| fail("This is not a recognised country code: should fail: " + invalidCountryCode); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.INVALID_COUNTRY_CODE, |
| e.getErrorType()); |
| } |
| try { |
| String someNumber = "123 456 7890"; |
| phoneUtil.parse(someNumber, "ZZ"); |
| fail("'Unknown' country code not allowed: should fail."); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.INVALID_COUNTRY_CODE, |
| e.getErrorType()); |
| } |
| try { |
| String someNumber = "123 456 7890"; |
| phoneUtil.parse(someNumber, null); |
| fail("Null country code not allowed: should fail."); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.INVALID_COUNTRY_CODE, |
| e.getErrorType()); |
| } |
| try { |
| String someNumber = "0044------"; |
| phoneUtil.parse(someNumber, "GB"); |
| fail("No number provided, only country code: should fail"); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, |
| e.getErrorType()); |
| } |
| try { |
| String someNumber = "0044"; |
| phoneUtil.parse(someNumber, "GB"); |
| fail("No number provided, only country code: should fail"); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, |
| e.getErrorType()); |
| } |
| try { |
| String someNumber = "011"; |
| phoneUtil.parse(someNumber, "US"); |
| fail("Only IDD provided - should fail."); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, |
| e.getErrorType()); |
| } |
| try { |
| String someNumber = "0119"; |
| phoneUtil.parse(someNumber, "US"); |
| fail("Only IDD provided and then 9 - should fail."); |
| } catch (NumberParseException e) { |
| // Expected this exception. |
| assertEquals("Wrong error type stored in exception.", |
| NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, |
| e.getErrorType()); |
| } |
| } |
| |
| public void testParseExtensions() throws Exception { |
| PhoneNumber nzNumber = |
| PhoneNumber.newBuilder().setCountryCode(64).setNationalNumber(33316005L) |
| .setExtension("3456").build(); |
| assertEquals(nzNumber, phoneUtil.parse("03 331 6005 ext 3456", "NZ")); |
| assertEquals(nzNumber, phoneUtil.parse("03-3316005x3456", "NZ")); |
| assertEquals(nzNumber, phoneUtil.parse("03-3316005 int.3456", "NZ")); |
| assertEquals(nzNumber, phoneUtil.parse("03 3316005 #3456", "NZ")); |
| // Test the following do not extract extensions: |
| PhoneNumber nonExtnNumber = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(180074935247L).build(); |
| assertEquals(nonExtnNumber, phoneUtil.parse("1800 six-flags", "US")); |
| assertEquals(nonExtnNumber, phoneUtil.parse("1800 SIX FLAGS", "US")); |
| assertEquals(nonExtnNumber, phoneUtil.parse("0~01 1800 7493 5247", "PL")); |
| assertEquals(nonExtnNumber, phoneUtil.parse("(1800) 7493.5247", "US")); |
| // Check that the last instance of an extension token is matched. |
| PhoneNumber extnNumber = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(180074935247L) |
| .setExtension("1234").build(); |
| assertEquals(extnNumber, phoneUtil.parse("0~01 1800 7493 5247 ~1234", "PL")); |
| // Verifying bug-fix where the last digit of a number was previously omitted if it was a 0 when |
| // extracting the extension. Also verifying a few different cases of extensions. |
| PhoneNumber ukNumber = |
| PhoneNumber.newBuilder().setCountryCode(44).setNationalNumber(2034567890L) |
| .setExtension("456").build(); |
| assertEquals(ukNumber, phoneUtil.parse("+44 2034567890x456", "NZ")); |
| assertEquals(ukNumber, phoneUtil.parse("+44 2034567890x456", "GB")); |
| assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 x456", "GB")); |
| assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X456", "GB")); |
| assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X 456", "GB")); |
| assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X 456", "GB")); |
| assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 x 456 ", "GB")); |
| assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X 456", "GB")); |
| |
| PhoneNumber usWithExtension = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(8009013355L) |
| .setExtension("7246433").build(); |
| assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 x 7246433", "US")); |
| assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 , ext 7246433", "US")); |
| assertEquals(usWithExtension, |
| phoneUtil.parse("(800) 901-3355 ,extension 7246433", "US")); |
| assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 , 7246433", "US")); |
| assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 ext: 7246433", "US")); |
| } |
| |
| public void testCountryWithNoNumberDesc() { |
| // Andorra is a country where we don't have PhoneNumberDesc info in the meta data. |
| PhoneNumber adNumber = |
| PhoneNumber.newBuilder().setCountryCode(376).setNationalNumber(12345L).build(); |
| assertEquals("+376 12345", phoneUtil.format(adNumber, |
| PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL)); |
| assertEquals("+37612345", phoneUtil.format(adNumber, |
| PhoneNumberUtil.PhoneNumberFormat.E164)); |
| assertEquals("12345", phoneUtil.format(adNumber, |
| PhoneNumberUtil.PhoneNumberFormat.NATIONAL)); |
| assertEquals(PhoneNumberUtil.PhoneNumberType.UNKNOWN, |
| phoneUtil.getNumberType(adNumber)); |
| assertTrue(phoneUtil.isValidNumber(adNumber)); |
| |
| // Test dialing a US number from within Andorra. |
| PhoneNumber usNumber = |
| PhoneNumber.newBuilder().setCountryCode(1).setNationalNumber(6502530000L).build(); |
| assertEquals("00 1 650 253 0000", |
| phoneUtil.formatOutOfCountryCallingNumber(usNumber, "AD")); |
| } |
| |
| public void testUnknownCountryCallingCodeForValidation() { |
| PhoneNumber.Builder invalidNumber = PhoneNumber.newBuilder(); |
| invalidNumber.setCountryCode(0).setNationalNumber(1234L); |
| assertFalse(phoneUtil.isValidNumber(invalidNumber.build())); |
| } |
| |
| public void testIsNumberMatchMatches() throws Exception { |
| // Test simple matches where formatting is different, or leading zeroes, or country code has |
| // been specified. |
| PhoneNumber num1 = phoneUtil.parse("+64 3 331 6005", "NZ"); |
| PhoneNumber num2 = phoneUtil.parse("+64 03 331 6005", "NZ"); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch(num1, num2)); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331 6005", "+64 03 331 6005")); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch("+64 03 331-6005", "+64 03331 6005")); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch("+643 331-6005", "+64033316005")); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch("+643 331-6005", "+6433316005")); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005", "+6433316005")); |
| // Test alpha numbers. |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch("+1800 siX-Flags", "+1 800 7493 5247")); |
| // Test numbers with extensions. |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "+6433316005#1234")); |
| // Test proto buffers. |
| PhoneNumber nzNumber = |
| PhoneNumber.newBuilder().setCountryCode(64).setNationalNumber(33316005L) |
| .setExtension("3456").build(); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch(nzNumber, "+643 331 6005 ext 3456")); |
| PhoneNumber nzNumber2 = PhoneNumber.newBuilder(nzNumber).clearExtension().build(); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch(nzNumber2, "+6403 331 6005")); |
| // Check empty extensions are ignored. |
| PhoneNumber nzNumber3 = PhoneNumber.newBuilder(nzNumber).setExtension("").build(); |
| assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch(nzNumber3, "+6403 331 6005")); |
| // Check variant with two proto buffers. |
| PhoneNumber nzNumber4 = |
| PhoneNumber.newBuilder().setCountryCode(64).setNationalNumber(33316005L).build(); |
| assertEquals("Number " + nzNumber.toString() + " did not match " + nzNumber4.toString(), |
| PhoneNumberUtil.MatchType.EXACT_MATCH, |
| phoneUtil.isNumberMatch(nzNumber3, nzNumber4)); |
| } |
| |
| public void testIsNumberMatchNonMatches() throws Exception { |
| // Non-matches. |
| assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, |
| phoneUtil.isNumberMatch("03 331 6005", "03 331 6006")); |
| // Different country code, partial number match. |
| assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005", "+16433316005")); |
| // Different country code, same number. |
| assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005", "+6133316005")); |
| // Extension different, all else the same. |
| assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "0116433316005#1235")); |
| // NSN matches, but extension is different - not the same number. |
| assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005 ext.1235", "3 331 6005#1234")); |
| } |
| |
| public void testIsNumberMatchNsnMatches() throws Exception { |
| // NSN matches. |
| assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005", "03 331 6005")); |
| assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, |
| phoneUtil.isNumberMatch("3 331-6005", "03 331 6005")); |
| PhoneNumber nzNumber = |
| PhoneNumber.newBuilder().setCountryCode(64).setNationalNumber(33316005L) |
| .setExtension("").build(); |
| assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, |
| phoneUtil.isNumberMatch(nzNumber, "03 331 6005")); |
| PhoneNumber unchangedNzNumber = PhoneNumber.newBuilder().setCountryCode(64) |
| .setNationalNumber(33316005L).setExtension("").build(); |
| // Check the phone number proto was not edited during the method call. |
| assertEquals(unchangedNzNumber, nzNumber); |
| } |
| |
| public void testIsNumberMatchShortNsnMatches() throws Exception { |
| // Short NSN matches with the country not specified for either one or both numbers. |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005", "331 6005")); |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch("3 331-6005", "331 6005")); |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch("3 331-6005", "+64 331 6005")); |
| // Short NSN match with the country specified. |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch("03 331-6005", "331 6005")); |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch("1 234 345 6789", "345 6789")); |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch("+1 (234) 345 6789", "345 6789")); |
| // NSN matches, country code omitted for one number, extension missing for one. |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch("+64 3 331-6005", "3 331 6005#1234")); |
| // One has Italian leading zero, one does not. |
| PhoneNumber italianNumber1 = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(1234L) |
| .setItalianLeadingZero(true).build(); |
| PhoneNumber italianNumber2 = |
| PhoneNumber.newBuilder().setCountryCode(39).setNationalNumber(1234L).build(); |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch(italianNumber1, italianNumber2)); |
| // One has an extension, the other has an extension of "". |
| PhoneNumber italianNumber3 = |
| PhoneNumber.newBuilder(italianNumber1).setExtension("1234") |
| .clearItalianLeadingZero().build(); |
| PhoneNumber italianNumber4 = |
| PhoneNumber.newBuilder(italianNumber2).setExtension("").build(); |
| assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, |
| phoneUtil.isNumberMatch(italianNumber3, italianNumber4)); |
| } |
| } |