11524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia/*
2ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia * Copyright (C) 2009 The Libphonenumber Authors
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
1793f6965c2c041ac707bf1b3bcf5a3f60e452f421Shaopeng Jiapackage com.android.i18n.phonenumbers;
181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1993f6965c2c041ac707bf1b3bcf5a3f60e452f421Shaopeng Jiaimport com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
2093f6965c2c041ac707bf1b3bcf5a3f60e452f421Shaopeng Jiaimport com.android.i18n.phonenumbers.Phonemetadata.NumberFormat;
2193f6965c2c041ac707bf1b3bcf5a3f60e452f421Shaopeng Jiaimport com.android.i18n.phonenumbers.Phonemetadata.PhoneMetadata;
2293f6965c2c041ac707bf1b3bcf5a3f60e452f421Shaopeng Jiaimport com.android.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc;
2393f6965c2c041ac707bf1b3bcf5a3f60e452f421Shaopeng Jiaimport com.android.i18n.phonenumbers.Phonenumber.PhoneNumber;
2493f6965c2c041ac707bf1b3bcf5a3f60e452f421Shaopeng Jiaimport com.android.i18n.phonenumbers.Phonenumber.PhoneNumber.CountryCodeSource;
25f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia
261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport java.util.ArrayList;
271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jiaimport java.util.List;
281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia/**
301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * Unit tests for PhoneNumberUtil.java
311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia *
32b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia * Note that these tests use the test metadata, not the normal metadata file, so should not be used
33b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia * for regression test purposes - these tests are illustrative only and test functionality.
341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia *
351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * @author Shaopeng Jia
361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia * @author Lara Rennie
371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia */
38b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jiapublic class PhoneNumberUtilTest extends TestMetadataTestCase {
3952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  // Set up some test numbers to re-use.
4052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber ALPHA_NUMERIC_NUMBER =
4152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(80074935247L);
4252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber AR_MOBILE =
4352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(54).setNationalNumber(91187654321L);
4452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber AR_NUMBER =
4552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(54).setNationalNumber(1187654321);
4652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber AU_NUMBER =
4752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(61).setNationalNumber(236618300L);
4852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber BS_MOBILE =
4952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(2423570000L);
5052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber BS_NUMBER =
5152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(2423651234L);
5252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  // Note that this is the same as the example number for DE in the metadata.
5352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber DE_NUMBER =
5452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(49).setNationalNumber(30123456L);
5552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber DE_SHORT_NUMBER =
5652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(49).setNationalNumber(1234L);
5752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber GB_MOBILE =
5852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(44).setNationalNumber(7912345678L);
5952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber GB_NUMBER =
6052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(44).setNationalNumber(2070313000L);
6152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber IT_MOBILE =
6252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(39).setNationalNumber(345678901L);
6352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber IT_NUMBER =
6452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(39).setNationalNumber(236618300L).
6552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      setItalianLeadingZero(true);
6696a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia  private static final PhoneNumber JP_STAR_NUMBER =
6796a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia      new PhoneNumber().setCountryCode(81).setNationalNumber(2345);
68372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  // Numbers to test the formatting rules from Mexico.
69372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  private static final PhoneNumber MX_MOBILE1 =
70372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      new PhoneNumber().setCountryCode(52).setNationalNumber(12345678900L);
71372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  private static final PhoneNumber MX_MOBILE2 =
72372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      new PhoneNumber().setCountryCode(52).setNationalNumber(15512345678L);
73372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  private static final PhoneNumber MX_NUMBER1 =
74372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      new PhoneNumber().setCountryCode(52).setNationalNumber(3312345678L);
75372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  private static final PhoneNumber MX_NUMBER2 =
76372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      new PhoneNumber().setCountryCode(52).setNationalNumber(8211234567L);
7752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber NZ_NUMBER =
7852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(64).setNationalNumber(33316005L);
7952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber SG_NUMBER =
8052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(65).setNationalNumber(65218000L);
8152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  // A too-long and hence invalid US number.
8252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber US_LONG_NUMBER =
8352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(65025300001L);
8452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber US_NUMBER =
8552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(6502530000L);
8652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber US_PREMIUM =
8752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(9002530000L);
8852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  // Too short, but still possible US numbers.
8952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber US_LOCAL_NUMBER =
9052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(2530000L);
9152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber US_SHORT_BY_ONE_NUMBER =
9252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(650253000L);
9352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  private static final PhoneNumber US_TOLLFREE =
9452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(8002530000L);
95082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia  private static final PhoneNumber US_SPOOF =
96082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(0L);
97082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia  private static final PhoneNumber US_SPOOF_WITH_RAW_INPUT =
98082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia      new PhoneNumber().setCountryCode(1).setNationalNumber(0L)
99082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia          .setRawInput("000-000-0000");
100528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia  private static final PhoneNumber INTERNATIONAL_TOLL_FREE =
101528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia      new PhoneNumber().setCountryCode(800).setNationalNumber(12345678L);
102bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia  // We set this to be the same length as numbers for the other non-geographical country prefix that
103bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia  // we have in our test metadata. However, this is not considered valid because they differ in
104bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia  // their country calling code.
105528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia  private static final PhoneNumber INTERNATIONAL_TOLL_FREE_TOO_LONG =
106bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia      new PhoneNumber().setCountryCode(800).setNationalNumber(123456789L);
107bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia  private static final PhoneNumber UNIVERSAL_PREMIUM_RATE =
108bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia      new PhoneNumber().setCountryCode(979).setNationalNumber(123456789L);
10952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
110372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  public void testGetSupportedRegions() {
111372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertTrue(phoneUtil.getSupportedRegions().size() > 0);
112372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  }
113372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
114f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testGetInstanceLoadUSMetadata() {
11552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.US);
116528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("US", metadata.getId());
1171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(1, metadata.getCountryCode());
1181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011", metadata.getInternationalPrefix());
119df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(metadata.hasNationalPrefix());
120372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals(2, metadata.numberFormatSize());
1211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("(\\d{3})(\\d{3})(\\d{4})",
122d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia                 metadata.getNumberFormat(1).getPattern());
123d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia    assertEquals("$1 $2 $3", metadata.getNumberFormat(1).getFormat());
124f7e0224b862054893f28d2736b3f6804d9935886Shaopeng Jia    assertEquals("[13-689]\\d{9}|2[0-35-9]\\d{8}",
1251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getGeneralDesc().getNationalNumberPattern());
126372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("\\d{7}(?:\\d{3})?", metadata.getGeneralDesc().getPossibleNumberPattern());
1275724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    assertTrue(metadata.getGeneralDesc().exactlySameAs(metadata.getFixedLine()));
1281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern());
1291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("900\\d{7}", metadata.getPremiumRate().getNationalNumberPattern());
1301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // No shared-cost data is available, so it should be initialised to "NA".
1311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("NA", metadata.getSharedCost().getNationalNumberPattern());
1321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("NA", metadata.getSharedCost().getPossibleNumberPattern());
1331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
1341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetInstanceLoadDEMetadata() {
13652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.DE);
137528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("DE", metadata.getId());
1381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(49, metadata.getCountryCode());
1391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00", metadata.getInternationalPrefix());
1401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0", metadata.getNationalPrefix());
141372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals(6, metadata.numberFormatSize());
142372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals(1, metadata.getNumberFormat(5).leadingDigitsPatternSize());
14352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("900", metadata.getNumberFormat(5).getLeadingDigitsPattern(0));
144df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals("(\\d{3})(\\d{3,4})(\\d{4})",
14552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 metadata.getNumberFormat(5).getPattern());
14652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("$1 $2 $3", metadata.getNumberFormat(5).getFormat());
147f7e0224b862054893f28d2736b3f6804d9935886Shaopeng Jia    assertEquals("(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:[1-9]\\d|0[2-9]))\\d{1,8}",
1481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getFixedLine().getNationalNumberPattern());
1491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\\d{2,14}", metadata.getFixedLine().getPossibleNumberPattern());
1501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("30123456", metadata.getFixedLine().getExampleNumber());
1511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\\d{10}", metadata.getTollFree().getPossibleNumberPattern());
1521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("900([135]\\d{6}|9\\d{7})", metadata.getPremiumRate().getNationalNumberPattern());
1531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
1541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetInstanceLoadARMetadata() {
15652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.AR);
157528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("AR", metadata.getId());
1581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(54, metadata.getCountryCode());
1591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00", metadata.getInternationalPrefix());
1601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0", metadata.getNationalPrefix());
1611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0(?:(11|343|3715)15)?", metadata.getNationalPrefixForParsing());
1621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("9$1", metadata.getNationalPrefixTransformRule());
163372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("$2 15 $3-$4", metadata.getNumberFormat(2).getFormat());
164372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("(9)(\\d{4})(\\d{2})(\\d{4})",
1651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getNumberFormat(3).getPattern());
1661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("(9)(\\d{4})(\\d{2})(\\d{4})",
1671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 metadata.getIntlNumberFormat(3).getPattern());
1681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("$1 $2 $3 $4", metadata.getIntlNumberFormat(3).getFormat());
1691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
1701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
171528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia  public void testGetInstanceLoadInternationalTollFreeMetadata() {
172528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForNonGeographicalRegion(800);
173528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("001", metadata.getId());
174528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(800, metadata.getCountryCode());
175528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("$1 $2", metadata.getNumberFormat(0).getFormat());
176528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("(\\d{4})(\\d{4})", metadata.getNumberFormat(0).getPattern());
177528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("12345678", metadata.getGeneralDesc().getExampleNumber());
178528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("12345678", metadata.getTollFree().getExampleNumber());
179528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia  }
180528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
181372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  public void testIsLeadingZeroPossible() {
182372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertTrue(phoneUtil.isLeadingZeroPossible(39));  // Italy
183372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertFalse(phoneUtil.isLeadingZeroPossible(1));  // USA
184528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertFalse(phoneUtil.isLeadingZeroPossible(800));  // International toll free numbers
185528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertFalse(phoneUtil.isLeadingZeroPossible(888));  // Not in metadata file, just default to
186372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                                                        // false.
187372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  }
188372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
1895c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testGetLengthOfGeographicalAreaCode() {
1905c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google MTV, which has area code "650".
19152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(3, phoneUtil.getLengthOfGeographicalAreaCode(US_NUMBER));
1925c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1935c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // A North America toll-free number, which has no area code.
19452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(US_TOLLFREE));
1955c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1965c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google London, which has area code "20".
19752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(GB_NUMBER));
1985c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1995c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // A UK mobile phone, which has no area code.
20052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(GB_MOBILE));
2015c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
2025c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google Buenos Aires, which has area code "11".
20352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(AR_NUMBER));
2045c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
2055c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google Sydney, which has area code "2".
20652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(1, phoneUtil.getLengthOfGeographicalAreaCode(AU_NUMBER));
2075c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
208b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    // Italian numbers - there is no national prefix, but it still has an area code.
209b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    assertEquals(2, phoneUtil.getLengthOfGeographicalAreaCode(IT_NUMBER));
210b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia
2115c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Google Singapore. Singapore has no area code and no national prefix.
21252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(SG_NUMBER));
21352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
21452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // An invalid US number (1 digit shorter), which has no area code.
21552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(US_SHORT_BY_ONE_NUMBER));
216528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
217528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // An international toll free number, which has no area code.
218528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(0, phoneUtil.getLengthOfGeographicalAreaCode(INTERNATIONAL_TOLL_FREE));
2195c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
2205c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
22174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia  public void testGetLengthOfNationalDestinationCode() {
22274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Google MTV, which has national destination code (NDC) "650".
22352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(US_NUMBER));
22474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
22574aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // A North America toll-free number, which has NDC "800".
22652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(US_TOLLFREE));
22774aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
22874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Google London, which has NDC "20".
22952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(2, phoneUtil.getLengthOfNationalDestinationCode(GB_NUMBER));
23074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
23152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // A UK mobile phone, which has NDC "7912".
23252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(GB_MOBILE));
23374aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
23474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Google Buenos Aires, which has NDC "11".
23552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(2, phoneUtil.getLengthOfNationalDestinationCode(AR_NUMBER));
23674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
23774aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // An Argentinian mobile which has NDC "911".
23852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(3, phoneUtil.getLengthOfNationalDestinationCode(AR_MOBILE));
23974aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
24074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Google Sydney, which has NDC "2".
24152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(1, phoneUtil.getLengthOfNationalDestinationCode(AU_NUMBER));
24274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
24374aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Google Singapore, which has NDC "6521".
24452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(SG_NUMBER));
24574aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
24674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // An invalid US number (1 digit shorter), which has no NDC.
24752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(0, phoneUtil.getLengthOfNationalDestinationCode(US_SHORT_BY_ONE_NUMBER));
24874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
249372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // A number containing an invalid country calling code, which shouldn't have any NDC.
25052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber number = new PhoneNumber().setCountryCode(123).setNationalNumber(6502530000L);
25174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(0, phoneUtil.getLengthOfNationalDestinationCode(number));
252528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
253528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // An international toll free number, which has NDC "1234".
254528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(4, phoneUtil.getLengthOfNationalDestinationCode(INTERNATIONAL_TOLL_FREE));
25574aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia  }
25674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
2575c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testGetNationalSignificantNumber() {
258372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("6502530000", phoneUtil.getNationalSignificantNumber(US_NUMBER));
2595c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
2605c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // An Italian mobile number.
261372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("345678901", phoneUtil.getNationalSignificantNumber(IT_MOBILE));
2625c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
2635c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // An Italian fixed line number.
264372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("0236618300", phoneUtil.getNationalSignificantNumber(IT_NUMBER));
265528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
266528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("12345678", phoneUtil.getNationalSignificantNumber(INTERNATIONAL_TOLL_FREE));
2675c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
2685c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
269f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testGetExampleNumber() {
27052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(DE_NUMBER, phoneUtil.getExampleNumber(RegionCode.DE));
2711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
27252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(DE_NUMBER,
27352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.getExampleNumberForType(RegionCode.DE,
2741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                                   PhoneNumberUtil.PhoneNumberType.FIXED_LINE));
2751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(null,
27652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.getExampleNumberForType(RegionCode.DE,
2771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                                   PhoneNumberUtil.PhoneNumberType.MOBILE));
2781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // For the US, the example number is placed under general description, and hence should be used
2791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // for both fixed line and mobile, so neither of these should return null.
28052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertNotNull(phoneUtil.getExampleNumberForType(RegionCode.US,
2811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                                    PhoneNumberUtil.PhoneNumberType.FIXED_LINE));
28252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertNotNull(phoneUtil.getExampleNumberForType(RegionCode.US,
2831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                                    PhoneNumberUtil.PhoneNumberType.MOBILE));
284372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // CS is an invalid region, so we have no data for it.
285372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertNull(phoneUtil.getExampleNumberForType(RegionCode.CS,
286372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                                                 PhoneNumberUtil.PhoneNumberType.MOBILE));
287528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // RegionCode 001 is reserved for supporting non-geographical country calling code. We don't
288528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // support getting an example number for it with this method.
289528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(null, phoneUtil.getExampleNumber(RegionCode.UN001));
290528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia  }
291528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
292528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia  public void testGetExampleNumberForNonGeoEntity() {
293528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.getExampleNumberForNonGeoEntity(800));
294bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(UNIVERSAL_PREMIUM_RATE, phoneUtil.getExampleNumberForNonGeoEntity(979));
2951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
2961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
297d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia  public void testConvertAlphaCharactersInNumber() {
298d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia    String input = "1800-ABC-DEF";
299d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia    // Alpha chars are converted to digits; everything else is left untouched.
300d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia    String expectedOutput = "1800-222-333";
301d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia    assertEquals(expectedOutput, PhoneNumberUtil.convertAlphaCharactersInNumber(input));
302d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia  }
303d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia
3041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testNormaliseRemovePunctuation() {
305bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    String inputNumber = "034-56&+#2\u00AD34";
3061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String expectedOutput = "03456234";
3071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Conversion did not correctly remove punctuation",
3081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 expectedOutput,
3091524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.normalize(inputNumber));
3101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testNormaliseReplaceAlphaCharacters() {
3131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String inputNumber = "034-I-am-HUNGRY";
3141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String expectedOutput = "034426486479";
3151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Conversion did not correctly replace alpha characters",
3161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 expectedOutput,
3171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.normalize(inputNumber));
3181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testNormaliseOtherDigits() {
3211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String inputNumber = "\uFF125\u0665";
3221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String expectedOutput = "255";
3231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Conversion did not correctly replace non-latin digits",
3241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 expectedOutput,
3251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.normalize(inputNumber));
32674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Eastern-Arabic digits.
32774aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    inputNumber = "\u06F52\u06F0";
32874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    expectedOutput = "520";
32974aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals("Conversion did not correctly replace non-latin digits",
33074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                 expectedOutput,
33174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                 PhoneNumberUtil.normalize(inputNumber));
3321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testNormaliseStripAlphaCharacters() {
3351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String inputNumber = "034-56&+a#234";
3361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String expectedOutput = "03456234";
3371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Conversion did not correctly remove alpha character",
3381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 expectedOutput,
3391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.normalizeDigitsOnly(inputNumber));
3401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatUSNumber() {
34352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("650 253 0000", phoneUtil.format(US_NUMBER, PhoneNumberFormat.NATIONAL));
34452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+1 650 253 0000", phoneUtil.format(US_NUMBER, PhoneNumberFormat.INTERNATIONAL));
3451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
34652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("800 253 0000", phoneUtil.format(US_TOLLFREE, PhoneNumberFormat.NATIONAL));
34752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+1 800 253 0000", phoneUtil.format(US_TOLLFREE, PhoneNumberFormat.INTERNATIONAL));
3481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
34952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("900 253 0000", phoneUtil.format(US_PREMIUM, PhoneNumberFormat.NATIONAL));
35052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+1 900 253 0000", phoneUtil.format(US_PREMIUM, PhoneNumberFormat.INTERNATIONAL));
351b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    assertEquals("tel:+1-900-253-0000", phoneUtil.format(US_PREMIUM, PhoneNumberFormat.RFC3966));
352082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia    // Numbers with all zeros in the national number part will be formatted by using the raw_input
353082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia    // if that is available no matter which format is specified.
354082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia    assertEquals("000-000-0000",
355082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia                 phoneUtil.format(US_SPOOF_WITH_RAW_INPUT, PhoneNumberFormat.NATIONAL));
356082e1e80b0bcb2911de5d26981b592f2c2b9d3f6Shaopeng Jia    assertEquals("0", phoneUtil.format(US_SPOOF, PhoneNumberFormat.NATIONAL));
3571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatBSNumber() {
36052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("242 365 1234", phoneUtil.format(BS_NUMBER, PhoneNumberFormat.NATIONAL));
36152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+1 242 365 1234", phoneUtil.format(BS_NUMBER, PhoneNumberFormat.INTERNATIONAL));
3621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatGBNumber() {
36552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("(020) 7031 3000", phoneUtil.format(GB_NUMBER, PhoneNumberFormat.NATIONAL));
36652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+44 20 7031 3000", phoneUtil.format(GB_NUMBER, PhoneNumberFormat.INTERNATIONAL));
3671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
36852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("(07912) 345 678", phoneUtil.format(GB_MOBILE, PhoneNumberFormat.NATIONAL));
36952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+44 7912 345 678", phoneUtil.format(GB_MOBILE, PhoneNumberFormat.INTERNATIONAL));
3701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
3711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
3721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatDENumber() {
37376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber deNumber = new PhoneNumber();
37476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(301234L);
375372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("030/1234", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
376372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+49 30/1234", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
377b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    assertEquals("tel:+49-30-1234", phoneUtil.format(deNumber, PhoneNumberFormat.RFC3966));
3781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
37976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.clear();
38076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(291123L);
381256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("0291 123", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
382256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 291 123", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
3831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
38476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.clear();
38576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(29112345678L);
386256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("0291 12345678", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
387256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 291 12345678", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
3881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
38976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.clear();
39052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(912312345L);
39152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("09123 12345", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
39252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+49 9123 12345", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
39376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    deNumber.clear();
394df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(80212345L);
395256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("08021 2345", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
396256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+49 8021 2345", phoneUtil.format(deNumber, PhoneNumberFormat.INTERNATIONAL));
3971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Note this number is correctly formatted without national prefix. Most of the numbers that
3981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // are treated as invalid numbers by the library are short numbers, and they are usually not
3991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // dialed with national prefix.
40052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("1234", phoneUtil.format(DE_SHORT_NUMBER, PhoneNumberFormat.NATIONAL));
40152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+49 1234", phoneUtil.format(DE_SHORT_NUMBER, PhoneNumberFormat.INTERNATIONAL));
40252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
403372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    deNumber.clear();
40452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    deNumber.setCountryCode(49).setNationalNumber(41341234);
40552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("04134 1234", phoneUtil.format(deNumber, PhoneNumberFormat.NATIONAL));
4061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
4071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatITNumber() {
40952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("02 3661 8300", phoneUtil.format(IT_NUMBER, PhoneNumberFormat.NATIONAL));
41052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+39 02 3661 8300", phoneUtil.format(IT_NUMBER, PhoneNumberFormat.INTERNATIONAL));
41152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+390236618300", phoneUtil.format(IT_NUMBER, PhoneNumberFormat.E164));
4121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
41352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("345 678 901", phoneUtil.format(IT_MOBILE, PhoneNumberFormat.NATIONAL));
41452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+39 345 678 901", phoneUtil.format(IT_MOBILE, PhoneNumberFormat.INTERNATIONAL));
41552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+39345678901", phoneUtil.format(IT_MOBILE, PhoneNumberFormat.E164));
416f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  }
4171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatAUNumber() {
41952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("02 3661 8300", phoneUtil.format(AU_NUMBER, PhoneNumberFormat.NATIONAL));
42052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+61 2 3661 8300", phoneUtil.format(AU_NUMBER, PhoneNumberFormat.INTERNATIONAL));
42152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+61236618300", phoneUtil.format(AU_NUMBER, PhoneNumberFormat.E164));
42252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
42352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber auNumber = new PhoneNumber().setCountryCode(61).setNationalNumber(1800123456L);
424256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("1800 123 456", phoneUtil.format(auNumber, PhoneNumberFormat.NATIONAL));
425256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+61 1800 123 456", phoneUtil.format(auNumber, PhoneNumberFormat.INTERNATIONAL));
426256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+611800123456", phoneUtil.format(auNumber, PhoneNumberFormat.E164));
4271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
4281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatARNumber() {
43052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("011 8765-4321", phoneUtil.format(AR_NUMBER, PhoneNumberFormat.NATIONAL));
43152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+54 11 8765-4321", phoneUtil.format(AR_NUMBER, PhoneNumberFormat.INTERNATIONAL));
43252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+541187654321", phoneUtil.format(AR_NUMBER, PhoneNumberFormat.E164));
4331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
43452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("011 15 8765-4321", phoneUtil.format(AR_MOBILE, PhoneNumberFormat.NATIONAL));
43552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+54 9 11 8765 4321", phoneUtil.format(AR_MOBILE,
43652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                                        PhoneNumberFormat.INTERNATIONAL));
43752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+5491187654321", phoneUtil.format(AR_MOBILE, PhoneNumberFormat.E164));
4381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
4391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
440372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  public void testFormatMXNumber() {
441372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("045 234 567 8900", phoneUtil.format(MX_MOBILE1, PhoneNumberFormat.NATIONAL));
442372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+52 1 234 567 8900", phoneUtil.format(
443372bff8dd464574d36737d47e495cad14346653cShaopeng Jia        MX_MOBILE1, PhoneNumberFormat.INTERNATIONAL));
444372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+5212345678900", phoneUtil.format(MX_MOBILE1, PhoneNumberFormat.E164));
445372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
446372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("045 55 1234 5678", phoneUtil.format(MX_MOBILE2, PhoneNumberFormat.NATIONAL));
447372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+52 1 55 1234 5678", phoneUtil.format(
448372bff8dd464574d36737d47e495cad14346653cShaopeng Jia        MX_MOBILE2, PhoneNumberFormat.INTERNATIONAL));
449372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+5215512345678", phoneUtil.format(MX_MOBILE2, PhoneNumberFormat.E164));
450372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
451372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("01 33 1234 5678", phoneUtil.format(MX_NUMBER1, PhoneNumberFormat.NATIONAL));
452372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+52 33 1234 5678", phoneUtil.format(MX_NUMBER1, PhoneNumberFormat.INTERNATIONAL));
453372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+523312345678", phoneUtil.format(MX_NUMBER1, PhoneNumberFormat.E164));
454372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
455372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("01 821 123 4567", phoneUtil.format(MX_NUMBER2, PhoneNumberFormat.NATIONAL));
456372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+52 821 123 4567", phoneUtil.format(MX_NUMBER2, PhoneNumberFormat.INTERNATIONAL));
457372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+528211234567", phoneUtil.format(MX_NUMBER2, PhoneNumberFormat.E164));
458372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  }
459372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
4601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatOutOfCountryCallingNumber() {
4611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00 1 900 253 0000",
46252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(US_PREMIUM, RegionCode.DE));
4631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("1 650 253 0000",
46552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.BS));
4661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
467ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("00 1 650 253 0000",
46852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.PL));
4691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 44 7912 345 678",
47152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(GB_MOBILE, RegionCode.US));
4721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00 49 1234",
47452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(DE_SHORT_NUMBER, RegionCode.GB));
4751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Note this number is correctly formatted without national prefix. Most of the numbers that
4761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // are treated as invalid numbers by the library are short numbers, and they are usually not
4771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // dialed with national prefix.
47852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("1234", phoneUtil.formatOutOfCountryCallingNumber(DE_SHORT_NUMBER, RegionCode.DE));
4791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 39 02 3661 8300",
48152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, RegionCode.US));
4821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("02 3661 8300",
48352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, RegionCode.IT));
4841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("+39 02 3661 8300",
48552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, RegionCode.SG));
4861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
48752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("6521 8000",
48852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(SG_NUMBER, RegionCode.SG));
4891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
4901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 54 9 11 8765 4321",
49152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(AR_MOBILE, RegionCode.US));
492528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("011 800 1234 5678",
493528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(INTERNATIONAL_TOLL_FREE, RegionCode.US));
4941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
49552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber arNumberWithExtn = new PhoneNumber().mergeFrom(AR_MOBILE).setExtension("1234");
4961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 54 9 11 8765 4321 ext. 1234",
49752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(arNumberWithExtn, RegionCode.US));
4981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0011 54 9 11 8765 4321 ext. 1234",
49952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(arNumberWithExtn, RegionCode.AU));
5001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("011 15 8765-4321 ext. 1234",
50152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(arNumberWithExtn, RegionCode.AR));
5021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
5031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
504a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia  public void testFormatOutOfCountryWithInvalidRegion() {
505a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    // AQ/Antarctica isn't a valid region code for phone number formatting,
506a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    // so this falls back to intl formatting.
507a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    assertEquals("+1 650 253 0000",
508528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.AQ));
509528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // For region code 001, the out-of-country format always turns into the international format.
510528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("+1 650 253 0000",
511528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.UN001));
512a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia  }
513a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia
5141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatOutOfCountryWithPreferredIntlPrefix() {
5151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // This should use 0011, since that is the preferred international prefix (both 0011 and 0012
5161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // are accepted as possible international prefixes in our test metadta.)
5171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0011 39 02 3661 8300",
51852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(IT_NUMBER, RegionCode.AU));
5191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
5201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
521372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  public void testFormatOutOfCountryKeepingAlphaChars() {
522372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    PhoneNumber alphaNumericNumber = new PhoneNumber();
523372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setCountryCode(1).setNationalNumber(8007493524L)
524372bff8dd464574d36737d47e495cad14346653cShaopeng Jia        .setRawInput("1800 six-flag");
525372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("0011 1 800 SIX-FLAG",
526372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AU));
527372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
528372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setRawInput("1-800-SIX-flag");
529372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("0011 1 800-SIX-FLAG",
530372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AU));
531372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
532372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setRawInput("Call us from UK: 00 1 800 SIX-flag");
533372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("0011 1 800 SIX-FLAG",
534372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AU));
535372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
536372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setRawInput("800 SIX-flag");
537372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("0011 1 800 SIX-FLAG",
538372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AU));
539372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
540372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Formatting from within the NANPA region.
541372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("1 800 SIX-FLAG",
542372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.US));
543372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
544372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("1 800 SIX-FLAG",
545372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.BS));
546372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
547372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Testing that if the raw input doesn't exist, it is formatted using
548372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // formatOutOfCountryCallingNumber.
549372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.clearRawInput();
550372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("00 1 800 749 3524",
551372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.DE));
552372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
553372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Testing AU alpha number formatted from Australia.
554372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setCountryCode(61).setNationalNumber(827493524L)
555372bff8dd464574d36737d47e495cad14346653cShaopeng Jia        .setRawInput("+61 82749-FLAG");
556372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // This number should have the national prefix fixed.
557372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("082749-FLAG",
558372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AU));
559372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
560372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setRawInput("082749-FLAG");
561372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("082749-FLAG",
562372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AU));
563372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
564372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setNationalNumber(18007493524L).setRawInput("1-800-SIX-flag");
565372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // This number should not have the national prefix prefixed, in accordance with the override for
566372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // this specific formatting rule.
567372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("1-800-SIX-FLAG",
568372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AU));
569372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
570372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // The metadata should not be permanently changed, since we copied it before modifying patterns.
571372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Here we check this.
572372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setNationalNumber(1800749352L);
573372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("1800 749 352",
574372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(alphaNumericNumber, RegionCode.AU));
575372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
576372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Testing a region with multiple international prefixes.
577372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("+61 1-800-SIX-FLAG",
578372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.SG));
579528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // Testing the case of calling from a non-supported region.
580528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("+61 1-800-SIX-FLAG",
581528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AQ));
582372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
583372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Testing the case with an invalid country calling code.
584372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setCountryCode(0).setNationalNumber(18007493524L)
585372bff8dd464574d36737d47e495cad14346653cShaopeng Jia        .setRawInput("1-800-SIX-flag");
586372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Uses the raw input only.
587372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("1-800-SIX-flag",
588372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.DE));
589372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
590372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Testing the case of an invalid alpha number.
591372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    alphaNumericNumber.setCountryCode(1).setNationalNumber(80749L).setRawInput("180-SIX");
592372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // No country-code stripping can be done.
593372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals("00 1 180-SIX",
594372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.DE));
595528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
596528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // Testing the case of calling from a non-supported region.
597528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    alphaNumericNumber.setCountryCode(1).setNationalNumber(80749L).setRawInput("180-SIX");
598528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // No country-code stripping can be done since the number is invalid.
599528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("+1 180-SIX",
600528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.formatOutOfCountryKeepingAlphaChars(alphaNumericNumber, RegionCode.AQ));
601372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  }
602372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
6034b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia  public void testFormatWithCarrierCode() {
60452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // We only support this for AR in our test metadata, and only for mobile numbers starting with
60552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // certain values.
60652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber arMobile = new PhoneNumber().setCountryCode(54).setNationalNumber(92234654321L);
60752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("02234 65-4321", phoneUtil.format(arMobile, PhoneNumberFormat.NATIONAL));
60852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Here we force 14 as the carrier code.
60952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("02234 14 65-4321",
61052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatNationalNumberWithCarrierCode(arMobile, "14"));
61152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Here we force the number to be shown with no carrier code.
61252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("02234 65-4321",
61352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatNationalNumberWithCarrierCode(arMobile, ""));
61452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Here the international rule is used, so no carrier code should be present.
61552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+5492234654321", phoneUtil.format(arMobile, PhoneNumberFormat.E164));
61652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // We don't support this for the US so there should be no change.
61752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("650 253 0000", phoneUtil.formatNationalNumberWithCarrierCode(US_NUMBER, "15"));
61852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  }
61952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
62052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia  public void testFormatWithPreferredCarrierCode() {
6214b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // We only support this for AR in our test metadata.
6224b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber arNumber = new PhoneNumber();
6234b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(91234125678L);
62452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Test formatting with no preferred carrier code stored in the number itself.
62552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("01234 15 12-5678",
62652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, "15"));
62752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("01234 12-5678",
62852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, ""));
62952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Test formatting with preferred carrier code present.
63052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    arNumber.setPreferredDomesticCarrierCode("19");
631256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("01234 12-5678", phoneUtil.format(arNumber, PhoneNumberFormat.NATIONAL));
63252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("01234 19 12-5678",
63352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, "15"));
63452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("01234 19 12-5678",
63552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, ""));
63652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // When the preferred_domestic_carrier_code is present (even when it contains an empty string),
63752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // use it instead of the default carrier code passed in.
63852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    arNumber.setPreferredDomesticCarrierCode("");
63952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("01234 12-5678",
64052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        phoneUtil.formatNationalNumberWithPreferredCarrierCode(arNumber, "15"));
6414b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // We don't support this for the US so there should be no change.
6424b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
64352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(4241231234L).setPreferredDomesticCarrierCode("99");
644256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("424 123 1234", phoneUtil.format(usNumber, PhoneNumberFormat.NATIONAL));
64552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("424 123 1234",
64652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        phoneUtil.formatNationalNumberWithPreferredCarrierCode(usNumber, "15"));
6474b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia  }
6484b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
649ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia  public void testFormatNumberForMobileDialing() {
650ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    // US toll free numbers are marked as noInternationalDialling in the test metadata for testing
651ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    // purposes.
652ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("800 253 0000",
65396a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.US,
65496a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia                                               true /*  keep formatting */));
655ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("", phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.CN, true));
656ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("+1 650 253 0000",
657ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(US_NUMBER, RegionCode.US, true));
658ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    PhoneNumber usNumberWithExtn = new PhoneNumber().mergeFrom(US_NUMBER).setExtension("1234");
659ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("+1 650 253 0000",
660ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(usNumberWithExtn, RegionCode.US, true));
661ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia
662ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("8002530000",
66396a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.US,
66496a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia                                               false /* remove formatting */));
665ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("", phoneUtil.formatNumberForMobileDialing(US_TOLLFREE, RegionCode.CN, false));
666ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("+16502530000",
667ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(US_NUMBER, RegionCode.US, false));
668ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals("+16502530000",
669ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(usNumberWithExtn, RegionCode.US, false));
67096a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia
67196a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia    // An invalid US number, which is one digit too long.
67296a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia    assertEquals("+165025300001",
67396a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(US_LONG_NUMBER, RegionCode.US, false));
67496a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia    assertEquals("+1 65025300001",
67596a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(US_LONG_NUMBER, RegionCode.US, true));
67696a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia
67796a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia    // Star numbers. In real life they appear in Israel, but we have them in JP in our test
67896a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia    // metadata.
67996a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia    assertEquals("*2345",
68096a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(JP_STAR_NUMBER, RegionCode.JP, false));
68196a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia    assertEquals("*2345",
68296a7214cdabf08f53f5b1a560304601c9f65e0b9Shaopeng Jia        phoneUtil.formatNumberForMobileDialing(JP_STAR_NUMBER, RegionCode.JP, true));
683528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
684528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("+80012345678",
685528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatNumberForMobileDialing(INTERNATIONAL_TOLL_FREE, RegionCode.JP, false));
686528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("+800 1234 5678",
687528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatNumberForMobileDialing(INTERNATIONAL_TOLL_FREE, RegionCode.JP, true));
688ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia  }
689ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia
6901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatByPattern() {
6915724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    NumberFormat newNumFormat = new NumberFormat();
6925724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setPattern("(\\d{3})(\\d{3})(\\d{4})");
6935724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setFormat("($1) $2-$3");
6941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    List<NumberFormat> newNumberFormats = new ArrayList<NumberFormat>();
6955724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumberFormats.add(newNumFormat);
6961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
69752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("(650) 253-0000", phoneUtil.formatByPattern(US_NUMBER, PhoneNumberFormat.NATIONAL,
698256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                                                             newNumberFormats));
69952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+1 (650) 253-0000", phoneUtil.formatByPattern(US_NUMBER,
700256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                                                                PhoneNumberFormat.INTERNATIONAL,
701256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                                                                newNumberFormats));
702b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    assertEquals("tel:+1-650-253-0000", phoneUtil.formatByPattern(US_NUMBER,
703b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia                                                                  PhoneNumberFormat.RFC3966,
704b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia                                                                  newNumberFormats));
7051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
706df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // $NP is set to '1' for the US. Here we check that for other NANPA countries the US rules are
707df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // followed.
708df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("$NP ($FG)");
709df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    newNumFormat.setFormat("$1 $2-$3");
71052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("1 (242) 365-1234",
71152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatByPattern(BS_NUMBER, PhoneNumberFormat.NATIONAL,
71252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                           newNumberFormats));
71352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+1 242 365-1234",
71452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatByPattern(BS_NUMBER, PhoneNumberFormat.INTERNATIONAL,
715df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia                                           newNumberFormats));
71676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
7175724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setPattern("(\\d{2})(\\d{5})(\\d{3})");
7185724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setFormat("$1-$2 $3");
7195724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumberFormats.set(0, newNumFormat);
7201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("02-36618 300",
72252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatByPattern(IT_NUMBER, PhoneNumberFormat.NATIONAL,
72352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                           newNumberFormats));
7241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("+39 02-36618 300",
72552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatByPattern(IT_NUMBER, PhoneNumberFormat.INTERNATIONAL,
7261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                           newNumberFormats));
7271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7285724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("$NP$FG");
7295724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setPattern("(\\d{2})(\\d{4})(\\d{4})");
7305724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setFormat("$1 $2 $3");
7315724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumberFormats.set(0, newNumFormat);
73252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("020 7031 3000",
73352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL,
73452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                           newNumberFormats));
7351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7365724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("($NP$FG)");
73752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("(020) 7031 3000",
73852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL,
73952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                           newNumberFormats));
7405724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia
7415724d94f83d41d33bfdf9fdbaddbfebb1a0e77f0Shaopeng Jia    newNumFormat.setNationalPrefixFormattingRule("");
74252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("20 7031 3000",
74352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.NATIONAL,
74452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                           newNumberFormats));
7451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
74652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+44 20 7031 3000",
74752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatByPattern(GB_NUMBER, PhoneNumberFormat.INTERNATIONAL,
7481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                                           newNumberFormats));
7491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatE164Number() {
75252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+16502530000", phoneUtil.format(US_NUMBER, PhoneNumberFormat.E164));
75352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+4930123456", phoneUtil.format(DE_NUMBER, PhoneNumberFormat.E164));
754528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("+80012345678", phoneUtil.format(INTERNATIONAL_TOLL_FREE, PhoneNumberFormat.E164));
7551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
7571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFormatNumberWithExtension() {
75852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber nzNumber = new PhoneNumber().mergeFrom(NZ_NUMBER).setExtension("1234");
7591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Uses default extension prefix:
760256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("03-331 6005 ext. 1234", phoneUtil.format(nzNumber, PhoneNumberFormat.NATIONAL));
761372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Uses RFC 3966 syntax.
762b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    assertEquals("tel:+64-3-331-6005;ext=1234",
763b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia        phoneUtil.format(nzNumber, PhoneNumberFormat.RFC3966));
7641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Extension prefix overridden in the territory information for the US:
76552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber usNumberWithExtension = new PhoneNumber().mergeFrom(US_NUMBER).setExtension("4567");
76652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("650 253 0000 extn. 4567", phoneUtil.format(usNumberWithExtension,
76752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                                             PhoneNumberFormat.NATIONAL));
7681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
7691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
770528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia  public void testFormatInOriginalFormat() throws Exception {
77152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber number1 = phoneUtil.parseAndKeepRawInput("+442087654321", RegionCode.GB);
77252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("+44 20 8765 4321", phoneUtil.formatInOriginalFormat(number1, RegionCode.GB));
77354923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
77452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber number2 = phoneUtil.parseAndKeepRawInput("02087654321", RegionCode.GB);
77552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("(020) 8765 4321", phoneUtil.formatInOriginalFormat(number2, RegionCode.GB));
77654923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
77752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber number3 = phoneUtil.parseAndKeepRawInput("011442087654321", RegionCode.US);
77852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("011 44 20 8765 4321", phoneUtil.formatInOriginalFormat(number3, RegionCode.US));
77954923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
78052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber number4 = phoneUtil.parseAndKeepRawInput("442087654321", RegionCode.GB);
78152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("44 20 8765 4321", phoneUtil.formatInOriginalFormat(number4, RegionCode.GB));
78254923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
78352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber number5 = phoneUtil.parse("+442087654321", RegionCode.GB);
78452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("(020) 8765 4321", phoneUtil.formatInOriginalFormat(number5, RegionCode.GB));
785ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia
786528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // Invalid numbers that we have a formatting pattern for should be formatted properly. Note area
787ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    // codes starting with 7 are intentionally excluded in the test metadata for testing purposes.
788ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    PhoneNumber number6 = phoneUtil.parseAndKeepRawInput("7345678901", RegionCode.US);
789528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("734 567 8901", phoneUtil.formatInOriginalFormat(number6, RegionCode.US));
790ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia
791528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // US is not a leading zero country, and the presence of the leading zero leads us to format the
792528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // number using raw_input.
793528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber number7 = phoneUtil.parseAndKeepRawInput("0734567 8901", RegionCode.US);
794528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("0734567 8901", phoneUtil.formatInOriginalFormat(number7, RegionCode.US));
7955cd062f9cba053c771bcea181fec210279ec030bShaopeng Jia
7965cd062f9cba053c771bcea181fec210279ec030bShaopeng Jia    // This number is valid, but we don't have a formatting pattern for it. Fall back to the raw
7975cd062f9cba053c771bcea181fec210279ec030bShaopeng Jia    // input.
7985cd062f9cba053c771bcea181fec210279ec030bShaopeng Jia    PhoneNumber number8 = phoneUtil.parseAndKeepRawInput("02-4567-8900", RegionCode.KR);
7995cd062f9cba053c771bcea181fec210279ec030bShaopeng Jia    assertEquals("02-4567-8900", phoneUtil.formatInOriginalFormat(number8, RegionCode.KR));
800528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
801528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber number9 = phoneUtil.parseAndKeepRawInput("01180012345678", RegionCode.US);
802528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("011 800 1234 5678", phoneUtil.formatInOriginalFormat(number9, RegionCode.US));
803528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
804528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber number10 = phoneUtil.parseAndKeepRawInput("+80012345678", RegionCode.KR);
805528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("+800 1234 5678", phoneUtil.formatInOriginalFormat(number10, RegionCode.KR));
806528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
807528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // US local numbers are formatted correctly, as we have formatting patterns for them.
808528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber localNumberUS = phoneUtil.parseAndKeepRawInput("2530000", RegionCode.US);
809528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("253 0000", phoneUtil.formatInOriginalFormat(localNumberUS, RegionCode.US));
810528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
811528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithNationalPrefixUS =
812528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("18003456789", RegionCode.US);
813528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("1 800 345 6789",
814528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithNationalPrefixUS, RegionCode.US));
815528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
816528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithoutNationalPrefixGB =
817528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("2087654321", RegionCode.GB);
818528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("20 8765 4321",
819528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithoutNationalPrefixGB, RegionCode.GB));
820528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // Make sure no metadata is modified as a result of the previous function call.
821528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("(020) 8765 4321", phoneUtil.formatInOriginalFormat(number5, RegionCode.GB));
822528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
823528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithNationalPrefixMX =
824528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("013312345678", RegionCode.MX);
825528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("01 33 1234 5678",
826528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithNationalPrefixMX, RegionCode.MX));
827528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
828528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithoutNationalPrefixMX =
829528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("3312345678", RegionCode.MX);
830528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("33 1234 5678",
831528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithoutNationalPrefixMX, RegionCode.MX));
832528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
833528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber italianFixedLineNumber =
834528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("0212345678", RegionCode.IT);
835528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("02 1234 5678",
836528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(italianFixedLineNumber, RegionCode.IT));
837528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
838528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithNationalPrefixJP =
839528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("00777012", RegionCode.JP);
840528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("0077-7012",
841528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithNationalPrefixJP, RegionCode.JP));
842528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
843528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithoutNationalPrefixJP =
844528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("0777012", RegionCode.JP);
845528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("0777012",
846528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithoutNationalPrefixJP, RegionCode.JP));
847528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
848528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithCarrierCodeBR =
849528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("012 3121286979", RegionCode.BR);
850528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("012 3121286979",
851528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithCarrierCodeBR, RegionCode.BR));
852528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
853528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // The default national prefix used in this case is 045. When a number with national prefix 044
854528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // is entered, we return the raw input as we don't want to change the number entered.
855528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithNationalPrefixMX1 =
856528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("044(33)1234-5678", RegionCode.MX);
857528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("044(33)1234-5678",
858528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithNationalPrefixMX1, RegionCode.MX));
859528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
860528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber numberWithNationalPrefixMX2 =
861528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("045(33)1234-5678", RegionCode.MX);
862528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("045 33 1234 5678",
863528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(numberWithNationalPrefixMX2, RegionCode.MX));
864528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
865528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // The default international prefix used in this case is 0011. When a number with international
866528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // prefix 0012 is entered, we return the raw input as we don't want to change the number
867528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // entered.
868528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber outOfCountryNumberFromAU1 =
869528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("0012 16502530000", RegionCode.AU);
870528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("0012 16502530000",
871528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(outOfCountryNumberFromAU1, RegionCode.AU));
872528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
873528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    PhoneNumber outOfCountryNumberFromAU2 =
874528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.parseAndKeepRawInput("0011 16502530000", RegionCode.AU);
875528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals("0011 1 650 253 0000",
876528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia        phoneUtil.formatInOriginalFormat(outOfCountryNumberFromAU2, RegionCode.AU));
877bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia
878bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    // Test the star sign is not removed from or added to the original input by this method.
879bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    PhoneNumber starNumber = phoneUtil.parseAndKeepRawInput("*1234", RegionCode.JP);
880bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals("*1234", phoneUtil.formatInOriginalFormat(starNumber, RegionCode.JP));
881bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    PhoneNumber numberWithoutStar = phoneUtil.parseAndKeepRawInput("1234", RegionCode.JP);
882bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals("1234", phoneUtil.formatInOriginalFormat(numberWithoutStar, RegionCode.JP));
88354923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia  }
88454923fc72f0faeb11fe58a545c0314f6051b14aaShaopeng Jia
8851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsPremiumRate() {
88652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, phoneUtil.getNumberType(US_PREMIUM));
88776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
88852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber premiumRateNumber = new PhoneNumber();
88976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(39).setNationalNumber(892123L);
890f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
89176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
8921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
89376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.clear();
89476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(44).setNationalNumber(9187654321L);
895f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
89676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
8971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
89876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.clear();
89976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(49).setNationalNumber(9001654321L);
9001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
90176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
9021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
90376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.clear();
90476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumRateNumber.setCountryCode(49).setNationalNumber(90091234567L);
9051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
90676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(premiumRateNumber));
907bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia
908bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE,
909bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                 phoneUtil.getNumberType(UNIVERSAL_PREMIUM_RATE));
9101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsTollFree() {
91376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber tollFreeNumber = new PhoneNumber();
91476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia
91576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.setCountryCode(1).setNationalNumber(8881234567L);
9161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
91776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(tollFreeNumber));
9181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
91976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.clear();
92076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.setCountryCode(39).setNationalNumber(803123L);
9211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
92276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(tollFreeNumber));
9231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
92476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.clear();
92576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.setCountryCode(44).setNationalNumber(8012345678L);
9261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
92776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(tollFreeNumber));
9281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
92976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.clear();
93076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollFreeNumber.setCountryCode(49).setNationalNumber(8001234567L);
9311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
93276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(tollFreeNumber));
933528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
934528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.TOLL_FREE,
935528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.getNumberType(INTERNATIONAL_TOLL_FREE));
9361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9381524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsMobile() {
93952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, phoneUtil.getNumberType(BS_MOBILE));
94052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, phoneUtil.getNumberType(GB_MOBILE));
94152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, phoneUtil.getNumberType(IT_MOBILE));
942372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, phoneUtil.getNumberType(AR_MOBILE));
9431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
94452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber mobileNumber = new PhoneNumber();
94576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mobileNumber.setCountryCode(49).setNationalNumber(15123456789L);
94652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.MOBILE, phoneUtil.getNumberType(mobileNumber));
9471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsFixedLine() {
95052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE, phoneUtil.getNumberType(BS_NUMBER));
95152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE, phoneUtil.getNumberType(IT_NUMBER));
95252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE, phoneUtil.getNumberType(GB_NUMBER));
95352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE, phoneUtil.getNumberType(DE_NUMBER));
9541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsFixedLineAndMobile() {
9571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE_OR_MOBILE,
95852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.getNumberType(US_NUMBER));
9591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
96052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber fixedLineAndMobileNumber = new PhoneNumber().
96152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setCountryCode(54).setNationalNumber(1987654321L);
9621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.FIXED_LINE_OR_MOBILE,
96376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(fixedLineAndMobileNumber));
9641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsSharedCost() {
96776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
9681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(8431231234L);
96976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.SHARED_COST, phoneUtil.getNumberType(gbNumber));
9701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsVoip() {
97376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
9741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(5631231234L);
97576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.VOIP, phoneUtil.getNumberType(gbNumber));
9761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsPersonalNumber() {
97976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber gbNumber = new PhoneNumber();
9801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    gbNumber.setCountryCode(44).setNationalNumber(7031231234L);
9811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.PERSONAL_NUMBER,
98276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.getNumberType(gbNumber));
9831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsUnknown() {
98652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Invalid numbers should be of type UNKNOWN.
98752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.UNKNOWN, phoneUtil.getNumberType(US_LOCAL_NUMBER));
9881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
9891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
9901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsValidNumber() {
99152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumber(US_NUMBER));
99252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumber(IT_NUMBER));
99352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumber(GB_MOBILE));
994528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertTrue(phoneUtil.isValidNumber(INTERNATIONAL_TOLL_FREE));
995bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(UNIVERSAL_PREMIUM_RATE));
9961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
99752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber nzNumber = new PhoneNumber().setCountryCode(64).setNationalNumber(21387835L);
99876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(nzNumber));
9991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
10001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsValidForRegion() {
10021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // This number is valid for the Bahamas, but is not a valid US number.
100352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumber(BS_NUMBER));
100452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(BS_NUMBER, RegionCode.BS));
100552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(BS_NUMBER, RegionCode.US));
100652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber bsInvalidNumber =
100752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        new PhoneNumber().setCountryCode(1).setNationalNumber(2421232345L);
10081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // This number is no longer valid.
100952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumber(bsInvalidNumber));
10104b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
1011df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // La Mayotte and Reunion use 'leadingDigits' to differentiate them.
10124b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber reNumber = new PhoneNumber();
10134b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    reNumber.setCountryCode(262).setNationalNumber(262123456L);
10144b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(reNumber));
101552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(reNumber, RegionCode.RE));
101652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(reNumber, RegionCode.YT));
10174b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Now change the number to be a number for La Mayotte.
10184b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    reNumber.setNationalNumber(269601234L);
101952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(reNumber, RegionCode.YT));
102052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(reNumber, RegionCode.RE));
1021df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // This number is no longer valid for La Reunion.
10224b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    reNumber.setNationalNumber(269123456L);
102352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(reNumber, RegionCode.YT));
102452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(reNumber, RegionCode.RE));
10254b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(reNumber));
10264b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // However, it should be recognised as from La Mayotte, since it is valid for this region.
102752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(RegionCode.YT, phoneUtil.getRegionCodeForNumber(reNumber));
10284b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // This number is valid in both places.
10294b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    reNumber.setNationalNumber(800123456L);
103052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(reNumber, RegionCode.YT));
103152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(reNumber, RegionCode.RE));
1032528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertTrue(phoneUtil.isValidNumberForRegion(INTERNATIONAL_TOLL_FREE, RegionCode.UN001));
1033528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(INTERNATIONAL_TOLL_FREE, RegionCode.US));
1034cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(INTERNATIONAL_TOLL_FREE, RegionCode.ZZ));
1035cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia
1036cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    PhoneNumber invalidNumber = new PhoneNumber();
1037cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    // Invalid country calling codes.
1038cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    invalidNumber.setCountryCode(3923).setNationalNumber(2366L);
1039cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(invalidNumber, RegionCode.ZZ));
1040cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(invalidNumber, RegionCode.UN001));
1041cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    invalidNumber.setCountryCode(0);
1042b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(invalidNumber, RegionCode.UN001));
1043cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    assertFalse(phoneUtil.isValidNumberForRegion(invalidNumber, RegionCode.ZZ));
10441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
10451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10461524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNotValidNumber() {
104752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumber(US_LOCAL_NUMBER));
10481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
104952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber invalidNumber = new PhoneNumber();
105052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    invalidNumber.setCountryCode(39).setNationalNumber(23661830000L).setItalianLeadingZero(true);
105152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumber(invalidNumber));
10521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
105352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    invalidNumber.clear();
105452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    invalidNumber.setCountryCode(44).setNationalNumber(791234567L);
105552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumber(invalidNumber));
10561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
105752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    invalidNumber.clear();
105852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    invalidNumber.setCountryCode(49).setNationalNumber(1234L);
105952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumber(invalidNumber));
10601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
106152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    invalidNumber.clear();
106252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    invalidNumber.setCountryCode(64).setNationalNumber(3316005L);
106352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isValidNumber(invalidNumber));
1064528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
1065cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    invalidNumber.clear();
1066cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    // Invalid country calling codes.
1067cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    invalidNumber.setCountryCode(3923).setNationalNumber(2366L);
1068cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    assertFalse(phoneUtil.isValidNumber(invalidNumber));
1069cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    invalidNumber.setCountryCode(0);
1070cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    assertFalse(phoneUtil.isValidNumber(invalidNumber));
1071cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia
1072528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertFalse(phoneUtil.isValidNumber(INTERNATIONAL_TOLL_FREE_TOO_LONG));
10731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
10741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetRegionCodeForCountryCode() {
107652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(RegionCode.US, phoneUtil.getRegionCodeForCountryCode(1));
107752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForCountryCode(44));
107852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(RegionCode.DE, phoneUtil.getRegionCodeForCountryCode(49));
1079528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(800));
1080bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(979));
10811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
10821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetRegionCodeForNumber() {
108452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(RegionCode.BS, phoneUtil.getRegionCodeForNumber(BS_NUMBER));
108552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(RegionCode.US, phoneUtil.getRegionCodeForNumber(US_NUMBER));
108652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForNumber(GB_MOBILE));
1087528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(INTERNATIONAL_TOLL_FREE));
1088bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(UNIVERSAL_PREMIUM_RATE));
10891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
10901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
10911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testGetCountryCodeForRegion() {
109252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(1, phoneUtil.getCountryCodeForRegion(RegionCode.US));
109352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(64, phoneUtil.getCountryCodeForRegion(RegionCode.NZ));
10947900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals(0, phoneUtil.getCountryCodeForRegion(null));
109552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(0, phoneUtil.getCountryCodeForRegion(RegionCode.ZZ));
1096528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(0, phoneUtil.getCountryCodeForRegion(RegionCode.UN001));
10977900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    // CS is already deprecated so the library doesn't support it.
109852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(0, phoneUtil.getCountryCodeForRegion(RegionCode.CS));
10991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
11001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1101f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testGetNationalDiallingPrefixForRegion() {
110252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("1", phoneUtil.getNddPrefixForRegion(RegionCode.US, false));
1103f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // Test non-main country to see it gets the national dialling prefix for the main country with
1104f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // that country calling code.
110552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("1", phoneUtil.getNddPrefixForRegion(RegionCode.BS, false));
110652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("0", phoneUtil.getNddPrefixForRegion(RegionCode.NZ, false));
1107f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // Test case with non digit in the national prefix.
110852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("0~0", phoneUtil.getNddPrefixForRegion(RegionCode.AO, false));
110952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("00", phoneUtil.getNddPrefixForRegion(RegionCode.AO, true));
1110f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // Test cases with invalid regions.
1111f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(null, phoneUtil.getNddPrefixForRegion(null, false));
111252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(null, phoneUtil.getNddPrefixForRegion(RegionCode.ZZ, false));
1113528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(null, phoneUtil.getNddPrefixForRegion(RegionCode.UN001, false));
1114f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    // CS is already deprecated so the library doesn't support it.
111552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(null, phoneUtil.getNddPrefixForRegion(RegionCode.CS, false));
1116f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  }
1117f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia
11187900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia  public void testIsNANPACountry() {
111952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isNANPACountry(RegionCode.US));
112052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isNANPACountry(RegionCode.BS));
1121249f28fc9d984e6a7d5ff05ca78d8e7ce280eb54Shaopeng Jia    assertFalse(phoneUtil.isNANPACountry(RegionCode.DE));
1122249f28fc9d984e6a7d5ff05ca78d8e7ce280eb54Shaopeng Jia    assertFalse(phoneUtil.isNANPACountry(RegionCode.ZZ));
1123528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertFalse(phoneUtil.isNANPACountry(RegionCode.UN001));
1124249f28fc9d984e6a7d5ff05ca78d8e7ce280eb54Shaopeng Jia    assertFalse(phoneUtil.isNANPACountry(null));
11251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
11261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
11271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsPossibleNumber() {
112852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber(US_NUMBER));
112952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber(US_LOCAL_NUMBER));
113052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber(GB_NUMBER));
1131528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber(INTERNATIONAL_TOLL_FREE));
113252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
113352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+1 650 253 0000", RegionCode.US));
113452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+1 650 GOO OGLE", RegionCode.US));
113552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("(650) 253-0000", RegionCode.US));
113652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("253-0000", RegionCode.US));
113752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+1 650 253 0000", RegionCode.GB));
113852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+44 20 7031 3000", RegionCode.GB));
113952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("(020) 7031 3000", RegionCode.GB));
114052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("7031 3000", RegionCode.GB));
114152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("3331 6005", RegionCode.NZ));
1142528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertTrue(phoneUtil.isPossibleNumber("+800 1234 5678", RegionCode.UN001));
11431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
11441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
11451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsPossibleNumberWithReason() {
1146372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // National numbers for country calling code +1 that are within 7 to 10 digits are possible.
11471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE,
114852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isPossibleNumberWithReason(US_NUMBER));
11491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
11501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE,
115152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isPossibleNumberWithReason(US_LOCAL_NUMBER));
11521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
115352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG,
115452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isPossibleNumberWithReason(US_LONG_NUMBER));
115552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
115652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber number = new PhoneNumber();
115776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(0).setNationalNumber(2530000L);
11581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.INVALID_COUNTRY_CODE,
115976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(number));
11601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
116176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
116276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(253000L);
11631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT,
116476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(number));
11651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1166372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    number.clear();
1167372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    number.setCountryCode(65).setNationalNumber(1234567890L);
1168372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE,
1169372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                 phoneUtil.isPossibleNumberWithReason(number));
1170372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
1171528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG,
1172528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.isPossibleNumberWithReason(INTERNATIONAL_TOLL_FREE_TOO_LONG));
1173528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
11744b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Try with number that we don't have metadata for.
11754b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    PhoneNumber adNumber = new PhoneNumber();
11764b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    adNumber.setCountryCode(376).setNationalNumber(12345L);
11774b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE,
11784b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(adNumber));
1179bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    adNumber.setCountryCode(376).setNationalNumber(1L);
11804b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT,
11814b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(adNumber));
1182ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    adNumber.setCountryCode(376).setNationalNumber(12345678901234567L);
11834b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    assertEquals(PhoneNumberUtil.ValidationResult.TOO_LONG,
11844b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                 phoneUtil.isPossibleNumberWithReason(adNumber));
11851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
11861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
11871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNotPossibleNumber() {
118852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber(US_LONG_NUMBER));
1189528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber(INTERNATIONAL_TOLL_FREE_TOO_LONG));
11901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
119152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber number = new PhoneNumber();
119276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(1).setNationalNumber(253000L);
119376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber(number));
11941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
119576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.clear();
119676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    number.setCountryCode(44).setNationalNumber(300L);
119776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isPossibleNumber(number));
119852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("+1 650 253 00000", RegionCode.US));
119952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("(650) 253-00000", RegionCode.US));
120052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("I want a Pizza", RegionCode.US));
120152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("253-000", RegionCode.US));
120252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("1 3000", RegionCode.GB));
120352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("+44 300", RegionCode.GB));
1204528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertFalse(phoneUtil.isPossibleNumber("+800 1234 5678 9", RegionCode.UN001));
12051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
12061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1207df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia  public void testTruncateTooLongNumber() {
1208df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // GB number 080 1234 5678, but entered with 4 extra digits at the end.
120952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber tooLongNumber = new PhoneNumber();
1210df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooLongNumber.setCountryCode(44).setNationalNumber(80123456780123L);
121152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber validNumber = new PhoneNumber();
1212df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumber.setCountryCode(44).setNationalNumber(8012345678L);
1213df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
1214df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(validNumber, tooLongNumber);
1215df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
1216df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // IT number 022 3456 7890, but entered with 3 extra digits at the end.
1217df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooLongNumber.clear();
1218df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    tooLongNumber.setCountryCode(39).setNationalNumber(2234567890123L).setItalianLeadingZero(true);
1219df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumber.clear();
1220df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    validNumber.setCountryCode(39).setNationalNumber(2234567890L).setItalianLeadingZero(true);
1221df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
1222df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(validNumber, tooLongNumber);
1223df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
1224528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // US number 650-253-0000, but entered with one additional digit at the end.
1225528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    tooLongNumber.clear();
1226528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    tooLongNumber.mergeFrom(US_LONG_NUMBER);
1227528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
1228528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(US_NUMBER, tooLongNumber);
1229528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
1230528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    tooLongNumber.clear();
1231528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    tooLongNumber.mergeFrom(INTERNATIONAL_TOLL_FREE_TOO_LONG);
1232528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(tooLongNumber));
1233528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(INTERNATIONAL_TOLL_FREE, tooLongNumber);
1234528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia
1235df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests what happens when a valid number is passed in.
123652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber validNumberCopy = new PhoneNumber().mergeFrom(validNumber);
1237df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertTrue(phoneUtil.truncateTooLongNumber(validNumber));
1238df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests the number is not modified.
1239df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(validNumberCopy, validNumber);
1240df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
1241df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests what happens when a number with invalid prefix is passed in.
1242df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    PhoneNumber numberWithInvalidPrefix = new PhoneNumber();
1243df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // The test metadata says US numbers cannot have prefix 240.
1244df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    numberWithInvalidPrefix.setCountryCode(1).setNationalNumber(2401234567L);
124552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber invalidNumberCopy = new PhoneNumber().mergeFrom(numberWithInvalidPrefix);
1246df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertFalse(phoneUtil.truncateTooLongNumber(numberWithInvalidPrefix));
1247df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests the number is not modified.
1248df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(invalidNumberCopy, numberWithInvalidPrefix);
1249df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
1250df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests what happens when a too short number is passed in.
125152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber tooShortNumber = new PhoneNumber().setCountryCode(1).setNationalNumber(1234L);
125252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber tooShortNumberCopy = new PhoneNumber().mergeFrom(tooShortNumber);
1253df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertFalse(phoneUtil.truncateTooLongNumber(tooShortNumber));
1254df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    // Tests the number is not modified.
1255df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia    assertEquals(tooShortNumberCopy, tooShortNumber);
1256df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia  }
1257df19cbfb8a1e8720bae76bb763ab29622e057c42Shaopeng Jia
12581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsViablePhoneNumber() {
12591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Only one or two digits before strange non-possible punctuation.
12601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("12. March"));
12611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("1+1+1"));
12621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("80+0"));
12631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("00"));
12641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Three digits is viable.
12651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("111"));
12661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Alpha numbers.
12671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("0800-4-pizza"));
12681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("0800-4-PIZZA"));
1269d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia  }
1270d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia
1271d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia  public void testIsViablePhoneNumberNonAscii() {
12721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Only one or two digits before possible punctuation followed by more digits.
12731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("1\u300034"));
12741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertFalse(PhoneNumberUtil.isViablePhoneNumber("1\u30003+4"));
12751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Unicode variants of possible starting character and other allowed punctuation/digits.
12761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("\uFF081\uFF09\u30003456789"));
12771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Testing a leading + is okay.
12781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(PhoneNumberUtil.isViablePhoneNumber("+1\uFF09\u30003456789"));
12791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
12801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
12811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testExtractPossibleNumber() {
12821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Removes preceding funky punctuation and letters but leaves the rest untouched.
12831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0800-345-600", PhoneNumberUtil.extractPossibleNumber("Tel:0800-345-600"));
12841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("0800 FOR PIZZA", PhoneNumberUtil.extractPossibleNumber("Tel:0800 FOR PIZZA"));
12851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Should not remove plus sign
12861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("+800-345-600", PhoneNumberUtil.extractPossibleNumber("Tel:+800-345-600"));
12871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Should recognise wide digits as possible start values.
12881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\uFF10\uFF12\uFF13",
12891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.extractPossibleNumber("\uFF10\uFF12\uFF13"));
12901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Dashes are not possible start values and should be removed.
12911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("\uFF11\uFF12\uFF13",
12921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.extractPossibleNumber("Num-\uFF11\uFF12\uFF13"));
12931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // If not possible number present, return empty string.
12941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("", PhoneNumberUtil.extractPossibleNumber("Num-...."));
12951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Leading brackets are stripped - these are not used when parsing.
12961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000"));
12977900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia
12987900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    // Trailing non-alpha-numeric characters should be removed.
12997900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000..- .."));
13007900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000."));
13017900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    // This case has a trailing RTL char.
13027900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia    assertEquals("650) 253-0000", PhoneNumberUtil.extractPossibleNumber("(650) 253-0000\u200F"));
13031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
13041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
13051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testMaybeStripNationalPrefix() {
130652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneMetadata metadata = new PhoneMetadata();
130752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    metadata.setNationalPrefixForParsing("34");
130852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    metadata.setGeneralDesc(new PhoneNumberDesc().setNationalNumberPattern("\\d{4,8}"));
1309372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    StringBuilder numberToStrip = new StringBuilder("34356778");
13101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String strippedNumber = "356778";
1311a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
13121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Should have had national prefix stripped.",
13131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber, numberToStrip.toString());
13141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Retry stripping - now the number should not start with the national prefix, so no more
13151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // stripping should occur.
1316a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
13171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Should have had no change - no national prefix present.",
13181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber, numberToStrip.toString());
13191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Some countries have no national prefix. Repeat test with none specified.
132052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    metadata.setNationalPrefixForParsing("");
1321a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
13221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Should not strip anything with empty national prefix.",
13231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber, numberToStrip.toString());
13241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // If the resultant number doesn't match the national rule, it shouldn't be stripped.
132552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    metadata.setNationalPrefixForParsing("3");
1326372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    numberToStrip = new StringBuilder("3123");
13271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    strippedNumber = "3123";
1328a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    assertFalse(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
13291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("Should have had no change - after stripping, it wouldn't have matched " +
13301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 "the national rule.",
13311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber, numberToStrip.toString());
133252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Test extracting carrier selection code.
133352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    metadata.setNationalPrefixForParsing("0(81)?");
1334372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    numberToStrip = new StringBuilder("08122123456");
133552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    strippedNumber = "22123456";
1336a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    StringBuilder carrierCode = new StringBuilder();
1337a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(
1338a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia        numberToStrip, metadata, carrierCode));
1339a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    assertEquals("81", carrierCode.toString());
134052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("Should have had national prefix and carrier code stripped.",
134152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 strippedNumber, numberToStrip.toString());
134252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // If there was a transform rule, check it was applied.
134352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    metadata.setNationalPrefixTransformRule("5$15");
134452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Note that a capturing group is present here.
134552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    metadata.setNationalPrefixForParsing("0(\\d{2})");
1346372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    numberToStrip = new StringBuilder("031123");
134752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    String transformedNumber = "5315123";
1348a48b2d221ba46df7446d1a87244efa985e8e292fShaopeng Jia    assertTrue(phoneUtil.maybeStripNationalPrefixAndCarrierCode(numberToStrip, metadata, null));
134952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("Should transform the 031 to a 5315.",
135052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 transformedNumber, numberToStrip.toString());
13511524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
13521524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1353f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testMaybeStripInternationalPrefix() {
13541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    String internationalPrefix = "00[39]";
1355372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    StringBuilder numberToStrip = new StringBuilder("0034567700-3898003");
13561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Note the dash is removed as part of the normalization.
1357372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    StringBuilder strippedNumber = new StringBuilder("45677003898003");
13585c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_NUMBER_WITH_IDD,
13595c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
13605c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
13611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied was not stripped of its international prefix.",
13621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
13635c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Now the number no longer starts with an IDD prefix, so it should now report
13645c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // FROM_DEFAULT_COUNTRY.
13655c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_DEFAULT_COUNTRY,
13665c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
13675c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
13681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1369372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    numberToStrip = new StringBuilder("00945677003898003");
13705c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_NUMBER_WITH_IDD,
13715c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
13725c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
13731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied was not stripped of its international prefix.",
13741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
13751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test it works when the international prefix is broken up by spaces.
1376372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    numberToStrip = new StringBuilder("00 9 45677003898003");
13775c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_NUMBER_WITH_IDD,
13785c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
13795c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
13801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied was not stripped of its international prefix.",
13811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
13825c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Now the number no longer starts with an IDD prefix, so it should now report
13835c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // FROM_DEFAULT_COUNTRY.
13845c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_DEFAULT_COUNTRY,
13855c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
13865c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
13871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
13881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test the + symbol is also recognised and stripped.
1389372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    numberToStrip = new StringBuilder("+45677003898003");
1390372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    strippedNumber = new StringBuilder("45677003898003");
13915c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN,
13925c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
13935c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
13941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied was not stripped of the plus symbol.",
13951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
13961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1397372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // If the number afterwards is a zero, we should not strip this - no country calling code begins
1398372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // with 0.
1399372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    numberToStrip = new StringBuilder("0090112-3123");
1400372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    strippedNumber = new StringBuilder("00901123123");
14015c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_DEFAULT_COUNTRY,
14025c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
14035c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
14041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("The number supplied had a 0 after the match so shouldn't be stripped.",
14051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 strippedNumber.toString(), numberToStrip.toString());
14061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Here the 0 is separated by a space from the IDD.
1407372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    numberToStrip = new StringBuilder("009 0-112-3123");
14085c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(CountryCodeSource.FROM_DEFAULT_COUNTRY,
14095c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                 phoneUtil.maybeStripInternationalPrefixAndNormalize(numberToStrip,
14105c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                                     internationalPrefix));
14111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
14121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
14131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testMaybeExtractCountryCode() {
141476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber number = new PhoneNumber();
141552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneMetadata metadata = phoneUtil.getMetadataForRegion(RegionCode.US);
14161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Note that for the US, the IDD is 011.
14171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "011112-3456789";
14191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String strippedNumber = "123456789";
1420372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      int countryCallingCode = 1;
1421372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
1422372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      assertEquals("Did not extract country calling code " + countryCallingCode + " correctly.",
1423372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                   countryCallingCode,
14245c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
14255c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
14265c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
14275c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_NUMBER_WITH_IDD, number.getCountryCodeSource());
14281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Should strip and normalize national significant number.
1429372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      assertEquals("Did not strip off the country calling code correctly.",
14301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   strippedNumber,
14311524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   numberToFill.toString());
14321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14331524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
14341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14355c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
14361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "+6423456789";
1438372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      int countryCallingCode = 64;
1439372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
1440372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      assertEquals("Did not extract country calling code " + countryCallingCode + " correctly.",
1441372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                   countryCallingCode,
14425c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
14435c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
14445c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
14455c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN, number.getCountryCodeSource());
14461524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
14481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14495c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
14501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
1451528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia      String phoneNumber = "+80012345678";
1452528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia      int countryCallingCode = 800;
1453528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
1454528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia      assertEquals("Did not extract country calling code " + countryCallingCode + " correctly.",
1455528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                   countryCallingCode,
1456528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
1457528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                                                     number));
1458528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
1459528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                   CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN, number.getCountryCodeSource());
1460528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    } catch (NumberParseException e) {
1461528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
1462528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    }
1463528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    number.clear();
1464528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    try {
14651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "2345-6789";
1466372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
1467372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      assertEquals(
1468372bff8dd464574d36737d47e495cad14346653cShaopeng Jia          "Should not have extracted a country calling code - no international prefix present.",
1469372bff8dd464574d36737d47e495cad14346653cShaopeng Jia          0,
1470372bff8dd464574d36737d47e495cad14346653cShaopeng Jia          phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true, number));
1471f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
14725c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_DEFAULT_COUNTRY, number.getCountryCodeSource());
14731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
14751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14765c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
14771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "0119991123456789";
1479372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
14805c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true, number);
1481372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      fail("Should have thrown an exception, no valid country calling code present.");
14821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
14831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected.
14841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
14851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
14861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
14871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
14885c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
14891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
14901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "(1 610) 619 4466";
1491372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      int countryCallingCode = 1;
1492372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
1493372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      assertEquals("Should have extracted the country calling code of the region passed in",
1494372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                   countryCallingCode,
14955c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
14965c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
14975c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
14985c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN,
14995c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   number.getCountryCodeSource());
15001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
15011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
15021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
15035c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
15045c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    try {
15055c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      String phoneNumber = "(1 610) 619 4466";
1506372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      int countryCallingCode = 1;
1507372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
1508372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      assertEquals("Should have extracted the country calling code of the region passed in",
1509372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                   countryCallingCode,
15105c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, false,
15115c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
15125c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertFalse("Should not contain CountryCodeSource.", number.hasCountryCodeSource());
15135c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    } catch (NumberParseException e) {
15145c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
15155c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    }
15165c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
15171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
15181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String phoneNumber = "(1 610) 619 446";
1519372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
1520372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      assertEquals("Should not have extracted a country calling code - invalid number after " +
1521372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                   "extraction of uncertain country calling code.",
15221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   0,
15235c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, false,
15245c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
15255c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertFalse("Should not contain CountryCodeSource.", number.hasCountryCodeSource());
15261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
15271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
15281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
15295c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    number.clear();
15301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
1531372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      String phoneNumber = "(1 610) 619";
1532372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      StringBuilder numberToFill = new StringBuilder();
1533372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      assertEquals("Should not have extracted a country calling code - too short number both " +
1534372bff8dd464574d36737d47e495cad14346653cShaopeng Jia                   "before and after extraction of uncertain country calling code.",
15351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   0,
15365c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   phoneUtil.maybeExtractCountryCode(phoneNumber, metadata, numberToFill, true,
15375c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                                                     number));
15385c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia      assertEquals("Did not figure out CountryCodeSource correctly",
15395c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia                   CountryCodeSource.FROM_DEFAULT_COUNTRY, number.getCountryCodeSource());
15401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
15411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Should not have thrown an exception: " + e.toString());
15421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
15431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
15441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
15451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testParseNationalNumber() throws Exception {
15461524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // National prefix attached.
154752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("033316005", RegionCode.NZ));
154852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("33316005", RegionCode.NZ));
15491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // National prefix attached and some formatting present.
155052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("03-331 6005", RegionCode.NZ));
155152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("03 331 6005", RegionCode.NZ));
1552b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    // Test parsing RFC3966 format with a phone context.
1553b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.NZ));
1554b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.NZ));
1555b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.US));
1556bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    // Test parsing RFC3966 format with optional user-defined parameters. The parameters will appear
1557bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    // after the context if present.
1558bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64;a=%A1",
1559bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia        RegionCode.NZ));
1560bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    // Test parsing RFC3966 with an ISDN subaddress.
1561bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;isub=12345;phone-context=+64",
1562bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia        RegionCode.NZ));
1563bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("tel:+64-3-331-6005;isub=12345", RegionCode.NZ));
15641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Testing international prefixes.
1565372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Should strip country calling code.
156652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("0064 3 331 6005", RegionCode.NZ));
15671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Try again, but this time we have an international number with Region Code US. It should
1568372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // recognise the country calling code and parse accordingly.
156952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("01164 3 331 6005", RegionCode.US));
157052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", RegionCode.US));
1571ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    // We should ignore the leading plus here, since it is not followed by a valid country code but
1572ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    // instead is followed by the IDD for the US.
1573ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("+01164 3 331 6005", RegionCode.US));
1574ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("+0064 3 331 6005", RegionCode.NZ));
1575ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("+ 00 64 3 331 6005", RegionCode.NZ));
15761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1577bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(US_LOCAL_NUMBER,
1578bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia        phoneUtil.parse("tel:253-0000;phone-context=www.google.com", RegionCode.US));
1579bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(US_LOCAL_NUMBER,
1580bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia        phoneUtil.parse("tel:253-0000;isub=12345;phone-context=www.google.com", RegionCode.US));
1581bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    // This is invalid because no "+" sign is present as part of phone-context. The phone context
1582bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    // is simply ignored in this case just as if it contains a domain.
1583bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(US_LOCAL_NUMBER,
1584bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia        phoneUtil.parse("tel:2530000;isub=12345;phone-context=1-650", RegionCode.US));
1585bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(US_LOCAL_NUMBER,
1586bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia        phoneUtil.parse("tel:2530000;isub=12345;phone-context=1234.com", RegionCode.US));
1587bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia
158852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
158976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(64123456L);
159052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("64(0)64123456", RegionCode.NZ));
15915c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Check that using a "/" is fine in a phone number.
159252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(DE_NUMBER, phoneUtil.parse("301/23456", RegionCode.DE));
15935c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
159476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usNumber = new PhoneNumber();
1595372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Check it doesn't use the '1' as a country calling code when parsing if the phone number was
1596372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // already possible.
159776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usNumber.setCountryCode(1).setNationalNumber(1234567890L);
159852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(usNumber, phoneUtil.parse("123-456-7890", RegionCode.US));
1599cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia
1600cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    // Test star numbers. Although this is not strictly valid, we would like to make sure we can
1601cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    // parse the output we produce when formatting the number.
1602cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    assertEquals(JP_STAR_NUMBER, phoneUtil.parse("+81 *2345", RegionCode.JP));
16035c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
16045c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
1605f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia  public void testParseNumberWithAlphaCharacters() throws Exception {
16065c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Test case with alpha characters.
160776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber tollfreeNumber = new PhoneNumber();
160876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    tollfreeNumber.setCountryCode(64).setNationalNumber(800332005L);
160952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(tollfreeNumber, phoneUtil.parse("0800 DDA 005", RegionCode.NZ));
161076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber premiumNumber = new PhoneNumber();
161176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    premiumNumber.setCountryCode(64).setNationalNumber(9003326005L);
161252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 DDA 6005", RegionCode.NZ));
16135c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Not enough alpha characters for them to be considered intentional, so they are stripped.
161452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 332 6005a", RegionCode.NZ));
161552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 332 600a5", RegionCode.NZ));
161652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 332 600A5", RegionCode.NZ));
161752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(premiumNumber, phoneUtil.parse("0900 a332 600A5", RegionCode.NZ));
16185c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
16191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
1620b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia  public void testParseMaliciousInput() throws Exception {
1621b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    // Lots of leading + signs before the possible number.
1622b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    StringBuilder maliciousNumber = new StringBuilder(6000);
1623b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    for (int i = 0; i < 6000; i++) {
1624b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      maliciousNumber.append('+');
1625b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    }
1626b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    maliciousNumber.append("12222-33-244 extensioB 343+");
1627b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    try {
1628b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      phoneUtil.parse(maliciousNumber.toString(), RegionCode.US);
1629b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      fail("This should not parse without throwing an exception " + maliciousNumber);
1630b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    } catch (NumberParseException e) {
1631b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      // Expected this exception.
1632b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
1633b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia                   NumberParseException.ErrorType.TOO_LONG,
1634b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia                   e.getErrorType());
1635b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    }
1636b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    StringBuilder maliciousNumberWithAlmostExt = new StringBuilder(6000);
1637b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    for (int i = 0; i < 350; i++) {
1638b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      maliciousNumberWithAlmostExt.append("200");
1639b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    }
1640b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    maliciousNumberWithAlmostExt.append(" extensiOB 345");
1641b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    try {
1642b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      phoneUtil.parse(maliciousNumberWithAlmostExt.toString(), RegionCode.US);
1643b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      fail("This should not parse without throwing an exception " + maliciousNumberWithAlmostExt);
1644b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    } catch (NumberParseException e) {
1645b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      // Expected this exception.
1646b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
1647b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia                   NumberParseException.ErrorType.TOO_LONG,
1648b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia                   e.getErrorType());
1649b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia    }
1650b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia  }
1651b0e21c22b1ca6b9aeb1426924cdf42a221c3d416Shaopeng Jia
16525c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseWithInternationalPrefixes() throws Exception {
165352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("+1 (650) 253-0000", RegionCode.NZ));
1654528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.parse("011 800 1234 5678", RegionCode.US));
165552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("1-650-253-0000", RegionCode.US));
16561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Calling the US number from Singapore by using different service providers
16571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // 1st test: calling using SingTel IDD service (IDD is 001)
165852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("0011-650-253-0000", RegionCode.SG));
16591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // 2nd test: calling using StarHub IDD service (IDD is 008)
166052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("0081-650-253-0000", RegionCode.SG));
16611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // 3rd test: calling using SingTel V019 service (IDD is 019)
166252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("0191-650-253-0000", RegionCode.SG));
16631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Calling the US number from Poland
166452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("0~01-650-253-0000", RegionCode.PL));
1665256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    // Using "++" at the start.
166652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("++1 (650) 253-0000", RegionCode.PL));
1667d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia  }
1668d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia
1669d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia  public void testParseNonAscii() throws Exception {
1670256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    // Using a full-width plus sign.
167152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B1 (650) 253-0000", RegionCode.SG));
1672bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    // Using a soft hyphen U+00AD.
1673bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("1 (650) 253\u00AD-0000", RegionCode.US));
1674256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    // The whole number, including punctuation, is here represented in full-width form.
167552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
167652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                            "\u3000\uFF12\uFF15\uFF13\uFF0D\uFF10\uFF10\uFF10" +
167752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                            "\uFF10",
167852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                            RegionCode.SG));
167974aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Using U+30FC dash instead.
168052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" +
168152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                            "\u3000\uFF12\uFF15\uFF13\u30FC\uFF10\uFF10\uFF10" +
168252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                            "\uFF10",
168352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                            RegionCode.SG));
1684d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia
1685d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia    // Using a very strange decimal digit range (Mongolian digits).
1686d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia    assertEquals(US_NUMBER, phoneUtil.parse("\u1811 \u1816\u1815\u1810 " +
1687d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia                                            "\u1812\u1815\u1813 \u1810\u1810\u1810\u1810",
1688d1db4c508088ac27cb0815a222cf2600f16ad5b9Shaopeng Jia                                            RegionCode.US));
16895c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
16901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
16915c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseWithLeadingZero() throws Exception {
169252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(IT_NUMBER, phoneUtil.parse("+39 02-36618 300", RegionCode.NZ));
169352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(IT_NUMBER, phoneUtil.parse("02-36618 300", RegionCode.IT));
16941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
169552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(IT_MOBILE, phoneUtil.parse("345 678 901", RegionCode.IT));
16965c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
16971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
16985c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseNationalNumberArgentina() throws Exception {
16991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test parsing mobile numbers of Argentina.
170076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber arNumber = new PhoneNumber();
170176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(93435551212L);
170252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 9 343 555 1212", RegionCode.AR));
170352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arNumber, phoneUtil.parse("0343 15 555 1212", RegionCode.AR));
17041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
170576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.clear();
170676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(93715654320L);
170752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 9 3715 65 4320", RegionCode.AR));
170852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arNumber, phoneUtil.parse("03715 15 65 4320", RegionCode.AR));
170952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(AR_MOBILE, phoneUtil.parse("911 876 54321", RegionCode.AR));
17101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
17111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test parsing fixed-line numbers of Argentina.
171252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(AR_NUMBER, phoneUtil.parse("+54 11 8765 4321", RegionCode.AR));
171352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(AR_NUMBER, phoneUtil.parse("011 8765 4321", RegionCode.AR));
17141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
171576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.clear();
171676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(3715654321L);
171752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 3715 65 4321", RegionCode.AR));
171852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arNumber, phoneUtil.parse("03715 65 4321", RegionCode.AR));
17191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
172076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.clear();
172176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arNumber.setCountryCode(54).setNationalNumber(2312340000L);
172252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arNumber, phoneUtil.parse("+54 23 1234 0000", RegionCode.AR));
172352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arNumber, phoneUtil.parse("023 1234 0000", RegionCode.AR));
17245c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
17251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
17265c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseWithXInNumber() throws Exception {
17271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test that having an 'x' in the phone number at the start is ok and that it just gets removed.
172852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(AR_NUMBER, phoneUtil.parse("01187654321", RegionCode.AR));
172952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(AR_NUMBER, phoneUtil.parse("(0) 1187654321", RegionCode.AR));
173052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(AR_NUMBER, phoneUtil.parse("0 1187654321", RegionCode.AR));
173152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(AR_NUMBER, phoneUtil.parse("(0xx) 1187654321", RegionCode.AR));
173276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber arFromUs = new PhoneNumber();
173376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    arFromUs.setCountryCode(54).setNationalNumber(81429712L);
17341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // This test is intentionally constructed such that the number of digit after xx is larger than
17351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // 7, so that the number won't be mistakenly treated as an extension, as we allow extensions up
17361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // to 7 digits. This assumption is okay for now as all the countries where a carrier selection
17371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // code is written in the form of xx have a national significant number of length larger than 7.
173852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(arFromUs, phoneUtil.parse("011xx5481429712", RegionCode.US));
17395c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  }
17401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
17415c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia  public void testParseNumbersMexico() throws Exception {
17421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test parsing fixed-line numbers of Mexico.
174376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber mxNumber = new PhoneNumber();
174476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mxNumber.setCountryCode(52).setNationalNumber(4499780001L);
174552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("+52 (449)978-0001", RegionCode.MX));
174652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("01 (449)978-0001", RegionCode.MX));
174752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("(449)978-0001", RegionCode.MX));
17481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
17491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test parsing mobile numbers of Mexico.
175076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mxNumber.clear();
175176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    mxNumber.setCountryCode(52).setNationalNumber(13312345678L);
175252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("+52 1 33 1234-5678", RegionCode.MX));
175352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("044 (33) 1234-5678", RegionCode.MX));
175452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(mxNumber, phoneUtil.parse("045 33 1234-5678", RegionCode.MX));
17551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
17561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
17571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testFailedParseOnInvalidNumbers() {
17581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
17591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String sentencePhoneNumber = "This is not a phone number";
176052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(sentencePhoneNumber, RegionCode.NZ);
17611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("This should not parse without throwing an exception " + sentencePhoneNumber);
17621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
17631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
17641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
17651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.NOT_A_NUMBER,
17661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
17671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
17681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
17691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String tooLongPhoneNumber = "01495 72553301873 810104";
177052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(tooLongPhoneNumber, RegionCode.GB);
17711524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("This should not parse without throwing an exception " + tooLongPhoneNumber);
17721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
17731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
17741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
17751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_LONG,
17761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
17771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
17781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
17794b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      String plusMinusPhoneNumber = "+---";
178052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(plusMinusPhoneNumber, RegionCode.DE);
17814b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      fail("This should not parse without throwing an exception " + plusMinusPhoneNumber);
17824b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    } catch (NumberParseException e) {
17834b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      // Expected this exception.
17844b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
17854b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   NumberParseException.ErrorType.NOT_A_NUMBER,
17864b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   e.getErrorType());
17874b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    }
17884b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    try {
1789cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      String plusStar = "+***";
1790cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      phoneUtil.parse(plusStar, RegionCode.DE);
1791cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      fail("This should not parse without throwing an exception " + plusStar);
1792cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    } catch (NumberParseException e) {
1793cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      // Expected this exception.
1794cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      assertEquals("Wrong error type stored in exception.",
1795cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia                   NumberParseException.ErrorType.NOT_A_NUMBER,
1796cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia                   e.getErrorType());
1797cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    }
1798cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    try {
1799cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      String plusStarPhoneNumber = "+*******91";
1800cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      phoneUtil.parse(plusStarPhoneNumber, RegionCode.DE);
1801cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      fail("This should not parse without throwing an exception " + plusStarPhoneNumber);
1802cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    } catch (NumberParseException e) {
1803cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      // Expected this exception.
1804cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia      assertEquals("Wrong error type stored in exception.",
1805cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia                   NumberParseException.ErrorType.NOT_A_NUMBER,
1806cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia                   e.getErrorType());
1807cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    }
1808cc0ae7326023c5da91dd9a84035c3dc3f6cc372fShaopeng Jia    try {
18091524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String tooShortPhoneNumber = "+49 0";
181052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(tooShortPhoneNumber, RegionCode.DE);
18111524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("This should not parse without throwing an exception " + tooShortPhoneNumber);
18121524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
18131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
18141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
18151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_NSN,
18161524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
18171524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
18181524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
18191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String invalidCountryCode = "+210 3456 56789";
182052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(invalidCountryCode, RegionCode.NZ);
1821372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      fail("This is not a recognised region code: should fail: " + invalidCountryCode);
18221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
18231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
18241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
18251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
18261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
18271524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
18281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
1829ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia      String plusAndIddAndInvalidCountryCode = "+ 00 210 3 331 6005";
1830ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia      phoneUtil.parse(plusAndIddAndInvalidCountryCode, RegionCode.NZ);
1831ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia      fail("This should not parse without throwing an exception.");
1832ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    } catch (NumberParseException e) {
1833ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia      // Expected this exception. 00 is a correct IDD, but 210 is not a valid country code.
1834ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
1835ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
1836ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia                   e.getErrorType());
1837ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    }
1838ca1e43d6e1fac07c7fc29c66c7da1fa9d7cf50f2Shaopeng Jia    try {
18391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "123 456 7890";
1840372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      phoneUtil.parse(someNumber, RegionCode.ZZ);
1841372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      fail("'Unknown' region code not allowed: should fail.");
18421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
18431524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
18441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
18451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
18461524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
18471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
18481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
18491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "123 456 7890";
185052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(someNumber, RegionCode.CS);
1851372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      fail("Deprecated region code not allowed: should fail.");
18524b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    } catch (NumberParseException e) {
18534b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      // Expected this exception.
18544b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
18554b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
18564b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   e.getErrorType());
18574b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    }
18584b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    try {
18594b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      String someNumber = "123 456 7890";
18601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      phoneUtil.parse(someNumber, null);
1861372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      fail("Null region code not allowed: should fail.");
18621524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
18631524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
18641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
18651524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
18661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
18671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
18681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
18691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "0044------";
187052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(someNumber, RegionCode.GB);
1871372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      fail("No number provided, only region code: should fail");
18721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
18731524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
18741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
18751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
18761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
18771524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
18781524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
18791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "0044";
188052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(someNumber, RegionCode.GB);
1881372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      fail("No number provided, only region code: should fail");
18821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
18831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
18841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
18851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
18861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
18871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
18881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
18891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "011";
189052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(someNumber, RegionCode.US);
18911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Only IDD provided - should fail.");
18921524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
18931524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
18941524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
18951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
18961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
18971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
18981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    try {
18991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      String someNumber = "0119";
190052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(someNumber, RegionCode.US);
19011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      fail("Only IDD provided and then 9 - should fail.");
19021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    } catch (NumberParseException e) {
19031524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      // Expected this exception.
19041524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
19051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD,
19061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                   e.getErrorType());
19071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    }
1908256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    try {
1909256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      String emptyNumber = "";
1910256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      // Invalid region.
191152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(emptyNumber, RegionCode.ZZ);
1912256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      fail("Empty string - should fail.");
1913256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    } catch (NumberParseException e) {
1914256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      // Expected this exception.
1915256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie      assertEquals("Wrong error type stored in exception.",
1916256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                   NumberParseException.ErrorType.NOT_A_NUMBER,
1917256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie                   e.getErrorType());
1918256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    }
191974aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    try {
192074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      String nullNumber = null;
192174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      // Invalid region.
192252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(nullNumber, RegionCode.ZZ);
192374aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      fail("Null string - should fail.");
192474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    } catch (NumberParseException e) {
192574aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      // Expected this exception.
192674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
192774aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                   NumberParseException.ErrorType.NOT_A_NUMBER,
192874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                   e.getErrorType());
192974aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    } catch (NullPointerException e) {
193074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      fail("Null string - but should not throw a null pointer exception.");
193174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    }
193274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    try {
193374aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      String nullNumber = null;
193452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parse(nullNumber, RegionCode.US);
193574aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      fail("Null string - should fail.");
193674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    } catch (NumberParseException e) {
193774aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      // Expected this exception.
193874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
193974aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                   NumberParseException.ErrorType.NOT_A_NUMBER,
194074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                   e.getErrorType());
194174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    } catch (NullPointerException e) {
194274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia      fail("Null string - but should not throw a null pointer exception.");
194374aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    }
1944b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    try {
1945bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia      String domainRfcPhoneContext = "tel:555-1234;phone-context=www.google.com";
1946bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia      phoneUtil.parse(domainRfcPhoneContext, RegionCode.ZZ);
1947bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia      fail("'Unknown' region code not allowed: should fail.");
1948b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    } catch (NumberParseException e) {
1949b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia      // Expected this exception.
1950b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
1951bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
1952b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia                   e.getErrorType());
1953b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    }
1954b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    try {
1955b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia      // This is invalid because no "+" sign is present as part of phone-context. This should not
1956b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia      // succeed in being parsed.
1957bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia      String invalidRfcPhoneContext = "tel:555-1234;phone-context=1-331";
1958bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia      phoneUtil.parse(invalidRfcPhoneContext, RegionCode.ZZ);
1959bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia      fail("'Unknown' region code not allowed: should fail.");
1960b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    } catch (NumberParseException e) {
1961b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia      // Expected this exception.
1962b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
1963bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
1964b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia                   e.getErrorType());
1965b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    }
19661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
19671524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
19684b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia  public void testParseNumbersWithPlusWithNoRegion() throws Exception {
1969372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // RegionCode.ZZ is allowed only if the number starts with a '+' - then the country calling code
1970372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // can be calculated.
197152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", RegionCode.ZZ));
197274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Test with full-width plus.
197352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("\uFF0B64 3 331 6005", RegionCode.ZZ));
197474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Test with normal plus but leading characters that need to be stripped.
197552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("Tel: +64 3 331 6005", RegionCode.ZZ));
197652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", null));
1977528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.parse("+800 1234 5678", null));
1978bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(UNIVERSAL_PREMIUM_RATE, phoneUtil.parse("+979 123 456 789", null));
197952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
1980b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    // Test parsing RFC3966 format with a phone context.
1981b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.ZZ));
1982b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("  tel:03-331-6005;phone-context=+64", RegionCode.ZZ));
1983bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;isub=12345;phone-context=+64",
1984bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia        RegionCode.ZZ));
1985b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia
198652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // It is important that we set the carrier code to an empty string, since we used
198752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // ParseAndKeepRawInput and no carrier code was found.
198852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber nzNumberWithRawInput = new PhoneNumber().mergeFrom(NZ_NUMBER).
198952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setRawInput("+64 3 331 6005").
199052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN).
199152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setPreferredDomesticCarrierCode("");
199252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(nzNumberWithRawInput, phoneUtil.parseAndKeepRawInput("+64 3 331 6005",
199352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                                                      RegionCode.ZZ));
19944b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Null is also allowed for the region code in these cases.
199552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(nzNumberWithRawInput, phoneUtil.parseAndKeepRawInput("+64 3 331 6005", null));
19964b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia  }
19974b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
19981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testParseExtensions() throws Exception {
199976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber nzNumber = new PhoneNumber();
200076f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setCountryCode(64).setNationalNumber(33316005L).setExtension("3456");
200152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03 331 6005 ext 3456", RegionCode.NZ));
200252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03-3316005x3456", RegionCode.NZ));
200352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03-3316005 int.3456", RegionCode.NZ));
200452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(nzNumber, phoneUtil.parse("03 3316005 #3456", RegionCode.NZ));
20051524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test the following do not extract extensions:
200652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ALPHA_NUMERIC_NUMBER, phoneUtil.parse("1800 six-flags", RegionCode.US));
200752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ALPHA_NUMERIC_NUMBER, phoneUtil.parse("1800 SIX FLAGS", RegionCode.US));
200852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ALPHA_NUMERIC_NUMBER, phoneUtil.parse("0~0 1800 7493 5247", RegionCode.PL));
200952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ALPHA_NUMERIC_NUMBER, phoneUtil.parse("(1800) 7493.5247", RegionCode.US));
20101524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Check that the last instance of an extension token is matched.
201152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber extnNumber = new PhoneNumber().mergeFrom(ALPHA_NUMERIC_NUMBER).setExtension("1234");
201252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(extnNumber, phoneUtil.parse("0~0 1800 7493 5247 ~1234", RegionCode.PL));
20131524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Verifying bug-fix where the last digit of a number was previously omitted if it was a 0 when
20141524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // extracting the extension. Also verifying a few different cases of extensions.
201576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber ukNumber = new PhoneNumber();
201676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    ukNumber.setCountryCode(44).setNationalNumber(2034567890L).setExtension("456");
201752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890x456", RegionCode.NZ));
201852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890x456", RegionCode.GB));
201952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 x456", RegionCode.GB));
202052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X456", RegionCode.GB));
202152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X 456", RegionCode.GB));
202252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 X  456", RegionCode.GB));
202352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890 x 456  ", RegionCode.GB));
202452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44 2034567890  X 456", RegionCode.GB));
2025372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+44-2034567890;ext=456", RegionCode.GB));
2026b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("tel:2034567890;ext=456;phone-context=+44",
2027b210e301245cb5dc90aa3142f378632bd41cb172Shaopeng Jia                                           RegionCode.ZZ));
2028528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // Full-width extension, "extn" only.
2029528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+442034567890\uFF45\uFF58\uFF54\uFF4E456",
2030528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                                           RegionCode.GB));
2031528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // "xtn" only.
2032528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+442034567890\uFF58\uFF54\uFF4E456",
2033528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                                           RegionCode.GB));
2034528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    // "xt" only.
2035528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(ukNumber, phoneUtil.parse("+442034567890\uFF58\uFF54456",
2036528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                                           RegionCode.GB));
20371524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
203876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usWithExtension = new PhoneNumber();
203976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usWithExtension.setCountryCode(1).setNationalNumber(8009013355L).setExtension("7246433");
204052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 x 7246433", RegionCode.US));
204152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 , ext 7246433", RegionCode.US));
20421524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(usWithExtension,
204352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.parse("(800) 901-3355 ,extension 7246433", RegionCode.US));
204474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(usWithExtension,
204552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.parse("(800) 901-3355 ,extensi\u00F3n 7246433", RegionCode.US));
204674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Repeat with the small letter o with acute accent created by combining characters.
204774aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(usWithExtension,
204852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.parse("(800) 901-3355 ,extensio\u0301n 7246433", RegionCode.US));
204952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 , 7246433", RegionCode.US));
205052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("(800) 901-3355 ext: 7246433", RegionCode.US));
20515c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
20525c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Test that if a number has two extensions specified, we ignore the second.
205376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber usWithTwoExtensionsNumber = new PhoneNumber();
205476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usWithTwoExtensionsNumber.setCountryCode(1).setNationalNumber(2121231234L).setExtension("508");
20555c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508/x1234",
205652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                                            RegionCode.US));
20575c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508/ x1234",
205852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                                            RegionCode.US));
20595c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    assertEquals(usWithTwoExtensionsNumber, phoneUtil.parse("(212)123-1234 x508\\x1234",
206052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                                                            RegionCode.US));
20615c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
20625c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Test parsing numbers in the form (645) 123-1234-910# works, where the last 3 digits before
20635c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // the # are an extension.
206476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usWithExtension.clear();
206576f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    usWithExtension.setCountryCode(1).setNationalNumber(6451231234L).setExtension("910");
206652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("+1 (645) 123 1234-910#", RegionCode.US));
20677c2324a9b0c98842a8f34ee79226c6606f843aafShaopeng Jia    // Retry with the same number in a slightly different format.
206852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(usWithExtension, phoneUtil.parse("+1 (645) 123 1234 ext. 910#", RegionCode.US));
20691524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
20701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
20717900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia  public void testParseAndKeepRaw() throws Exception {
207252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber alphaNumericNumber = new PhoneNumber().mergeFrom(ALPHA_NUMERIC_NUMBER).
207352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setRawInput("800 six-flags").
207452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_DEFAULT_COUNTRY).
207552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setPreferredDomesticCarrierCode("");
207676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertEquals(alphaNumericNumber,
207752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.parseAndKeepRawInput("800 six-flags", RegionCode.US));
20785c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
207952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber shorterAlphaNumber = new PhoneNumber().
208052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setCountryCode(1).setNationalNumber(8007493524L).
208152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setRawInput("1800 six-flag").
208252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITHOUT_PLUS_SIGN).
208352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setPreferredDomesticCarrierCode("");
208452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(shorterAlphaNumber,
208552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.parseAndKeepRawInput("1800 six-flag", RegionCode.US));
20865c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
208752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    shorterAlphaNumber.setRawInput("+1800 six-flag").
208876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN);
208952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(shorterAlphaNumber,
209052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.parseAndKeepRawInput("+1800 six-flag", RegionCode.NZ));
20915c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia
209252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    shorterAlphaNumber.setRawInput("001800 six-flag").
209376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_NUMBER_WITH_IDD);
209452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(shorterAlphaNumber,
209552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.parseAndKeepRawInput("001800 six-flag", RegionCode.NZ));
20964b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia
20974b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    // Invalid region code supplied.
20984b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    try {
209952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia      phoneUtil.parseAndKeepRawInput("123 456 7890", RegionCode.CS);
2100372bff8dd464574d36737d47e495cad14346653cShaopeng Jia      fail("Deprecated region code not allowed: should fail.");
21014b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    } catch (NumberParseException e) {
21024b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      // Expected this exception.
21034b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia      assertEquals("Wrong error type stored in exception.",
21044b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   NumberParseException.ErrorType.INVALID_COUNTRY_CODE,
21054b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia                   e.getErrorType());
21064b7846722d1a5acb0577b07e98324f744f5e7942Shaopeng Jia    }
210752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
210852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber koreanNumber = new PhoneNumber();
210952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    koreanNumber.setCountryCode(82).setNationalNumber(22123456).setRawInput("08122123456").
211052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setCountryCodeSource(CountryCodeSource.FROM_DEFAULT_COUNTRY).
211152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        setPreferredDomesticCarrierCode("81");
211252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(koreanNumber, phoneUtil.parseAndKeepRawInput("08122123456", RegionCode.KR));
21137900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia  }
21147900ea273b8c33b3c6f70d7dd559127938d0fc3dShaopeng Jia
21151524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testCountryWithNoNumberDesc() {
21165c24149d269da6e7d7b6b2797df096fdea64a019Shaopeng Jia    // Andorra is a country where we don't have PhoneNumberDesc info in the metadata.
211776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber adNumber = new PhoneNumber();
211876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    adNumber.setCountryCode(376).setNationalNumber(12345L);
2119256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+376 12345", phoneUtil.format(adNumber, PhoneNumberFormat.INTERNATIONAL));
2120256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("+37612345", phoneUtil.format(adNumber, PhoneNumberFormat.E164));
2121256a5f71a05ffd182a0fda2cfed6f93345cc889fLara Rennie    assertEquals("12345", phoneUtil.format(adNumber, PhoneNumberFormat.NATIONAL));
2122f59ccfca9dd02c4e3cf3e06b5cf184a8d0e67626Shaopeng Jia    assertEquals(PhoneNumberUtil.PhoneNumberType.UNKNOWN, phoneUtil.getNumberType(adNumber));
21231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertTrue(phoneUtil.isValidNumber(adNumber));
21241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
21251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test dialing a US number from within Andorra.
21261524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals("00 1 650 253 0000",
212752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.formatOutOfCountryCallingNumber(US_NUMBER, RegionCode.AD));
21281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
21291524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
21301524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testUnknownCountryCallingCodeForValidation() {
213176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber invalidNumber = new PhoneNumber();
21321524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    invalidNumber.setCountryCode(0).setNationalNumber(1234L);
213376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    assertFalse(phoneUtil.isValidNumber(invalidNumber));
21341524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
21351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
21361524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNumberMatchMatches() throws Exception {
2137372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Test simple matches where formatting is different, or leading zeroes, or country calling code
2138372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // has been specified.
21391524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
21401524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331 6005", "+64 03 331 6005"));
21411524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
2142528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.isNumberMatch("+800 1234 5678", "+80012345678"));
2143528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
21441524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 03 331-6005", "+64 03331 6005"));
21451524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
21461524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+643 331-6005", "+64033316005"));
21471524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
21481524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+643 331-6005", "+6433316005"));
21491524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
21501524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "+6433316005"));
2151bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
2152bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "tel:+64-3-331-6005;isub=123"));
21531524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test alpha numbers.
21541524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
21551524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+1800 siX-Flags", "+1 800 7493 5247"));
21561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test numbers with extensions.
21571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
21581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "+6433316005#1234"));
21591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Test proto buffers.
21601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
216152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(NZ_NUMBER, "+6403 331 6005"));
216252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
216352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber nzNumber = new PhoneNumber().mergeFrom(NZ_NUMBER).setExtension("3456");
21641524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
216552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(nzNumber, "+643 331 6005 ext 3456"));
21661524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Check empty extensions are ignored.
216776f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    nzNumber.setExtension("");
21681524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
216976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isNumberMatch(nzNumber, "+6403 331 6005"));
21701524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Check variant with two proto buffers.
217152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals("Number " + nzNumber.toString() + " did not match " + NZ_NUMBER.toString(),
21721524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 PhoneNumberUtil.MatchType.EXACT_MATCH,
217352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(nzNumber, NZ_NUMBER));
217452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia
217552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Check raw_input, country_code_source and preferred_domestic_carrier_code are ignored.
217652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber brNumberOne = new PhoneNumber();
217752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber brNumberTwo = new PhoneNumber();
217852699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    brNumberOne.setCountryCode(55).setNationalNumber(3121286979L)
217952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        .setCountryCodeSource(PhoneNumber.CountryCodeSource.FROM_NUMBER_WITH_PLUS_SIGN)
218052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        .setPreferredDomesticCarrierCode("12").setRawInput("012 3121286979");
218152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    brNumberTwo.setCountryCode(55).setNationalNumber(3121286979L)
218252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        .setCountryCodeSource(PhoneNumber.CountryCodeSource.FROM_DEFAULT_COUNTRY)
218352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia        .setPreferredDomesticCarrierCode("14").setRawInput("143121286979");
218452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH,
218552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(brNumberOne, brNumberTwo));
21861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
21871524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
21881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNumberMatchNonMatches() throws Exception {
21891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Non-matches.
21901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
21911524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("03 331 6005", "03 331 6006"));
2192528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
2193528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia                 phoneUtil.isNumberMatch("+800 1234 5678", "+1 800 1234 5678"));
2194372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Different country calling code, partial number match.
21951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
21961524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "+16433316005"));
2197372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Different country calling code, same number.
21981524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
21991524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "+6133316005"));
22001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Extension different, all else the same.
22011524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
22021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "0116433316005#1235"));
2203bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
2204bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                 phoneUtil.isNumberMatch(
2205bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                     "+64 3 331-6005 extn 1234", "tel:+64-3-331-6005;ext=1235"));
22061524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // NSN matches, but extension is different - not the same number.
22071524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NO_MATCH,
22081524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005 ext.1235", "3 331 6005#1234"));
220974aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
221074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Invalid numbers that can't be parsed.
221174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NOT_A_NUMBER,
221274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                 phoneUtil.isNumberMatch("43", "3 331 6043"));
221374aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NOT_A_NUMBER,
221474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                 phoneUtil.isNumberMatch("+43", "+64 3 331 6005"));
221574aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NOT_A_NUMBER,
221674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                 phoneUtil.isNumberMatch("+43", "64 3 331 6005"));
221774aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NOT_A_NUMBER,
221874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia                 phoneUtil.isNumberMatch("Dog", "64 3 331 6005"));
22191524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
22201524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
22211524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNumberMatchNsnMatches() throws Exception {
22221524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // NSN matches.
22231524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
22241524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "03 331 6005"));
22251524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
2226bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                 phoneUtil.isNumberMatch(
2227bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                     "+64 3 331-6005", "tel:03-331-6005;isub=1234;phone-context=abc.nz"));
2228bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
222952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(NZ_NUMBER, "03 331 6005"));
2230372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // Here the second number possibly starts with the country calling code for New Zealand,
2231372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // although we are unsure.
223252699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    PhoneNumber unchangedNzNumber = new PhoneNumber().mergeFrom(NZ_NUMBER);
223374aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
223452699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(unchangedNzNumber, "(64-3) 331 6005"));
22351524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Check the phone number proto was not edited during the method call.
223652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertEquals(NZ_NUMBER, unchangedNzNumber);
223774aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
223874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Here, the 1 might be a national prefix, if we compare it to the US number, so the resultant
223974aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // match is an NSN match.
224074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
224152699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(US_NUMBER, "1-650-253-0000"));
224274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
224352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(US_NUMBER, "6502530000"));
224474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
224552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch("+1 650-253 0000", "1 650 253 0000"));
224674aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
224752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch("1 650-253 0000", "1 650 253 0000"));
224874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH,
224952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch("1 650-253 0000", "+1 650 253 0000"));
225074aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // For this case, the match will be a short NSN match, because we cannot assume that the 1 might
225174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // be a national prefix, so don't remove it when parsing.
225274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    PhoneNumber randomNumber = new PhoneNumber();
225352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    randomNumber.setCountryCode(41).setNationalNumber(6502530000L);
225474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
225552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia                 phoneUtil.isNumberMatch(randomNumber, "1-650-253-0000"));
22561524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
22571524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia
22581524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  public void testIsNumberMatchShortNsnMatches() throws Exception {
22591524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Short NSN matches with the country not specified for either one or both numbers.
22601524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
22611524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "331 6005"));
2262bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
2263bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "tel:331-6005;phone-context=abc.nz"));
2264bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
2265bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005",
2266bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                     "tel:331-6005;isub=1234;phone-context=abc.nz"));
2267bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
2268bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005",
2269bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                     "tel:331-6005;isub=1234;phone-context=abc.nz;a=%A1"));
2270f7e0224b862054893f28d2736b3f6804d9935886Shaopeng Jia    // We did not know that the "0" was a national prefix since neither number has a country code,
2271f7e0224b862054893f28d2736b3f6804d9935886Shaopeng Jia    // so this is considered a SHORT_NSN_MATCH.
2272f7e0224b862054893f28d2736b3f6804d9935886Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
2273f7e0224b862054893f28d2736b3f6804d9935886Shaopeng Jia                 phoneUtil.isNumberMatch("3 331-6005", "03 331 6005"));
22741524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
22751524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("3 331-6005", "331 6005"));
22761524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
2277bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia                 phoneUtil.isNumberMatch("3 331-6005", "tel:331-6005;phone-context=abc.nz"));
2278bf5d9756fe9b13f5b2e0696c62949cea77396687Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
22791524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("3 331-6005", "+64 331 6005"));
22801524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // Short NSN match with the country specified.
22811524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
22821524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("03 331-6005", "331 6005"));
22831524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
22841524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("1 234 345 6789", "345 6789"));
22851524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
22861524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+1 (234) 345 6789", "345 6789"));
2287372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    // NSN matches, country calling code omitted for one number, extension missing for one.
22881524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
22891524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia                 phoneUtil.isNumberMatch("+64 3 331-6005", "3 331 6005#1234"));
22901524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // One has Italian leading zero, one does not.
229176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber italianNumberOne = new PhoneNumber();
229276f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    italianNumberOne.setCountryCode(39).setNationalNumber(1234L).setItalianLeadingZero(true);
229376f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    PhoneNumber italianNumberTwo = new PhoneNumber();
229476f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    italianNumberTwo.setCountryCode(39).setNationalNumber(1234L);
22951524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
229676f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isNumberMatch(italianNumberOne, italianNumberTwo));
22971524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    // One has an extension, the other has an extension of "".
229876f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    italianNumberOne.setExtension("1234").clearItalianLeadingZero();
229976f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia    italianNumberTwo.setExtension("");
23001524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia    assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH,
230176f6569af0619d12afd19991d8ff69a9bea4c142Shaopeng Jia                 phoneUtil.isNumberMatch(italianNumberOne, italianNumberTwo));
23021524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia  }
230374aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
230474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia  public void testCanBeInternationallyDialled() throws Exception {
230552699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // We have no-international-dialling rules for the US in our test metadata that say that
230652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // toll-free numbers cannot be dialled internationally.
230752699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertFalse(phoneUtil.canBeInternationallyDialled(US_TOLLFREE));
230874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
230952699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    // Normal US numbers can be internationally dialled.
231052699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.canBeInternationallyDialled(US_NUMBER));
231174aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
231274aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // Invalid number.
231352699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.canBeInternationallyDialled(US_LOCAL_NUMBER));
231474aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia
231574aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia    // We have no data for NZ - should return true.
231652699e08e855fb0957944b4e73358ad9e0007c0cShaopeng Jia    assertTrue(phoneUtil.canBeInternationallyDialled(NZ_NUMBER));
2317528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertTrue(phoneUtil.canBeInternationallyDialled(INTERNATIONAL_TOLL_FREE));
231874aa862e30b4d1b2722e90b1a8684274441a7541Shaopeng Jia  }
2319372bff8dd464574d36737d47e495cad14346653cShaopeng Jia
2320372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  public void testIsAlphaNumber() throws Exception {
2321372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertTrue(phoneUtil.isAlphaNumber("1800 six-flags"));
2322372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertTrue(phoneUtil.isAlphaNumber("1800 six-flags ext. 1234"));
2323528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertTrue(phoneUtil.isAlphaNumber("+800 six-flags"));
2324372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertFalse(phoneUtil.isAlphaNumber("1800 123-1234"));
2325372bff8dd464574d36737d47e495cad14346653cShaopeng Jia    assertFalse(phoneUtil.isAlphaNumber("1800 123-1234 extension: 1234"));
2326528b0d12a556ff0c2d16f99d56fcdd62657f433cShaopeng Jia    assertFalse(phoneUtil.isAlphaNumber("+800 1234-1234"));
2327372bff8dd464574d36737d47e495cad14346653cShaopeng Jia  }
23281524ca8c53cd2c3adee0bb2e2b95a93fee976862Shaopeng Jia}
2329