PhoneNumberUtilTest.java revision 256a5f71a05ffd182a0fda2cfed6f93345cc889f
11524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia/*
21524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * Copyright (C) 2009 Google Inc.
31524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia *
41524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * Licensed under the Apache License, Version 2.0 (the "License");
51524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * you may not use this file except in compliance with the License.
61524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * You may obtain a copy of the License at
71524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia *
81524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * http://www.apache.org/licenses/LICENSE-2.0
91524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia *
101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * Unless required by applicable law or agreed to in writing, software
111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * distributed under the License is distributed on an "AS IS" BASIS,
121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * See the License for the specific language governing permissions and
141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * limitations under the License.
151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia */
161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiapackage com.google.i18n.phonenumbers;
181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport com.google.i18n.phonenumbers.Phonemetadata.NumberFormat;
201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport com.google.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
225c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jiaimport com.google.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource;
23256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennieimport com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
24f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia
251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport junit.framework.TestCase;
261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport java.util.ArrayList;
281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport java.util.List;
291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport java.util.regex.Pattern;
301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia/**
321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * Unit tests for PhoneNumberUtil.java
331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia *
34fa42140081949568565af7dc8c22f0600ad90a8aShaopeng Jia * Note that these tests use the metadata contained in the files with TEST_META_DATA_FILE_PREFIX,
35fa42140081949568565af7dc8c22f0600ad90a8aShaopeng Jia * not the normal metadata files, so should not be used for regression test purposes - these tests
361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * are illustrative only and test functionality.
371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia *
381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * @author Shaopeng Jia
391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * @author Lara Rennie
401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia */
411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiapublic class PhoneNumberUtilTest extends TestCase {
421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  private PhoneNumberUtil phoneUtil;
43b2697412130f6d087dde01fb1a978f7e5840a5faShaopeng Jia  static final String TEST_META_DATA_FILE_PREFIX =
44fa42140081949568565af7dc8c22f0600ad90a8aShaopeng Jia      "/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting";
45b2697412130f6d087dde01fb1a978f7e5840a5faShaopeng Jia  static final String TEST_COUNTRY_CODE_TO_REGION_CODE_MAP_CLASS_NAME =
46b2697412130f6d087dde01fb1a978f7e5840a5faShaopeng Jia      "CountryCodeToRegionCodeMapForTesting";
471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public PhoneNumberUtilTest() {
49fa42140081949568565af7dc8c22f0600ad90a8aShaopeng Jia    phoneUtil = initilizePhoneUtilForTesting();
50fa42140081949568565af7dc8c22f0600ad90a8aShaopeng Jia  }
51fa42140081949568565af7dc8c22f0600ad90a8aShaopeng Jia
52fa42140081949568565af7dc8c22f0600ad90a8aShaopeng Jia  PhoneNumberUtil initilizePhoneUtilForTesting() {
531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    PhoneNumberUtil.resetInstance();
54fa42140081949568565af7dc8c22f0600ad90a8aShaopeng Jia    return PhoneNumberUtil.getInstance(TEST_META_DATA_FILE_PREFIX,
55b2697412130f6d087dde01fb1a978f7e5840a5faShaopeng Jia        CountryCodeToRegionCodeMapForTesting.getCountryCodeToRegionCodeMap());
561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  @Override
591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  protected void setUp() throws Exception {
601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    super.setUp();
611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  @Override
641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  protected void tearDown() throws Exception {
651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    super.tearDown();
661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
68df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia  private void assertEquals(PhoneNumber number1, PhoneNumber number2) {
69df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    boolean equal = false;
7076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    if (number1 == null && number2 == null) {
71df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia      equal = true;
72df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    } else if (number1 != null && number2 != null) {
73df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia      equal = number1.exactlySameAs(number2);
7476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    }
75df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    if (!equal) {
76df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia      fail("The phone numbers do not match");
7776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    }
7876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia  }
7976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
80f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testGetInstanceLoadUSMetadata() {
817900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForRegion("US");
821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("US", metadata.getId());
831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(1, metadata.getCountryCode());
841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011", metadata.getInternationalPrefix());
85df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(metadata.hasNationalPrefix());
861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(2, metadata.getNumberFormatCount());
871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("(\\d{3})(\\d{3})(\\d{4})",
881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getNumberFormat(0).getPattern());
891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("$1 $2 $3", metadata.getNumberFormat(0).getFormat());
901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("[13-9]\\d{9}|2[0-35-9]\\d{8}",
911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getGeneralDesc().getNationalNumberPattern());
921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\\d{7,10}", metadata.getGeneralDesc().getPossibleNumberPattern());
935724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    assertTrue(metadata.getGeneralDesc().exactlySameAs(metadata.getFixedLine()));
941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern());
951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("900\\d{7}", metadata.getPremiumRate().getNationalNumberPattern());
961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // No shared-cost data is available, so it should be initialised to "NA".
971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("NA", metadata.getSharedCost().getNationalNumberPattern());
981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("NA", metadata.getSharedCost().getPossibleNumberPattern());
991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
1001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetInstanceLoadDEMetadata() {
1027900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForRegion("DE");
1031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("DE", metadata.getId());
1041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(49, metadata.getCountryCode());
1051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00", metadata.getInternationalPrefix());
1061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0", metadata.getNationalPrefix());
107df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(5, metadata.getNumberFormatCount());
108df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(1, metadata.getNumberFormat(4).getLeadingDigitsPatternCount());
109df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals("900", metadata.getNumberFormat(4).getLeadingDigitsPattern(0));
110df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals("(\\d{3})(\\d{3,4})(\\d{4})",
111df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia                 metadata.getNumberFormat(4).getPattern());
112df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals("$1 $2 $3", metadata.getNumberFormat(4).getFormat());
1131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:[1-9]\\d|0[2-9]))\\d{3,8}",
1141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getFixedLine().getNationalNumberPattern());
1151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\\d{2,14}", metadata.getFixedLine().getPossibleNumberPattern());
1161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("30123456", metadata.getFixedLine().getExampleNumber());
1171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern());
1181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("900([135]\\d{6}|9\\d{7})", metadata.getPremiumRate().getNationalNumberPattern());
1191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
1201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetInstanceLoadARMetadata() {
1227900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForRegion("AR");
1231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("AR", metadata.getId());
1241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(54, metadata.getCountryCode());
1251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00", metadata.getInternationalPrefix());
1261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0", metadata.getNationalPrefix());
1271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0(?:(11|343|3715)15)?", metadata.getNationalPrefixForParsing());
1281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("9$1", metadata.getNationalPrefixTransformRule());
1294b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("$1 15 $2-$3", metadata.getNumberFormat(2).getFormat());
1301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("9(\\d{4})(\\d{2})(\\d{4})",
1311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getNumberFormat(3).getPattern());
1321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("(9)(\\d{4})(\\d{2})(\\d{4})",
1331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getIntlNumberFormat(3).getPattern());
1341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("$1 $2 $3 $4", metadata.getIntlNumberFormat(3).getFormat());
1351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
1361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1375c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testGetLengthOfGeographicalAreaCode() {
13876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber number = new PhoneNumber();
1395c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google MTV, which has area code "650".
14076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(6502530000L);
14176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(3, phoneUtil.getLengthOfGeographicalAreaCode(number));
1425c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1435c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // A North America toll-free number, which has no area code.
14476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(8002530000L);
14576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number));
1465c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1475c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // An invalid US number (1 digit shorter), which has no area code.
14876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(650253000L);
14976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number));
1505c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1515c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google London, which has area code "20".
15276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(44).setNationalNumber(2070313000L);
15376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(number));
1545c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1555c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // A UK mobile phone, which has no area code.
15676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(44).setNationalNumber(7123456789L);
15776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number));
1585c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1595c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google Buenos Aires, which has area code "11".
16076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(54).setNationalNumber(1155303000L);
16176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(number));
1625c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1635c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google Sydney, which has area code "2".
16476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(61).setNationalNumber(293744000L);
16576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(1, phoneUtil.getLengthOfGeographicalAreaCode(number));
1665c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1675c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google Singapore. Singapore has no area code and no national prefix.
16876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(65).setNationalNumber(65218000L);
16976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(number));
1705c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
1715c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1725c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testGetNationalSignificantNumber() {
17376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber number = new PhoneNumber();
17476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(6502530000L);
17576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals("6502530000", PhoneNumberUtil.getNationalSignificantNumber(number));
1765c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1775c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // An Italian mobile number.
17876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(39).setNationalNumber(312345678L);
17976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals("312345678", PhoneNumberUtil.getNationalSignificantNumber(number));
1805c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1815c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // An Italian fixed line number.
18276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
18376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals("0236618300", PhoneNumberUtil.getNationalSignificantNumber(number));
1845c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
1855c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
186f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testGetExampleNumber() {
18776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber deNumber = new PhoneNumber();
18876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(30123456);
1891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(deNumber, phoneUtil.getExampleNumber("DE"));
1905c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(deNumber, phoneUtil.getExampleNumber("de"));
1911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(deNumber,
1931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.getExampleNumberForType("DE",
1941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                                   PhoneNumberUtil.PhoneNumberType.FIXED_LINE));
1951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(null,
1961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.getExampleNumberForType("DE",
1971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                                   PhoneNumberUtil.PhoneNumberType.MOBILE));
1981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // For the US, the example number is placed under general description, and hence should be used
1991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // for both fixed line and mobile, so neither of these should return null.
2001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertNotNull(phoneUtil.getExampleNumberForType("US",
2011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                                    PhoneNumberUtil.PhoneNumberType.FIXED_LINE));
2021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertNotNull(phoneUtil.getExampleNumberForType("US",
2031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                                    PhoneNumberUtil.PhoneNumberType.MOBILE));
2041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
2061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testNormaliseRemovePunctuation() {
2071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String inputNumber = "034-56&+#234";
2081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String expectedOutput = "03456234";
2091524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Conversion did not correctly remove punctuation",
2101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 expectedOutput,
2111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.normalize(inputNumber));
2121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
2141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testNormaliseReplaceAlphaCharacters() {
2151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String inputNumber = "034-I-am-HUNGRY";
2161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String expectedOutput = "034426486479";
2171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Conversion did not correctly replace alpha characters",
2181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 expectedOutput,
2191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.normalize(inputNumber));
2201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
2221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testNormaliseOtherDigits() {
2231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String inputNumber = "\uFF125\u0665";
2241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String expectedOutput = "255";
2251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Conversion did not correctly replace non-latin digits",
2261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 expectedOutput,
2271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.normalize(inputNumber));
2281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
2301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testNormaliseStripAlphaCharacters() {
2311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String inputNumber = "034-56&+a#234";
2321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String expectedOutput = "03456234";
2331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Conversion did not correctly remove alpha character",
2341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 expectedOutput,
2351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.normalizeDigitsOnly(inputNumber));
2361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
2381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatUSNumber() {
23976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
24076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6502530000L);
241256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("650 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
242256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+1 650 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.INTERNATIONAL));
2431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
24476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.clear();
24576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(8002530000L);
246256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("800 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
247256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+1 800 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.INTERNATIONAL));
2481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
24976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.clear();
25076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(9002530000L);
251256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("900 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
252256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+1 900 253 0000", phoneUtil.format(usNumber, PhoneNumberFormat.INTERNATIONAL));
2531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
2551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatBSNumber() {
25676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber bsNumber = new PhoneNumber();
25776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    bsNumber.setCountryCode(1).setNationalNumber(2421234567L);
258256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("242 123 4567", phoneUtil.format(bsNumber, PhoneNumberFormat.NATIONAL));
259256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+1 242 123 4567", phoneUtil.format(bsNumber, PhoneNumberFormat.INTERNATIONAL));
2601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
26176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    bsNumber.clear();
26276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    bsNumber.setCountryCode(1).setNationalNumber(8002530000L);
263256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("800 253 0000", phoneUtil.format(bsNumber, PhoneNumberFormat.NATIONAL));
264256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+1 800 253 0000", phoneUtil.format(bsNumber, PhoneNumberFormat.INTERNATIONAL));
2651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
26676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    bsNumber.clear();
26776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    bsNumber.setCountryCode(1).setNationalNumber(9002530000L);
268256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("900 253 0000", phoneUtil.format(bsNumber, PhoneNumberFormat.NATIONAL));
269256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+1 900 253 0000", phoneUtil.format(bsNumber, PhoneNumberFormat.INTERNATIONAL));
2701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
2721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatGBNumber() {
27376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
27476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(2087389353L);
275256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("(020) 8738 9353", phoneUtil.format(gbNumber, PhoneNumberFormat.NATIONAL));
276256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+44 20 8738 9353", phoneUtil.format(gbNumber, PhoneNumberFormat.INTERNATIONAL));
2771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
27876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    gbNumber.clear();
27976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(7912345678L);
280256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("(07912) 345 678", phoneUtil.format(gbNumber, PhoneNumberFormat.NATIONAL));
281256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+44 7912 345 678", phoneUtil.format(gbNumber, PhoneNumberFormat.INTERNATIONAL));
2821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
2841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatDENumber() {
28576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber deNumber = new PhoneNumber();
28676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(301234L);
287256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("030 1234", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
288256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 30 1234", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
2891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
29076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.clear();
29176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(291123L);
292256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("0291 123", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
293256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 291 123", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
2941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
29576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.clear();
29676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(29112345678L);
297256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("0291 12345678", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
298256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 291 12345678", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
2991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
30076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.clear();
30176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(9123123L);
302256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("09123 123", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
303256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 9123 123", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
30476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.clear();
305df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(80212345L);
306256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("08021 2345", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
307256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 8021 2345", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
308df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    deNumber.clear();
30976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(1234L);
3101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Note this number is correctly formatted without national prefix. Most of the numbers that
3111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // are treated as invalid numbers by the library are short numbers, and they are usually not
3121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // dialed with national prefix.
313256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("1234", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
314256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 1234", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
3151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatITNumber() {
31876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber itNumber = new PhoneNumber();
31976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
320256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("02 3661 8300", phoneUtil.format(itNumber, PhoneNumberFormat.NATIONAL));
321256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+39 02 3661 8300", phoneUtil.format(itNumber, PhoneNumberFormat.INTERNATIONAL));
322256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+390236618300", phoneUtil.format(itNumber, PhoneNumberFormat.E164));
3231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
32476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    itNumber.clear();
32576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(345678901L);
326256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("345 678 901", phoneUtil.format(itNumber, PhoneNumberFormat.NATIONAL));
327256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+39 345 678 901", phoneUtil.format(itNumber, PhoneNumberFormat.INTERNATIONAL));
328256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+39345678901", phoneUtil.format(itNumber, PhoneNumberFormat.E164));
329f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  }
3301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatAUNumber() {
33276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber auNumber = new PhoneNumber();
33376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    auNumber.setCountryCode(61).setNationalNumber(236618300L);
334256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("02 3661 8300", phoneUtil.format(auNumber, PhoneNumberFormat.NATIONAL));
335256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+61 2 3661 8300", phoneUtil.format(auNumber, PhoneNumberFormat.INTERNATIONAL));
336256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+61236618300", phoneUtil.format(auNumber, PhoneNumberFormat.E164));
3371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
33876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    auNumber.clear();
33976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    auNumber.setCountryCode(61).setNationalNumber(1800123456L);
340256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("1800 123 456", phoneUtil.format(auNumber, PhoneNumberFormat.NATIONAL));
341256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+61 1800 123 456", phoneUtil.format(auNumber, PhoneNumberFormat.INTERNATIONAL));
342256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+611800123456", phoneUtil.format(auNumber, PhoneNumberFormat.E164));
3431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatARNumber() {
34676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber arNumber = new PhoneNumber();
34776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(1187654321L);
348256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("011 8765-4321", phoneUtil.format(arNumber, PhoneNumberFormat.NATIONAL));
349256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+54 11 8765-4321", phoneUtil.format(arNumber, PhoneNumberFormat.INTERNATIONAL));
350256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+541187654321", phoneUtil.format(arNumber, PhoneNumberFormat.E164));
3511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
35276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.clear();
35376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(91187654321L);
354256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("011 15 8765-4321", phoneUtil.format(arNumber, PhoneNumberFormat.NATIONAL));
355256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+54 9 11 8765 4321", phoneUtil.format(arNumber, PhoneNumberFormat.INTERNATIONAL));
356256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+5491187654321", phoneUtil.format(arNumber, PhoneNumberFormat.E164));
3571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatOutOfCountryCallingNumber() {
36076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
36176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(9002530000L);
3621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00 1 900 253 0000",
36376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(usNumber, "DE"));
3641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
36576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.clear();
36676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6502530000L);
3671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("1 650 253 0000",
36876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(usNumber, "BS"));
3691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0~0 1 650 253 0000",
37176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(usNumber, "PL"));
3721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
37376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
37476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(7912345678L);
3751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 44 7912 345 678",
3761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(gbNumber, "US"));
3771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
37876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber deNumber = new PhoneNumber();
37976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(1234L);
3801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00 49 1234",
3811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(deNumber, "GB"));
3821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Note this number is correctly formatted without national prefix. Most of the numbers that
3831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // are treated as invalid numbers by the library are short numbers, and they are usually not
3841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // dialed with national prefix.
3851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("1234",
3861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(deNumber, "DE"));
3871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
38876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber itNumber = new PhoneNumber();
38976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
3901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 39 02 3661 8300",
3911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(itNumber, "US"));
3921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("02 3661 8300",
3931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(itNumber, "IT"));
3941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("+39 02 3661 8300",
3951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(itNumber, "SG"));
3961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
39776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber sgNumber = new PhoneNumber();
39876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    sgNumber.setCountryCode(65).setNationalNumber(94777892L);
3991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("9477 7892",
4001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(sgNumber, "SG"));
4011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
40276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber arNumber = new PhoneNumber();
40376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(91187654321L);
4041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 54 9 11 8765 4321",
40576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(arNumber, "US"));
4061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
40776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setExtension("1234");
4081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 54 9 11 8765 4321 ext. 1234",
40976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(arNumber, "US"));
4101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0011 54 9 11 8765 4321 ext. 1234",
41176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(arNumber, "AU"));
4121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 15 8765-4321 ext. 1234",
41376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(arNumber, "AR"));
4145c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals("011 15 8765-4321 ext. 1234",
41576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(arNumber, "ar"));
4161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
4171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatOutOfCountryWithPreferredIntlPrefix() {
41976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber itNumber = new PhoneNumber();
4201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
4211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // This should use 0011, since that is the preferred international prefix (both 0011 and 0012
4221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // are accepted as possible international prefixes in our test metadta.)
4231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0011 39 02 3661 8300",
42476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(itNumber, "AU"));
4251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
4261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4274b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia  public void testFormatWithCarrierCode() {
4284b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // We only support this for AR in our test metadata.
4294b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber arNumber = new PhoneNumber();
4304b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(91234125678L);
431256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("01234 12-5678", phoneUtil.format(arNumber, PhoneNumberFormat.NATIONAL));
4324b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Test formatting with a carrier code.
4334b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("01234 15 12-5678", phoneUtil.formatNationalNumberWithCarrierCode(arNumber, "15"));
4344b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Here the international rule is used, so no carrier code should be present.
435256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+5491234125678", phoneUtil.format(arNumber, PhoneNumberFormat.E164));
4364b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // We don't support this for the US so there should be no change.
4374b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
4384b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(4241231234L);
439256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("424 123 1234", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
4404b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("424 123 1234", phoneUtil.formatNationalNumberWithCarrierCode(usNumber, "15"));
4414b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia  }
4424b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
4431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatByPattern() {
44476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
44576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6502530000L);
446f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia
4475724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    NumberFormat newNumFormat = new NumberFormat();
4485724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setPattern("(\\d{3})(\\d{3})(\\d{4})");
4495724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setFormat("($1) $2-$3");
4501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    List<NumberFormat> newNumberFormats = new ArrayList<NumberFormat>();
4515724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumberFormats.add(newNumFormat);
4521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
453256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("(650) 253-0000", phoneUtil.formatByPattern(usNumber, PhoneNumberFormat.NATIONAL,
454256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                                                             newNumberFormats));
455256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+1 (650) 253-0000", phoneUtil.formatByPattern(usNumber,
456256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                                                                PhoneNumberFormat.INTERNATIONAL,
457256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                                                                newNumberFormats));
4581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
459df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // $NP is set to '1' for the US. Here we check that for other NANPA countries the US rules are
460df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // followed.
461df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("$NP ($FG)");
462df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    newNumFormat.setFormat("$1 $2-$3");
463df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber bsNumber = new PhoneNumber();
464df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    bsNumber.setCountryCode(1).setNationalNumber(4168819999L);
465df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals("1 (416) 881-9999",
466256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                 phoneUtil.formatByPattern(bsNumber, PhoneNumberFormat.NATIONAL, newNumberFormats));
467df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals("+1 416 881-9999",
468256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                 phoneUtil.formatByPattern(bsNumber, PhoneNumberFormat.INTERNATIONAL,
469df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia                                           newNumberFormats));
470df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
47176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber itNumber = new PhoneNumber();
47276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
47376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
4745724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setPattern("(\\d{2})(\\d{5})(\\d{3})");
4755724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setFormat("$1-$2 $3");
4765724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumberFormats.set(0, newNumFormat);
4771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("02-36618 300",
479256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                 phoneUtil.formatByPattern(itNumber, PhoneNumberFormat.NATIONAL, newNumberFormats));
4801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("+39 02-36618 300",
481256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                 phoneUtil.formatByPattern(itNumber, PhoneNumberFormat.INTERNATIONAL,
4821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                           newNumberFormats));
4831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4845724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
4855724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(2012345678L);
4861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4875724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("$NP$FG");
4885724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setPattern("(\\d{2})(\\d{4})(\\d{4})");
4895724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setFormat("$1 $2 $3");
4905724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumberFormats.set(0, newNumFormat);
4911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("020 1234 5678",
492256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                 phoneUtil.formatByPattern(gbNumber, PhoneNumberFormat.NATIONAL, newNumberFormats));
4931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4945724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("($NP$FG)");
4951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("(020) 1234 5678",
496256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                 phoneUtil.formatByPattern(gbNumber, PhoneNumberFormat.NATIONAL, newNumberFormats));
4975724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia
4985724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("");
4991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("20 1234 5678",
500256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                 phoneUtil.formatByPattern(gbNumber, PhoneNumberFormat.NATIONAL, newNumberFormats));
5011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
5025724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("");
5031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("+44 20 1234 5678",
504256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                 phoneUtil.formatByPattern(gbNumber, PhoneNumberFormat.INTERNATIONAL,
5051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                           newNumberFormats));
5061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
5071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
5081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatE164Number() {
50976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
5101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6502530000L);
511256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+16502530000", phoneUtil.format(usNumber, PhoneNumberFormat.E164));
51276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber deNumber = new PhoneNumber();
5131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(301234L);
514256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49301234", phoneUtil.format(deNumber, PhoneNumberFormat.E164));
5151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
5161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
5171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatNumberWithExtension() {
51876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
5191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(33316005L).setExtension("1234");
5201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Uses default extension prefix:
521256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("03-331 6005 ext. 1234", phoneUtil.format(nzNumber, PhoneNumberFormat.NATIONAL));
5221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Extension prefix overridden in the territory information for the US:
52376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
5241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6502530000L).setExtension("4567");
525256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("650 253 0000 extn. 4567", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
5261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
5271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
52854923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia  public void testFormatUsingOriginalNumberFormat() throws Exception {
52954923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia    PhoneNumber number1 = phoneUtil.parseAndKeepRawInput("+442087654321", "GB");
5304b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("+44 20 8765 4321", phoneUtil.formatInOriginalFormat(number1, "GB"));
53154923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
53254923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia    PhoneNumber number2 = phoneUtil.parseAndKeepRawInput("02087654321", "GB");
5334b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("(020) 8765 4321", phoneUtil.formatInOriginalFormat(number2, "GB"));
53454923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
53554923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia    PhoneNumber number3 = phoneUtil.parseAndKeepRawInput("011442087654321", "US");
5364b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("011 44 20 8765 4321", phoneUtil.formatInOriginalFormat(number3, "US"));
53754923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
53854923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia    PhoneNumber number4 = phoneUtil.parseAndKeepRawInput("442087654321", "GB");
5394b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("44 20 8765 4321", phoneUtil.formatInOriginalFormat(number4, "GB"));
54054923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
54154923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia    PhoneNumber number5 = phoneUtil.parse("+442087654321", "GB");
5424b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("(020) 8765 4321", phoneUtil.formatInOriginalFormat(number5, "GB"));
54354923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia  }
54454923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
5451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsPremiumRate() {
54676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber premiumRateNumber = new PhoneNumber();
54776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
54876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(1).setNationalNumber(9004433030L);
5491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
55076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
5511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
55276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.clear();
55376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(39).setNationalNumber(892123L);
554f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
55576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
5561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
55776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.clear();
55876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(44).setNationalNumber(9187654321L);
559f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
56076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
5611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
56276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.clear();
56376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(49).setNationalNumber(9001654321L);
5641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
56576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
5661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
56776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.clear();
56876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(49).setNationalNumber(90091234567L);
5691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
57076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
5711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
5721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
5731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsTollFree() {
57476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber tollFreeNumber = new PhoneNumber();
57576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
57676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.setCountryCode(1).setNationalNumber(8881234567L);
5771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
57876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(tollFreeNumber));
5791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
58076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.clear();
58176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.setCountryCode(39).setNationalNumber(803123L);
5821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
58376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(tollFreeNumber));
5841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
58576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.clear();
58676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.setCountryCode(44).setNationalNumber(8012345678L);
5871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
58876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(tollFreeNumber));
5891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
59076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.clear();
59176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.setCountryCode(49).setNationalNumber(8001234567L);
5921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
59376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(tollFreeNumber));
5941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
5951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
5961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsMobile() {
59776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber mobileNumber = new PhoneNumber();
59876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
59976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    // A Bahama mobile number
60076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.setCountryCode(1).setNationalNumber(2423570000L);
6011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE,
60276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(mobileNumber));
6031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
60476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.clear();
60576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.setCountryCode(39).setNationalNumber(312345678L);
6061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE,
60776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(mobileNumber));
6081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
60976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.clear();
61076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.setCountryCode(44).setNationalNumber(7912345678L);
6111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE,
61276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(mobileNumber));
6131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
61476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.clear();
61576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.setCountryCode(49).setNationalNumber(15123456789L);
6161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE,
61776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(mobileNumber));
6181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
61976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.clear();
62076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.setCountryCode(54).setNationalNumber(91187654321L);
6211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE,
62276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(mobileNumber));
6231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
6241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
6251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsFixedLine() {
62676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber fixedLineNumber = new PhoneNumber();
62776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
6281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // A Bahama fixed-line number
62976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineNumber.setCountryCode(1).setNationalNumber(2423651234L);
6301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE,
63176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(fixedLineNumber));
6321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
6331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // An Italian fixed-line number
63476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineNumber.clear();
63576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
6361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE,
63776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(fixedLineNumber));
6381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
63976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineNumber.clear();
64076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineNumber.setCountryCode(44).setNationalNumber(2012345678L);
6411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE,
64276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(fixedLineNumber));
6431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
64476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineNumber.clear();
64576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineNumber.setCountryCode(49).setNationalNumber(301234L);
6461524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE,
64776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(fixedLineNumber));
6481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
6491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
6501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsFixedLineAndMobile() {
65176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber fixedLineAndMobileNumber = new PhoneNumber();
65276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineAndMobileNumber.setCountryCode(1).setNationalNumber(6502531111L);
6531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE_OR_MOBILE,
65476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(fixedLineAndMobileNumber));
6551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
65676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineAndMobileNumber.clear();
65776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    fixedLineAndMobileNumber.setCountryCode(54).setNationalNumber(1987654321L);
6581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE_OR_MOBILE,
65976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(fixedLineAndMobileNumber));
6601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
6611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
6621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsSharedCost() {
66376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
6641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(8431231234L);
66576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.SHARED_COST, phoneUtil.getNumberType(gbNumber));
6661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
6671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
6681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsVoip() {
66976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
6701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(5631231234L);
67176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.VOIP, phoneUtil.getNumberType(gbNumber));
6721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
6731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
6741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsPersonalNumber() {
67576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
6761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(7031231234L);
6771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PERSONAL_NUMBER,
67876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(gbNumber));
6791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
6801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
6811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsUnknown() {
68276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber unknownNumber = new PhoneNumber();
6831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    unknownNumber.setCountryCode(1).setNationalNumber(65025311111L);
6841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.UNKNOWN,
68576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(unknownNumber));
6861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
6871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
6881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsValidNumber() {
68976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
6901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6502530000L);
69176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(usNumber));
6921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
69376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber itNumber = new PhoneNumber();
6941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
69576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(itNumber));
6961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
69776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
6981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(7912345678L);
69976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(gbNumber));
7001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
70176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
7021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(21387835L);
70376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(nzNumber));
7041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsValidForRegion() {
7071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // This number is valid for the Bahamas, but is not a valid US number.
70876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber bsNumber = new PhoneNumber();
70976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    bsNumber.setCountryCode(1).setNationalNumber(2423232345L);
71076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(bsNumber));
71176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(bsNumber, "BS"));
71276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(bsNumber, "bs"));
71376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(bsNumber, "US"));
71476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    bsNumber.setNationalNumber(2421232345L);
7151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // This number is no longer valid.
71676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(bsNumber));
7174b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
718df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // La Mayotte and Reunion use 'leadingDigits' to differentiate them.
7194b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber reNumber = new PhoneNumber();
7204b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    reNumber.setCountryCode(262).setNationalNumber(262123456L);
7214b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(reNumber));
7224b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(reNumber, "RE"));
7234b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(reNumber, "YT"));
7244b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Now change the number to be a number for La Mayotte.
7254b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    reNumber.setNationalNumber(269601234L);
7264b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(reNumber, "YT"));
7274b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(reNumber, "RE"));
728df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // This number is no longer valid for La Reunion.
7294b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    reNumber.setNationalNumber(269123456L);
7304b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(reNumber, "YT"));
7314b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(reNumber, "RE"));
7324b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(reNumber));
7334b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // However, it should be recognised as from La Mayotte, since it is valid for this region.
7344b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals("YT", phoneUtil.getRegionCodeForNumber(reNumber));
7354b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // This number is valid in both places.
7364b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    reNumber.setNationalNumber(800123456L);
7374b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(reNumber, "YT"));
7384b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(reNumber, "RE"));
7391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNotValidNumber() {
74276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
7431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(2530000L);
74476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(usNumber));
7451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
74676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber itNumber = new PhoneNumber();
7471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(23661830000L).setItalianLeadingZero(true);
74876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(itNumber));
7491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
75076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
7511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(791234567L);
75276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(gbNumber));
7531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
75476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber deNumber = new PhoneNumber();
7551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(1234L);
75676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(deNumber));
7571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
75876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
7591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(3316005L);
76076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(nzNumber));
7611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetRegionCodeForCountryCode() {
7641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("US", phoneUtil.getRegionCodeForCountryCode(1));
7651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("GB", phoneUtil.getRegionCodeForCountryCode(44));
7661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("DE", phoneUtil.getRegionCodeForCountryCode(49));
7671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetRegionCodeForNumber() {
77076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber bsNumber = new PhoneNumber();
7711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    bsNumber.setCountryCode(1).setNationalNumber(2423027000L);
77276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals("BS", phoneUtil.getRegionCodeForNumber(bsNumber));
7731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
77476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
7751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6502530000L);
77676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals("US", phoneUtil.getRegionCodeForNumber(usNumber));
7771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
77876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
7791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(7912345678L);
78076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals("GB", phoneUtil.getRegionCodeForNumber(gbNumber));
7811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetCountryCodeForRegion() {
7841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(1, phoneUtil.getCountryCodeForRegion("US"));
7851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(64, phoneUtil.getCountryCodeForRegion("NZ"));
7865c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(64, phoneUtil.getCountryCodeForRegion("nz"));
7877900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals(0, phoneUtil.getCountryCodeForRegion(null));
7887900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals(0, phoneUtil.getCountryCodeForRegion("ZZ"));
7897900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    // CS is already deprecated so the library doesn't support it.
7907900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals(0, phoneUtil.getCountryCodeForRegion("CS"));
7911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
793f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  @SuppressWarnings("deprecation")
794f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testGetNationalDiallingPrefixForRegion() {
795f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals("1", phoneUtil.getNddPrefixForRegion("US", false));
796f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // Test non-main country to see it gets the national dialling prefix for the main country with
797f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // that country calling code.
798f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals("1", phoneUtil.getNddPrefixForRegion("BS", false));
799f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals("0", phoneUtil.getNddPrefixForRegion("NZ", false));
800f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // Test case with non digit in the national prefix.
801f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals("0~0", phoneUtil.getNddPrefixForRegion("AO", false));
802f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals("00", phoneUtil.getNddPrefixForRegion("AO", true));
803f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // Test cases with invalid regions.
804f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(null, phoneUtil.getNddPrefixForRegion(null, false));
805f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(null, phoneUtil.getNddPrefixForRegion("ZZ", false));
806f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // CS is already deprecated so the library doesn't support it.
807f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(null, phoneUtil.getNddPrefixForRegion("CS", false));
808f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  }
809f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia
8107900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia  public void testIsNANPACountry() {
8117900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertTrue(phoneUtil.isNANPACountry("US"));
8127900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertTrue(phoneUtil.isNANPACountry("BS"));
8135c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertTrue(phoneUtil.isNANPACountry("bs"));
8141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
8151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
8161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsPossibleNumber() {
81776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber number = new PhoneNumber();
81876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(6502530000L);
81976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber(number));
8201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
82176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
82276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(2530000L);
82376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber(number));
82476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
82576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
82676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(44).setNationalNumber(2070313000L);
82776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber(number));
8281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
8291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+1 650 253 0000", "US"));
8301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+1 650 GOO OGLE", "US"));
8311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("(650) 253-0000", "US"));
8321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("253-0000", "US"));
8331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+1 650 253 0000", "GB"));
8341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+44 20 7031 3000", "GB"));
8351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("(020) 7031 3000", "GB"));
8361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("7031 3000", "GB"));
8371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("3331 6005", "NZ"));
8385c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("3331 6005", "nz"));
8391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
8401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
8411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsPossibleNumberWithReason() {
8421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // FYI, national numbers for country code +1 that are within 7 to 10 digits are possible.
84376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber number = new PhoneNumber();
84476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(6502530000L);
8451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE,
84676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(number));
8471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
84876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
84976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(2530000L);
8501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE,
85176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(number));
8521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
85376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
85476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(0).setNationalNumber(2530000L);
8551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.INVALID_COUNTRY_CODE,
85676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(number));
8571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
85876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
85976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(253000L);
8601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT,
86176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(number));
8621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
86376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
86476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(65025300000L);
8651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG,
86676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(number));
8674b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
8684b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Try with number that we don't have metadata for.
8694b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber adNumber = new PhoneNumber();
8704b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    adNumber.setCountryCode(376).setNationalNumber(12345L);
8714b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE,
8724b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(adNumber));
8734b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    adNumber.setCountryCode(376).setNationalNumber(13L);
8744b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT,
8754b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(adNumber));
8764b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    adNumber.setCountryCode(376).setNationalNumber(1234567890123456L);
8774b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG,
8784b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(adNumber));
8791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
8801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
8811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNotPossibleNumber() {
88276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber number = new PhoneNumber();
88376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(65025300000L);
88476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber(number));
8851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
88676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
88776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(253000L);
88876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber(number));
8891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
89076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
89176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(44).setNationalNumber(300L);
89276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber(number));
8931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
8941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("+1 650 253 00000", "US"));
8951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("(650) 253-00000", "US"));
8961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("I want a Pizza", "US"));
8971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("253-000", "US"));
8981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("1 3000", "GB"));
8991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("+44 300", "GB"));
9001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
902df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia  public void testTruncateTooLongNumber() {
903df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // US number 650-253-0000, but entered with one additional digit at the end.
904df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber tooLongNumber = new PhoneNumber();
905df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooLongNumber.setCountryCode(1).setNationalNumber(65025300001L);
906df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber validNumber = new PhoneNumber();
907df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumber.setCountryCode(1).setNationalNumber(6502530000L);
908df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
909df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(validNumber, tooLongNumber);
910df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
911df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // GB number 080 1234 5678, but entered with 4 extra digits at the end.
912df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooLongNumber.clear();
913df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooLongNumber.setCountryCode(44).setNationalNumber(80123456780123L);
914df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumber.clear();
915df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumber.setCountryCode(44).setNationalNumber(8012345678L);
916df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
917df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(validNumber, tooLongNumber);
918df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
919df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // IT number 022 3456 7890, but entered with 3 extra digits at the end.
920df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooLongNumber.clear();
921df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooLongNumber.setCountryCode(39).setNationalNumber(2234567890123L).setItalianLeadingZero(true);
922df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumber.clear();
923df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumber.setCountryCode(39).setNationalNumber(2234567890L).setItalianLeadingZero(true);
924df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
925df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(validNumber, tooLongNumber);
926df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
927df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests what happens when a valid number is passed in.
928df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber validNumberCopy = new PhoneNumber();
929df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumberCopy.mergeFrom(validNumber);
930df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(validNumber));
931df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests the number is not modified.
932df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(validNumberCopy, validNumber);
933df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
934df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests what happens when a number with invalid prefix is passed in.
935df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber numberWithInvalidPrefix = new PhoneNumber();
936df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // The test metadata says US numbers cannot have prefix 240.
937df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    numberWithInvalidPrefix.setCountryCode(1).setNationalNumber(2401234567L);
938df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber invalidNumberCopy = new PhoneNumber();
939df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    invalidNumberCopy.mergeFrom(numberWithInvalidPrefix);
940df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertFalse(phoneUtil.truncateTooLongNumber(numberWithInvalidPrefix));
941df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests the number is not modified.
942df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(invalidNumberCopy, numberWithInvalidPrefix);
943df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
944df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests what happens when a too short number is passed in.
945df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber tooShortNumber = new PhoneNumber();
946df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooShortNumber.setCountryCode(1).setNationalNumber(1234L);
947df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber tooShortNumberCopy = new PhoneNumber();
948df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooShortNumberCopy.mergeFrom(tooShortNumber);
949df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertFalse(phoneUtil.truncateTooLongNumber(tooShortNumber));
950df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests the number is not modified.
951df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(tooShortNumberCopy, tooShortNumber);
952df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia  }
953df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
9541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsViablePhoneNumber() {
9551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Only one or two digits before strange non-possible punctuation.
9561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("12. March"));
9571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("1+1+1"));
9581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("80+0"));
9591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("00"));
9601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Three digits is viable.
9611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("111"));
9621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Alpha numbers.
9631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("0800-4-pizza"));
9641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("0800-4-PIZZA"));
9651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Only one or two digits before possible punctuation followed by more digits.
9661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("1\u300034"));
9671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("1\u30003+4"));
9681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Unicode variants of possible starting character and other allowed punctuation/digits.
9691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("\uFF081\uFF09\u30003456789"));
9701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Testing a leading + is okay.
9711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("+1\uFF09\u30003456789"));
9721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testExtractPossibleNumber() {
9751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Removes preceding funky punctuation and letters but leaves the rest untouched.
9761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0800-345-600", PhoneNumberUtil.extractPossibleNumber("Tel:0800-345-600"));
9771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0800 FOR PIZZA", PhoneNumberUtil.extractPossibleNumber("Tel:0800 FOR PIZZA"));
9781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Should not remove plus sign
9791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("+800-345-600", PhoneNumberUtil.extractPossibleNumber("Tel:+800-345-600"));
9801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Should recognise wide digits as possible start values.
9811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\uFF10\uFF12\uFF13",
9821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.extractPossibleNumber("\uFF10\uFF12\uFF13"));
9831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Dashes are not possible start values and should be removed.
9841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\uFF11\uFF12\uFF13",
9851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.extractPossibleNumber("Num-\uFF11\uFF12\uFF13"));
9861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // If not possible number present, return empty string.
9871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("", PhoneNumberUtil.extractPossibleNumber("Num-...."));
9881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Leading brackets are stripped - these are not used when parsing.
9891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000"));
9907900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia
9917900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    // Trailing non-alpha-numeric characters should be removed.
9927900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000..- .."));
9937900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000."));
9947900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    // This case has a trailing RTL char.
9957900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000\u200F"));
9961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testMaybeStripNationalPrefix() {
9991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String nationalPrefix = "34";
10001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    StringBuffer numberToStrip = new StringBuffer("34356778");
10011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String strippedNumber = "356778";
10021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String nationalRuleRegExp = "\\d{4,7}";
10031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    Pattern nationalRule = Pattern.compile(nationalRuleRegExp);
10041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, "", nationalRule);
10051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Should have had national prefix stripped.",
10061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber, numberToStrip.toString());
10071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Retry stripping - now the number should not start with the national prefix, so no more
10081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // stripping should occur.
10091524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, "", nationalRule);
10101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Should have had no change - no national prefix present.",
10111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber, numberToStrip.toString());
10121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Some countries have no national prefix. Repeat test with none specified.
10131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    nationalPrefix = "";
10141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, "", nationalRule);
10151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Should not strip anything with empty national prefix.",
10161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber, numberToStrip.toString());
10171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // If the resultant number doesn't match the national rule, it shouldn't be stripped.
10181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    nationalPrefix = "3";
10191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    numberToStrip = new StringBuffer("3123");
10201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    strippedNumber = "3123";
10211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    phoneUtil.maybeStripNationalPrefix(numberToStrip, nationalPrefix, "", nationalRule);
10221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Should have had no change - after stripping, it wouldn't have matched " +
10231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 "the national rule.",
10241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber, numberToStrip.toString());
10251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
10261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1027f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testMaybeStripInternationalPrefix() {
10281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String internationalPrefix = "00[39]";
10291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    StringBuffer numberToStrip = new StringBuffer("0034567700-3898003");
10301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Note the dash is removed as part of the normalization.
10311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    StringBuffer strippedNumber = new StringBuffer("45677003898003");
10325c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_NUMBER_WITH_IDD,
10335c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
10345c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
10351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied was not stripped of its international prefix.",
10361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
10375c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Now the number no longer starts with an IDD prefix, so it should now report
10385c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // FROM_DEFAULT_COUNTRY.
10395c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_DEFAULT_COUNTRY,
10405c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
10415c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
10421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    numberToStrip = new StringBuffer("00945677003898003");
10445c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_NUMBER_WITH_IDD,
10455c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
10465c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
10471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied was not stripped of its international prefix.",
10481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
10491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test it works when the international prefix is broken up by spaces.
10501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    numberToStrip = new StringBuffer("00 9 45677003898003");
10515c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_NUMBER_WITH_IDD,
10525c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
10535c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
10541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied was not stripped of its international prefix.",
10551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
10565c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Now the number no longer starts with an IDD prefix, so it should now report
10575c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // FROM_DEFAULT_COUNTRY.
10585c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_DEFAULT_COUNTRY,
10595c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
10605c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
10611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test the + symbol is also recognised and stripped.
10631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    numberToStrip = new StringBuffer("+45677003898003");
10641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    strippedNumber = new StringBuffer("45677003898003");
10655c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN,
10665c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
10675c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
10681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied was not stripped of the plus symbol.",
10691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
10701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // If the number afterwards is a zero, we should not strip this - no country code begins with 0.
10721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    numberToStrip = new StringBuffer("0090112-3123");
10731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    strippedNumber = new StringBuffer("00901123123");
10745c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_DEFAULT_COUNTRY,
10755c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
10765c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
10771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied had a 0 after the match so shouldn't be stripped.",
10781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
10791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Here the 0 is separated by a space from the IDD.
10801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    numberToStrip = new StringBuffer("009 0-112-3123");
10815c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_DEFAULT_COUNTRY,
10825c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
10835c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
10841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
10851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testMaybeExtractCountryCode() {
108776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber number = new PhoneNumber();
10887900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForRegion("US");
10891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Note that for the US, the IDD is 011.
10901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
10911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "011112-3456789";
10921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String strippedNumber = "123456789";
10931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      int countryCode = 1;
10941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      StringBuffer numberToFill = new StringBuffer();
10951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Did not extract country code " + countryCode + " correctly.",
10961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   countryCode,
10975c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
10985c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
10995c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
11005c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_NUMBER_WITH_IDD, number.getCountryCodeSource());
11011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Should strip and normalize national significant number.
11021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Did not strip off the country code correctly.",
11031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   strippedNumber,
11041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   numberToFill.toString());
11051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
11061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
11071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
11085c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
11091524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
11101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "+6423456789";
11111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      int countryCode = 64;
11121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      StringBuffer numberToFill = new StringBuffer();
11131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Did not extract country code " + countryCode + " correctly.",
11141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   countryCode,
11155c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
11165c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
11175c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
11185c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN, number.getCountryCodeSource());
11191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
11201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
11211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
11225c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
11231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
11241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "2345-6789";
11251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      StringBuffer numberToFill = new StringBuffer();
11261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Should not have extracted a country code - no international prefix present.",
11271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   0,
11285c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
11295c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
1130f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
11315c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_DEFAULT_COUNTRY, number.getCountryCodeSource());
11321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
11331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
11341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
11355c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
11361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
11371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "0119991123456789";
11381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      StringBuffer numberToFill = new StringBuffer();
11395c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true, number);
11401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should have thrown an exception, no valid country code present.");
11411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
11421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected.
11431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
11441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
11451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
11461524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
11475c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
11481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
11491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "(1 610) 619 4466";
11501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      int countryCode = 1;
11511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      StringBuffer numberToFill = new StringBuffer();
11521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Should have extracted the country code of the region passed in",
11531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   countryCode,
11545c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
11555c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
11565c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
11575c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN,
11585c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   number.getCountryCodeSource());
11591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
11601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
11611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
11625c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
11635c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    try {
11645c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      String phoneNumber = "(1 610) 619 4466";
11655c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      int countryCode = 1;
11665c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      StringBuffer numberToFill = new StringBuffer();
11675c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Should have extracted the country code of the region passed in",
11685c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   countryCode,
11695c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, false,
11705c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
11715c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertFalse("Should not contain CountryCodeSource.", number.hasCountryCodeSource());
11725c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    } catch (NumberParseException e) {
11735c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
11745c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    }
11755c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
11761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
11771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "(1 610) 619 446";
11781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      StringBuffer numberToFill = new StringBuffer();
11791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Should not have extracted a country code - invalid number after extraction " +
11801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   "of uncertain country code.",
11811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   0,
11825c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, false,
11835c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
11845c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertFalse("Should not contain CountryCodeSource.", number.hasCountryCodeSource());
11851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
11861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
11871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
11885c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
11891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
1190df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia      String phoneNumber = "(1 610) 619 43";
11911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      StringBuffer numberToFill = new StringBuffer();
11921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Should not have extracted a country code - invalid number both before and " +
11931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   "after extraction of uncertain country code.",
11941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   0,
11955c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
11965c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
11975c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
11985c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_DEFAULT_COUNTRY, number.getCountryCodeSource());
11991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
12001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
12011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
12021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
12031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
12041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testParseNationalNumber() throws Exception {
120576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
120676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(33316005L);
12071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
12081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // National prefix attached.
12091524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("033316005", "NZ"));
12105c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("033316005", "nz"));
12111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("33316005", "NZ"));
12121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // National prefix attached and some formatting present.
12131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03-331 6005", "NZ"));
12141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03 331 6005", "NZ"));
12151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
12161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Testing international prefixes.
12171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Should strip country code.
12181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("0064 3 331 6005", "NZ"));
12191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Try again, but this time we have an international number with Region Code US. It should
12201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // recognise the country code and parse accordingly.
12211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("01164 3 331 6005", "US"));
12221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("+64 3 331 6005", "US"));
12231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
122476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.clear();
122576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(64123456L);
122676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("64(0)64123456", "NZ"));
12275c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Check that using a "/" is fine in a phone number.
122876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber deNumber = new PhoneNumber();
122976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(12345678L);
12305c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(deNumber, phoneUtil.parse("123/45678", "DE"));
12315c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
123276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
12335c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Check it doesn't use the '1' as a country code when parsing if the phone number was already
12345c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // possible.
123576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(1234567890L);
12365c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(usNumber, phoneUtil.parse("123-456-7890", "US"));
12375c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
12385c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1239f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testParseNumberWithAlphaCharacters() throws Exception {
12405c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Test case with alpha characters.
124176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber tollfreeNumber = new PhoneNumber();
124276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollfreeNumber.setCountryCode(64).setNationalNumber(800332005L);
1243f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(tollfreeNumber, phoneUtil.parse("0800 DDA 005", "NZ"));
124476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber premiumNumber = new PhoneNumber();
124576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumNumber.setCountryCode(64).setNationalNumber(9003326005L);
12465c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 DDA 6005", "NZ"));
12475c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Not enough alpha characters for them to be considered intentional, so they are stripped.
12485c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 332 6005a", "NZ"));
12495c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 332 600a5", "NZ"));
12505c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 332 600A5", "NZ"));
12515c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 a332 600A5", "NZ"));
12525c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
12531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
12545c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseWithInternationalPrefixes() throws Exception {
125576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
125676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6503336000L);
12571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usNumber, phoneUtil.parse("+1 (650) 333-6000", "NZ"));
12581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usNumber, phoneUtil.parse("1-650-333-6000", "US"));
12591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Calling the US number from Singapore by using different service providers
12601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // 1st test: calling using SingTel IDD service (IDD is 001)
12611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usNumber, phoneUtil.parse("0011-650-333-6000", "SG"));
12621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // 2nd test: calling using StarHub IDD service (IDD is 008)
12631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usNumber, phoneUtil.parse("0081-650-333-6000", "SG"));
12641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // 3rd test: calling using SingTel V019 service (IDD is 019)
12651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usNumber, phoneUtil.parse("0191-650-333-6000", "SG"));
12661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Calling the US number from Poland
12671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usNumber, phoneUtil.parse("0~01-650-333-6000", "PL"));
1268256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    // Using "++" at the start.
1269256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals(usNumber, phoneUtil.parse("++1 (650) 333-6000", "PL"));
1270256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    // Using a full-width plus sign.
1271256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals(usNumber, phoneUtil.parse("\uFF0B1 (650) 333-6000", "SG"));
1272256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    // The whole number, including punctuation, is here represented in full-width form.
1273256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals(usNumber, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
1274256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                                           "\u3000\uFF13\uFF13\uFF13\uFF0D\uFF16\uFF10\uFF10\uFF10",
1275256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                                           "SG"));
12765c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
12771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
12785c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseWithLeadingZero() throws Exception {
127976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber itNumber = new PhoneNumber();
128076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(236618300L).setItalianLeadingZero(true);
12811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(itNumber, phoneUtil.parse("+39 02-36618 300", "NZ"));
12821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(itNumber, phoneUtil.parse("02-36618 300", "IT"));
12831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
128476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    itNumber.clear();
128576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    itNumber.setCountryCode(39).setNationalNumber(312345678L);
128676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(itNumber, phoneUtil.parse("312 345 678", "IT"));
12875c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
12881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
12895c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseNationalNumberArgentina() throws Exception {
12901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test parsing mobile numbers of Argentina.
129176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber arNumber = new PhoneNumber();
129276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
129376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(93435551212L);
12941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 9 343 555 1212", "AR"));
12951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("0343 15 555 1212", "AR"));
12961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
129776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.clear();
129876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(93715654320L);
129976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 9 3715 65 4320", "AR"));
130076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("03715 15 65 4320", "AR"));
13011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
13021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test parsing fixed-line numbers of Argentina.
130376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.clear();
130476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(1137970000L);
130576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 11 3797 0000", "AR"));
130676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("011 3797 0000", "AR"));
13071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
130876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.clear();
130976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(3715654321L);
131076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 3715 65 4321", "AR"));
131176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("03715 65 4321", "AR"));
13121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
131376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.clear();
131476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(2312340000L);
131576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 23 1234 0000", "AR"));
131676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("023 1234 0000", "AR"));
13175c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
13181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
13195c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseWithXInNumber() throws Exception {
13201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test that having an 'x' in the phone number at the start is ok and that it just gets removed.
132176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber arNumber = new PhoneNumber();
132276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(123456789L);
132376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("0123456789", "AR"));
132476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("(0) 123456789", "AR"));
132576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("0 123456789", "AR"));
132676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(arNumber, phoneUtil.parse("(0xx) 123456789", "AR"));
132776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber arFromUs = new PhoneNumber();
132876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arFromUs.setCountryCode(54).setNationalNumber(81429712L);
13291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // This test is intentionally constructed such that the number of digit after xx is larger than
13301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // 7, so that the number won't be mistakenly treated as an extension, as we allow extensions up
13311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // to 7 digits. This assumption is okay for now as all the countries where a carrier selection
13321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // code is written in the form of xx have a national significant number of length larger than 7.
13331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(arFromUs, phoneUtil.parse("011xx5481429712", "US"));
13345c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
13351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
13365c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseNumbersMexico() throws Exception {
13371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test parsing fixed-line numbers of Mexico.
133876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber mxNumber = new PhoneNumber();
133976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mxNumber.setCountryCode(52).setNationalNumber(4499780001L);
13401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("+52 (449)978-0001", "MX"));
13411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("01 (449)978-0001", "MX"));
13421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("(449)978-0001", "MX"));
13431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
13441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test parsing mobile numbers of Mexico.
134576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mxNumber.clear();
134676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mxNumber.setCountryCode(52).setNationalNumber(13312345678L);
134776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("+52 1 33 1234-5678", "MX"));
134876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("044 (33) 1234-5678", "MX"));
134976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("045 33 1234-5678", "MX"));
13501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
13511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
13521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFailedParseOnInvalidNumbers() {
13531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
13541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String sentencePhoneNumber = "This is not a phone number";
13551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(sentencePhoneNumber, "NZ");
13561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("This should not parse without throwing an exception " + sentencePhoneNumber);
13571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
13581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
13591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
13601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.NOT_A_NUMBER,
13611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
13621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
13631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
13641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String tooLongPhoneNumber = "01495 72553301873 810104";
13651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(tooLongPhoneNumber, "GB");
13661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("This should not parse without throwing an exception " + tooLongPhoneNumber);
13671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
13681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
13691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
13701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_LONG,
13711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
13721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
13731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
13744b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      String plusMinusPhoneNumber = "+---";
13754b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      phoneUtil.parse(plusMinusPhoneNumber, "DE");
13764b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      fail("This should not parse without throwing an exception " + plusMinusPhoneNumber);
13774b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    } catch (NumberParseException e) {
13784b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      // Expected this exception.
13794b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
13804b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   NumberParseException.ErrorType.NOT_A_NUMBER,
13814b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   e.getErrorType());
13824b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    }
13834b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    try {
13841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String tooShortPhoneNumber = "+49 0";
13851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(tooShortPhoneNumber, "DE");
13861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("This should not parse without throwing an exception " + tooShortPhoneNumber);
13871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
13881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
13891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
13901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_NSN,
13911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
13921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
13931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
13941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String invalidCountryCode = "+210 3456 56789";
13951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(invalidCountryCode, "NZ");
13961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("This is not a recognised country code: should fail: " + invalidCountryCode);
13971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
13981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
13991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
14011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
14021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "123 456 7890";
1405be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia      phoneUtil.parse(someNumber, "YY");
14061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("'Unknown' country code not allowed: should fail.");
14071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
14091524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
14111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
14121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "123 456 7890";
14154b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      phoneUtil.parse(someNumber, "CS");
14164b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      fail("Deprecated country code not allowed: should fail.");
14174b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    } catch (NumberParseException e) {
14184b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      // Expected this exception.
14194b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14204b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
14214b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   e.getErrorType());
14224b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    }
14234b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    try {
14244b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      String someNumber = "123 456 7890";
14251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(someNumber, null);
14261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Null country code not allowed: should fail.");
14271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
14291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
14311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
14321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "0044------";
14351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(someNumber, "GB");
14361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("No number provided, only country code: should fail");
14371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
14391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
14411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
14421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "0044";
14451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(someNumber, "GB");
14461524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("No number provided, only country code: should fail");
14471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
14491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
14511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
14521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "011";
14551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(someNumber, "US");
14561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Only IDD provided - should fail.");
14571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
14591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
14611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
14621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "0119";
14651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(someNumber, "US");
14661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Only IDD provided and then 9 - should fail.");
14671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
14691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
14711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
14721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
1473256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    try {
1474256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      String emptyNumber = "";
1475256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      // Invalid region.
1476256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      phoneUtil.parse(emptyNumber, "ZZ");
1477256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      fail("Empty string - should fail.");
1478256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    } catch (NumberParseException e) {
1479256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      // Expected this exception.
1480256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      assertEquals("Wrong error type stored in exception.",
1481256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                   NumberParseException.ErrorType.NOT_A_NUMBER,
1482256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                   e.getErrorType());
1483256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    }
14841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
14851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
14864b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia  public void testParseNumbersWithPlusWithNoRegion() throws Exception {
14874b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
14884b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(33316005L);
14894b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // "ZZ" is allowed only if the number starts with a '+' - then the country code can be
14904b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // calculated.
14914b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("+64 3 331 6005", "ZZ"));
14924b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("+64 3 331 6005", null));
14934b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    nzNumber.setRawInput("+64 3 331 6005").
14944b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN);
14954b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parseAndKeepRawInput("+64 3 331 6005", "ZZ"));
14964b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Null is also allowed for the region code in these cases.
14974b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parseAndKeepRawInput("+64 3 331 6005", null));
14984b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia  }
14994b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
15001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testParseExtensions() throws Exception {
150176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
150276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(33316005L).setExtension("3456");
15031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03 331 6005 ext 3456", "NZ"));
15041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03-3316005x3456", "NZ"));
15051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03-3316005 int.3456", "NZ"));
15061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03 3316005 #3456", "NZ"));
15071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test the following do not extract extensions:
150876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nonExtnNumber = new PhoneNumber();
1509df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    nonExtnNumber.setCountryCode(1).setNationalNumber(80074935247L);
15101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nonExtnNumber, phoneUtil.parse("1800 six-flags", "US"));
15111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nonExtnNumber, phoneUtil.parse("1800 SIX FLAGS", "US"));
1512df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(nonExtnNumber, phoneUtil.parse("0~0 1800 7493 5247", "PL"));
15131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(nonExtnNumber, phoneUtil.parse("(1800) 7493.5247", "US"));
15141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Check that the last instance of an extension token is matched.
151576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber extnNumber = new PhoneNumber();
1516df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    extnNumber.setCountryCode(1).setNationalNumber(80074935247L).setExtension("1234");
1517df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(extnNumber, phoneUtil.parse("0~0 1800 7493 5247 ~1234", "PL"));
15181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Verifying bug-fix where the last digit of a number was previously omitted if it was a 0 when
15191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // extracting the extension. Also verifying a few different cases of extensions.
152076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber ukNumber = new PhoneNumber();
152176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    ukNumber.setCountryCode(44).setNationalNumber(2034567890L).setExtension("456");
15221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890x456", "NZ"));
15231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890x456", "GB"));
15241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 x456", "GB"));
15251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X456", "GB"));
15261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X 456", "GB"));
15271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X  456", "GB"));
15281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 x 456  ", "GB"));
15291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890  X 456", "GB"));
15301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
153176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usWithExtension = new PhoneNumber();
153276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usWithExtension.setCountryCode(1).setNationalNumber(8009013355L).setExtension("7246433");
15331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 x 7246433", "US"));
15341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 , ext 7246433", "US"));
15351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usWithExtension,
15361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.parse("(800) 901-3355 ,extension 7246433", "US"));
15371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 , 7246433", "US"));
15381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 ext: 7246433", "US"));
15395c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
15405c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Test that if a number has two extensions specified, we ignore the second.
154176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usWithTwoExtensionsNumber = new PhoneNumber();
154276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usWithTwoExtensionsNumber.setCountryCode(1).setNationalNumber(2121231234L).setExtension("508");
15435c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508/x1234",
15445c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                            "US"));
15455c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508/ x1234",
15465c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                            "US"));
15475c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508\\x1234",
15485c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                            "US"));
15495c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
15505c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Test parsing numbers in the form (645) 123-1234-910# works, where the last 3 digits before
15515c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // the # are an extension.
155276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usWithExtension.clear();
155376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usWithExtension.setCountryCode(1).setNationalNumber(6451231234L).setExtension("910");
155476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("+1 (645) 123 1234-910#", "US"));
15557c2324a9b0c98842a8f34ee79226c6606f843aafShaopeng Jia    // Retry with the same number in a slightly different format.
15567c2324a9b0c98842a8f34ee79226c6606f843aafShaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("+1 (645) 123 1234 ext. 910#", "US"));
15571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
15581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
15597900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia  public void testParseAndKeepRaw() throws Exception {
156076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber alphaNumericNumber = new PhoneNumber();
156176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    alphaNumericNumber.
1562df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia        setCountryCode(1).setNationalNumber(80074935247L).setRawInput("800 six-flags").
156376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_DEFAULT_COUNTRY);
156476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(alphaNumericNumber,
1565df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia                 phoneUtil.parseAndKeepRawInput("800 six-flags", "US"));
15665c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
156776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    alphaNumericNumber.
156876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCode(1).setNationalNumber(8007493524L).setRawInput("1800 six-flag").
156976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN);
157076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(alphaNumericNumber,
15715c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.parseAndKeepRawInput("1800 six-flag", "US"));
15725c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
157376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    alphaNumericNumber.
157476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCode(1).setNationalNumber(8007493524L).setRawInput("+1800 six-flag").
157576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN);
157676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(alphaNumericNumber,
1577be1af2f8b62d5435eca48f3dd5c82e3d2c9bfa17Shaopeng Jia                 phoneUtil.parseAndKeepRawInput("+1800 six-flag", "NZ"));
15785c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
157976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    alphaNumericNumber.
158076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCode(1).setNationalNumber(8007493524L).setRawInput("001800 six-flag").
158176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITH_IDD);
158276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(alphaNumericNumber,
15835c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.parseAndKeepRawInput("001800 six-flag", "NZ"));
15844b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
15854b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Invalid region code supplied.
15864b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    try {
15874b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      phoneUtil.parseAndKeepRawInput("123 456 7890", "CS");
15884b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      fail("Deprecated country code not allowed: should fail.");
15894b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    } catch (NumberParseException e) {
15904b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      // Expected this exception.
15914b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
15924b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
15934b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   e.getErrorType());
15944b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    }
15957900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia  }
15967900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia
15971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testCountryWithNoNumberDesc() {
15985c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Andorra is a country where we don't have PhoneNumberDesc info in the metadata.
159976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber adNumber = new PhoneNumber();
160076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    adNumber.setCountryCode(376).setNationalNumber(12345L);
1601256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+376 12345", phoneUtil.format(adNumber, PhoneNumberFormat.INTERNATIONAL));
1602256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+37612345", phoneUtil.format(adNumber, PhoneNumberFormat.E164));
1603256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("12345", phoneUtil.format(adNumber, PhoneNumberFormat.NATIONAL));
1604f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.UNKNOWN, phoneUtil.getNumberType(adNumber));
16051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(adNumber));
16061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
16071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test dialing a US number from within Andorra.
160876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
160976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(6502530000L);
16101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00 1 650 253 0000",
16111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(usNumber, "AD"));
16121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
16131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
16141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testUnknownCountryCallingCodeForValidation() {
161576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber invalidNumber = new PhoneNumber();
16161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    invalidNumber.setCountryCode(0).setNationalNumber(1234L);
161776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(invalidNumber));
16181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
16191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
16201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNumberMatchMatches() throws Exception {
16211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test simple matches where formatting is different, or leading zeroes, or country code has
16221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // been specified.
16231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
16241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331 6005", "+64 03 331 6005"));
16251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
16261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 03 331-6005", "+64 03331 6005"));
16271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
16281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+643 331-6005", "+64033316005"));
16291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
16301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+643 331-6005", "+6433316005"));
16311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
16321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "+6433316005"));
16331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test alpha numbers.
16341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
16351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+1800 siX-Flags", "+1 800 7493 5247"));
16361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test numbers with extensions.
16371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
16381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "+6433316005#1234"));
16391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test proto buffers.
164076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
164176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(33316005L).setExtension("3456");
16421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
16431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch(nzNumber, "+643 331 6005 ext 3456"));
164476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.clearExtension();
16451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
164676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isNumberMatch(nzNumber, "+6403 331 6005"));
16471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Check empty extensions are ignored.
164876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setExtension("");
16491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
165076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isNumberMatch(nzNumber, "+6403 331 6005"));
16511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Check variant with two proto buffers.
165276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumberTwo = new PhoneNumber();
165376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumberTwo.setCountryCode(64).setNationalNumber(33316005L);
165476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals("Number " + nzNumber.toString() + " did not match " + nzNumberTwo.toString(),
16551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.MatchType.EXACT_MATCH,
165676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isNumberMatch(nzNumber, nzNumberTwo));
16571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
16581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
16591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNumberMatchNonMatches() throws Exception {
16601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Non-matches.
16611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
16621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("03 331 6005", "03 331 6006"));
16631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Different country code, partial number match.
16641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
16651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "+16433316005"));
16661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Different country code, same number.
16671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
16681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "+6133316005"));
16691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Extension different, all else the same.
16701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
16711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "0116433316005#1235"));
16721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // NSN matches, but extension is different - not the same number.
16731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
16741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005 ext.1235", "3 331 6005#1234"));
16751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
16761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
16771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNumberMatchNsnMatches() throws Exception {
16781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // NSN matches.
16791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
16801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "03 331 6005"));
16811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
16821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("3 331-6005", "03 331 6005"));
168376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
168476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(33316005L).setExtension("");
16851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
16861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch(nzNumber, "03 331 6005"));
168776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber unchangedNzNumber = new PhoneNumber();
168876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    unchangedNzNumber.setCountryCode(64).setNationalNumber(33316005L).setExtension("");
16891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Check the phone number proto was not edited during the method call.
16901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(unchangedNzNumber, nzNumber);
16911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
16921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
16931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNumberMatchShortNsnMatches() throws Exception {
16941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Short NSN matches with the country not specified for either one or both numbers.
16951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
16961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "331 6005"));
16971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
16981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("3 331-6005", "331 6005"));
16991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
17001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("3 331-6005", "+64 331 6005"));
17011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Short NSN match with the country specified.
17021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
17031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("03 331-6005", "331 6005"));
17041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
17051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("1 234 345 6789", "345 6789"));
17061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
17071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+1 (234) 345 6789", "345 6789"));
17081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // NSN matches, country code omitted for one number, extension missing for one.
17091524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
17101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "3 331 6005#1234"));
17111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // One has Italian leading zero, one does not.
171276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber italianNumberOne = new PhoneNumber();
171376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    italianNumberOne.setCountryCode(39).setNationalNumber(1234L).setItalianLeadingZero(true);
171476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber italianNumberTwo = new PhoneNumber();
171576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    italianNumberTwo.setCountryCode(39).setNationalNumber(1234L);
17161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
171776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isNumberMatch(italianNumberOne, italianNumberTwo));
17181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // One has an extension, the other has an extension of "".
171976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    italianNumberOne.setExtension("1234").clearItalianLeadingZero();
172076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    italianNumberTwo.setExtension("");
17211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
172276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isNumberMatch(italianNumberOne, italianNumberTwo));
17231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
17241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia}
1725