diff options
author | lararennie@google.com <lararennie@google.com@ee073f10-1060-11df-b6a4-87a95322a99c> | 2012-06-21 16:37:38 +0000 |
---|---|---|
committer | lararennie@google.com <lararennie@google.com@ee073f10-1060-11df-b6a4-87a95322a99c> | 2012-06-21 16:37:38 +0000 |
commit | d07b316282670a984dd0f12fa2b7bc7964ef097f (patch) | |
tree | 9d56a30bfbbb2e8bca0a712080e2216399da22c6 /java | |
parent | e525cae20884b5537687aea22abdd6280857096d (diff) | |
download | android_external_libphonenumbergoogle-d07b316282670a984dd0f12fa2b7bc7964ef097f.tar.gz android_external_libphonenumbergoogle-d07b316282670a984dd0f12fa2b7bc7964ef097f.tar.bz2 android_external_libphonenumbergoogle-d07b316282670a984dd0f12fa2b7bc7964ef097f.zip |
JAVA: libphonenumber v4.9. Patch prepared by davinci.
git-svn-id: http://libphonenumber.googlecode.com/svn/trunk@468 ee073f10-1060-11df-b6a4-87a95322a99c
Diffstat (limited to 'java')
21 files changed, 162 insertions, 52 deletions
diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/221_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/221_en Binary files differindex b876d30..87a8cc1 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/221_en +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/221_en diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/224_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/224_en Binary files differindex e63507d..1a9cae3 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/224_en +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/224_en diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/226_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/226_en Binary files differindex ed31886..41298f1 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/226_en +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/226_en diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/242_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/242_en Binary files differindex 86c316f..2ad2a1a 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/242_en +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/242_en diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_en Binary files differindex 59c00b9..7234500 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_en +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_en diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_pt b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_pt Binary files differindex 34cf12b..0395f3e 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_pt +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/244_pt diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en Binary files differindex 2738fe8..377f163 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_en diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_pt b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_pt Binary files differindex 2738fe8..40171fa 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_pt +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/245_pt diff --git a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config Binary files differindex 97f51e9..181a1e2 100644 --- a/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config +++ b/java/geocoder/src/com/google/i18n/phonenumbers/geocoding/data/config diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java b/java/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java index 0f4fe5c..e591daa 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMap.java @@ -31,10 +31,10 @@ public class CountryCodeToRegionCodeMap { // countries sharing a calling code, such as the NANPA countries, the one // indicated with "isMainCountryForCode" in the metadata should be first. static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { - // The capacity is set to 285 as there are 214 different country codes, + // The capacity is set to 286 as there are 215 different country codes, // and this offers a load factor of roughly 0.75. Map<Integer, List<String>> countryCodeToRegionCodeMap = - new HashMap<Integer, List<String>>(285); + new HashMap<Integer, List<String>>(286); ArrayList<String> listWithRegionCode; @@ -825,6 +825,10 @@ public class CountryCodeToRegionCodeMap { listWithRegionCode = new ArrayList<String>(1); listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(882, listWithRegionCode); + + listWithRegionCode = new ArrayList<String>(1); + listWithRegionCode.add("001"); countryCodeToRegionCodeMap.put(883, listWithRegionCode); listWithRegionCode = new ArrayList<String>(1); diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java b/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java index b267fac..d984bbe 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/PhoneNumberUtil.java @@ -59,7 +59,7 @@ public class PhoneNumberUtil { /** Flags to use when compiling regular expressions for phone numbers. */ static final int REGEX_FLAGS = Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE; // The minimum and maximum length of the national significant number. - private static final int MIN_LENGTH_FOR_NSN = 3; + private static final int MIN_LENGTH_FOR_NSN = 2; // The ITU says the maximum length should be 15, but we have found longer numbers in Germany. static final int MAX_LENGTH_FOR_NSN = 16; // The maximum length of the country calling code. @@ -103,9 +103,8 @@ public class PhoneNumberUtil { private static final String RFC3966_EXTN_PREFIX = ";ext="; private static final String RFC3966_PREFIX = "tel:"; - // We include the "+" here since RFC3966 format specifies that the context must be specified in - // international format. - private static final String RFC3966_PHONE_CONTEXT = ";phone-context=+"; + private static final String RFC3966_PHONE_CONTEXT = ";phone-context="; + private static final String RFC3966_ISDN_SUBADDRESS = ";isub="; // A map that contains characters that are essential when dialling. That means any of the // characters in this map must not be removed from a number when dialing, otherwise the call will @@ -173,7 +172,7 @@ public class PhoneNumberUtil { HashMap<Character, Character> diallableCharMap = new HashMap<Character, Character>(); diallableCharMap.putAll(asciiDigitMappings); - diallableCharMap.put('+', '+'); + diallableCharMap.put(PLUS_SIGN, PLUS_SIGN); diallableCharMap.put('*', '*'); DIALLABLE_CHAR_MAPPINGS = Collections.unmodifiableMap(diallableCharMap); @@ -220,7 +219,7 @@ public class PhoneNumberUtil { // placeholder for carrier information in some phone numbers. Full-width variants are also // present. static final String VALID_PUNCTUATION = "-x\u2010-\u2015\u2212\u30FC\uFF0D-\uFF0F " + - "\u00A0\u200B\u2060\u3000()\uFF08\uFF09\uFF3B\uFF3D.\\[\\]/~\u2053\u223C\uFF5E"; + "\u00A0\u00AD\u200B\u2060\u3000()\uFF08\uFF09\uFF3B\uFF3D.\\[\\]/~\u2053\u223C\uFF5E"; private static final String DIGITS = "\\p{Nd}"; // We accept alpha characters in phone numbers, ASCII only, upper and lower case. @@ -618,7 +617,7 @@ public class PhoneNumberUtil { /** * Checks to see if the string of characters could possibly be a phone number at all. At the - * moment, checks to see that the string begins with at least 3 digits, ignoring any punctuation + * moment, checks to see that the string begins with at least 2 digits, ignoring any punctuation * commonly found in phone numbers. * This method does not require the number to be normalized in advance - but does assume that * leading non-number symbols have been removed, such as by the method extractPossibleNumber. @@ -1342,7 +1341,9 @@ public class PhoneNumberUtil { // If no digit is inserted/removed/modified as a result of our formatting, we return the // formatted phone number; otherwise we return the raw input the user entered. return (formattedNumber != null && - normalizeDigitsOnly(formattedNumber).equals(normalizeDigitsOnly(rawInput))) + normalizeHelper(formattedNumber, DIALLABLE_CHAR_MAPPINGS, true /* remove non matches */) + .equals(normalizeHelper( + rawInput, DIALLABLE_CHAR_MAPPINGS, true /* remove non matches */))) ? formattedNumber : rawInput; } @@ -2273,7 +2274,7 @@ public class PhoneNumberUtil { phoneNumber.setCountryCodeSource(countryCodeSource); } if (countryCodeSource != CountryCodeSource.FROM_DEFAULT_COUNTRY) { - if (fullNumber.length() < MIN_LENGTH_FOR_NSN) { + if (fullNumber.length() <= MIN_LENGTH_FOR_NSN) { throw new NumberParseException(NumberParseException.ErrorType.TOO_SHORT_AFTER_IDD, "Phone number had an IDD, but after this was not " + "long enough to be a viable phone number."); @@ -2495,7 +2496,8 @@ public class PhoneNumberUtil { * particular region is not performed. This can be done separately with {@link #isValidNumber}. * * @param numberToParse number that we are attempting to parse. This can contain formatting - * such as +, ( and -, as well as a phone number extension. + * such as +, ( and -, as well as a phone number extension. It can also + * be provided in RFC3966 format. * @param defaultRegion region that we are expecting the number to be from. This is only used * if the number being parsed is not written in international format. * The country_code for the number in this case would be stored as that @@ -2614,24 +2616,8 @@ public class PhoneNumberUtil { "The string supplied was too long to parse."); } - int indexOfPhoneContext = numberToParse.indexOf(RFC3966_PHONE_CONTEXT); StringBuilder nationalNumber = new StringBuilder(); - if (indexOfPhoneContext > 0) { - // Prefix the number with the phone context. The offset here is because the context we are - // expecting to match should start with a "+" sign, and we want to include this at the start - // of the number. - nationalNumber.append(numberToParse.substring(indexOfPhoneContext + - RFC3966_PHONE_CONTEXT.length() - 1)); - // Now append everything between the "tel:" prefix and the phone-context. - nationalNumber.append(numberToParse.substring( - numberToParse.indexOf(RFC3966_PREFIX) + RFC3966_PREFIX.length(), indexOfPhoneContext)); - // Note that phone-contexts that are URLs will not be parsed - isViablePhoneNumber will throw - // an exception below. - } else { - // Extract a possible number from the string passed in (this strips leading characters that - // could not be the start of a phone number.) - nationalNumber.append(extractPossibleNumber(numberToParse)); - } + buildNationalNumberForParsing(numberToParse, nationalNumber); if (!isViablePhoneNumber(nationalNumber.toString())) { throw new NumberParseException(NumberParseException.ErrorType.NOT_A_NUMBER, @@ -2726,6 +2712,50 @@ public class PhoneNumberUtil { } /** + * Converts numberToParse to a form that we can parse and write it to nationalNumber if it is + * written in RFC3966; otherwise extract a possible number out of it and write to nationalNumber. + */ + private void buildNationalNumberForParsing(String numberToParse, StringBuilder nationalNumber) { + int indexOfPhoneContext = numberToParse.indexOf(RFC3966_PHONE_CONTEXT); + if (indexOfPhoneContext > 0) { + int phoneContextStart = indexOfPhoneContext + RFC3966_PHONE_CONTEXT.length(); + // If the phone context contains a phone number prefix, we need to capture it, whereas domains + // will be ignored. + if (numberToParse.charAt(phoneContextStart) == PLUS_SIGN) { + // Additional parameters might follow the phone context. If so, we will remove them here + // because the parameters after phone context are not important for parsing the + // phone number. + int phoneContextEnd = numberToParse.indexOf(';', phoneContextStart); + if (phoneContextEnd > 0) { + nationalNumber.append(numberToParse.substring(phoneContextStart, phoneContextEnd)); + } else { + nationalNumber.append(numberToParse.substring(phoneContextStart)); + } + } + + // Now append everything between the "tel:" prefix and the phone-context. This should include + // the national number, an optional extension or isdn-subaddress component. + nationalNumber.append(numberToParse.substring( + numberToParse.indexOf(RFC3966_PREFIX) + RFC3966_PREFIX.length(), indexOfPhoneContext)); + } else { + // Extract a possible number from the string passed in (this strips leading characters that + // could not be the start of a phone number.) + nationalNumber.append(extractPossibleNumber(numberToParse)); + } + + // Delete the isdn-subaddress and everything after it if it is present. Note extension won't + // appear at the same time with isdn-subaddress according to paragraph 5.3 of the RFC3966 spec, + int indexOfIsdn = nationalNumber.indexOf(RFC3966_ISDN_SUBADDRESS); + if (indexOfIsdn > 0) { + nationalNumber.delete(indexOfIsdn, nationalNumber.length()); + } + // If both phone context and isdn-subaddress are absent but other parameters are present, the + // parameters are left in nationalNumber. This is because we are concerned about deleting + // content from a potential number string when there is no strong evidence that the number is + // actually written in RFC3966. + } + + /** * Takes two phone numbers and compares them for equality. * * <p>Returns EXACT_MATCH if the country_code, NSN, presence of a leading zero for Italian numbers diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 Binary files differnew file mode 100644 index 0000000..9befe41 --- /dev/null +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_882 diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF Binary files differindex c1ad023..479d8fc 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_BF diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ Binary files differindex 484f15d..84ac0f5 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CZ diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES Binary files differindex fbc9960..d4bc38d 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_ES diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW Binary files differindex f1f6ed8..27a156e 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_KW diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java b/java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java index 8b78fe9..b93b3be 100644 --- a/java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/CountryCodeToRegionCodeMapForTesting.java @@ -31,10 +31,10 @@ public class CountryCodeToRegionCodeMapForTesting { // countries sharing a calling code, such as the NANPA countries, the one // indicated with "isMainCountryForCode" in the metadata should be first. static Map<Integer, List<String>> getCountryCodeToRegionCodeMap() { - // The capacity is set to 22 as there are 17 different country codes, + // The capacity is set to 24 as there are 18 different country codes, // and this offers a load factor of roughly 0.75. Map<Integer, List<String>> countryCodeToRegionCodeMap = - new HashMap<Integer, List<String>>(22); + new HashMap<Integer, List<String>>(24); ArrayList<String> listWithRegionCode; @@ -108,6 +108,10 @@ public class CountryCodeToRegionCodeMapForTesting { listWithRegionCode.add("001"); countryCodeToRegionCodeMap.put(800, listWithRegionCode); + listWithRegionCode = new ArrayList<String>(1); + listWithRegionCode.add("001"); + countryCodeToRegionCodeMap.put(979, listWithRegionCode); + return countryCodeToRegionCodeMap; } } diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java b/java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java index 1d23fc2..4d7b899 100644 --- a/java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/ExampleNumbersTest.java @@ -176,9 +176,8 @@ public class ExampleNumbersTest extends TestCase { assertEquals(0, wrongTypeCases.size()); } - // TODO: Update this to use connectsToEmergencyNumber or similar once that is - // implemented. public void testEmergency() throws Exception { + ShortNumberUtil shortUtil = new ShortNumberUtil(phoneNumberUtil); int wrongTypeCounter = 0; for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumberDesc desc = @@ -186,7 +185,7 @@ public class ExampleNumbersTest extends TestCase { if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); if (!exampleNumber.matches(desc.getPossibleNumberPattern()) || - !exampleNumber.matches(desc.getNationalNumberPattern())) { + !shortUtil.isEmergencyNumber(exampleNumber, regionCode)) { wrongTypeCounter++; LOGGER.log(Level.SEVERE, "Emergency example number test failed for " + regionCode); } diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java b/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java index 77e1c49..2b7f0a3 100644 --- a/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/PhoneNumberUtilTest.java @@ -99,8 +99,13 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { .setRawInput("000-000-0000"); private static final PhoneNumber INTERNATIONAL_TOLL_FREE = new PhoneNumber().setCountryCode(800).setNationalNumber(12345678L); + // We set this to be the same length as numbers for the other non-geographical country prefix that + // we have in our test metadata. However, this is not considered valid because they differ in + // their country calling code. private static final PhoneNumber INTERNATIONAL_TOLL_FREE_TOO_LONG = - new PhoneNumber().setCountryCode(800).setNationalNumber(1234567890L); + new PhoneNumber().setCountryCode(800).setNationalNumber(123456789L); + private static final PhoneNumber UNIVERSAL_PREMIUM_RATE = + new PhoneNumber().setCountryCode(979).setNationalNumber(123456789L); public void testGetSupportedRegions() { assertTrue(phoneUtil.getSupportedRegions().size() > 0); @@ -286,6 +291,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { public void testGetExampleNumberForNonGeoEntity() { assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.getExampleNumberForNonGeoEntity(800)); + assertEquals(UNIVERSAL_PREMIUM_RATE, phoneUtil.getExampleNumberForNonGeoEntity(979)); } public void testConvertAlphaCharactersInNumber() { @@ -296,7 +302,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { } public void testNormaliseRemovePunctuation() { - String inputNumber = "034-56&+#234"; + String inputNumber = "034-56&+#2\u00AD34"; String expectedOutput = "03456234"; assertEquals("Conversion did not correctly remove punctuation", expectedOutput, @@ -868,6 +874,12 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { phoneUtil.parseAndKeepRawInput("0011 16502530000", RegionCode.AU); assertEquals("0011 1 650 253 0000", phoneUtil.formatInOriginalFormat(outOfCountryNumberFromAU2, RegionCode.AU)); + + // Test the star sign is not removed from or added to the original input by this method. + PhoneNumber starNumber = phoneUtil.parseAndKeepRawInput("*1234", RegionCode.JP); + assertEquals("*1234", phoneUtil.formatInOriginalFormat(starNumber, RegionCode.JP)); + PhoneNumber numberWithoutStar = phoneUtil.parseAndKeepRawInput("1234", RegionCode.JP); + assertEquals("1234", phoneUtil.formatInOriginalFormat(numberWithoutStar, RegionCode.JP)); } public void testIsPremiumRate() { @@ -892,6 +904,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { premiumRateNumber.setCountryCode(49).setNationalNumber(90091234567L); assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, phoneUtil.getNumberType(premiumRateNumber)); + + assertEquals(PhoneNumberUtil.PhoneNumberType.PREMIUM_RATE, + phoneUtil.getNumberType(UNIVERSAL_PREMIUM_RATE)); } public void testIsTollFree() { @@ -977,6 +992,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertTrue(phoneUtil.isValidNumber(IT_NUMBER)); assertTrue(phoneUtil.isValidNumber(GB_MOBILE)); assertTrue(phoneUtil.isValidNumber(INTERNATIONAL_TOLL_FREE)); + assertTrue(phoneUtil.isValidNumber(UNIVERSAL_PREMIUM_RATE)); PhoneNumber nzNumber = new PhoneNumber().setCountryCode(64).setNationalNumber(21387835L); assertTrue(phoneUtil.isValidNumber(nzNumber)); @@ -1061,6 +1077,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForCountryCode(44)); assertEquals(RegionCode.DE, phoneUtil.getRegionCodeForCountryCode(49)); assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(800)); + assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForCountryCode(979)); } public void testGetRegionCodeForNumber() { @@ -1068,6 +1085,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(RegionCode.US, phoneUtil.getRegionCodeForNumber(US_NUMBER)); assertEquals(RegionCode.GB, phoneUtil.getRegionCodeForNumber(GB_MOBILE)); assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(INTERNATIONAL_TOLL_FREE)); + assertEquals(RegionCode.UN001, phoneUtil.getRegionCodeForNumber(UNIVERSAL_PREMIUM_RATE)); } public void testGetCountryCodeForRegion() { @@ -1158,7 +1176,7 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { adNumber.setCountryCode(376).setNationalNumber(12345L); assertEquals(PhoneNumberUtil.ValidationResult.IS_POSSIBLE, phoneUtil.isPossibleNumberWithReason(adNumber)); - adNumber.setCountryCode(376).setNationalNumber(13L); + adNumber.setCountryCode(376).setNationalNumber(1L); assertEquals(PhoneNumberUtil.ValidationResult.TOO_SHORT, phoneUtil.isPossibleNumberWithReason(adNumber)); adNumber.setCountryCode(376).setNationalNumber(12345678901234567L); @@ -1535,7 +1553,14 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("tel:331-6005;phone-context=+64-3", RegionCode.US)); - + // Test parsing RFC3966 format with optional user-defined parameters. The parameters will appear + // after the context if present. + assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64;a=%A1", + RegionCode.NZ)); + // Test parsing RFC3966 with an ISDN subaddress. + assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;isub=12345;phone-context=+64", + RegionCode.NZ)); + assertEquals(NZ_NUMBER, phoneUtil.parse("tel:+64-3-331-6005;isub=12345", RegionCode.NZ)); // Testing international prefixes. // Should strip country calling code. assertEquals(NZ_NUMBER, phoneUtil.parse("0064 3 331 6005", RegionCode.NZ)); @@ -1549,6 +1574,17 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(NZ_NUMBER, phoneUtil.parse("+0064 3 331 6005", RegionCode.NZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("+ 00 64 3 331 6005", RegionCode.NZ)); + assertEquals(US_LOCAL_NUMBER, + phoneUtil.parse("tel:253-0000;phone-context=www.google.com", RegionCode.US)); + assertEquals(US_LOCAL_NUMBER, + phoneUtil.parse("tel:253-0000;isub=12345;phone-context=www.google.com", RegionCode.US)); + // This is invalid because no "+" sign is present as part of phone-context. The phone context + // is simply ignored in this case just as if it contains a domain. + assertEquals(US_LOCAL_NUMBER, + phoneUtil.parse("tel:2530000;isub=12345;phone-context=1-650", RegionCode.US)); + assertEquals(US_LOCAL_NUMBER, + phoneUtil.parse("tel:2530000;isub=12345;phone-context=1234.com", RegionCode.US)); + PhoneNumber nzNumber = new PhoneNumber(); nzNumber.setCountryCode(64).setNationalNumber(64123456L); assertEquals(nzNumber, phoneUtil.parse("64(0)64123456", RegionCode.NZ)); @@ -1633,6 +1669,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { public void testParseNonAscii() throws Exception { // Using a full-width plus sign. assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B1 (650) 253-0000", RegionCode.SG)); + // Using a soft hyphen U+00AD. + assertEquals(US_NUMBER, phoneUtil.parse("1 (650) 253\u00AD-0000", RegionCode.US)); // The whole number, including punctuation, is here represented in full-width form. assertEquals(US_NUMBER, phoneUtil.parse("\uFF0B\uFF11\u3000\uFF08\uFF16\uFF15\uFF10\uFF09" + "\u3000\uFF12\uFF15\uFF13\uFF0D\uFF10\uFF10\uFF10" + @@ -1904,31 +1942,26 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { fail("Null string - but should not throw a null pointer exception."); } try { - String domainRfcPhoneContext = "tel:555-1234;phone-context:www.google.com"; - phoneUtil.parse(domainRfcPhoneContext, RegionCode.US); - fail("Domain provided for phone context - should fail."); + String domainRfcPhoneContext = "tel:555-1234;phone-context=www.google.com"; + phoneUtil.parse(domainRfcPhoneContext, RegionCode.ZZ); + fail("'Unknown' region code not allowed: should fail."); } catch (NumberParseException e) { // Expected this exception. assertEquals("Wrong error type stored in exception.", - NumberParseException.ErrorType.NOT_A_NUMBER, + NumberParseException.ErrorType.INVALID_COUNTRY_CODE, e.getErrorType()); - } catch (NullPointerException e) { - fail("Domain provided for phone context - but should not throw a null pointer exception."); } try { // This is invalid because no "+" sign is present as part of phone-context. This should not // succeed in being parsed. - String invalidRfcPhoneContext = "tel:555-1234;phone-context:1-331"; - phoneUtil.parse(invalidRfcPhoneContext, RegionCode.US); - fail("No leading plus provided in phone context - should fail."); + String invalidRfcPhoneContext = "tel:555-1234;phone-context=1-331"; + phoneUtil.parse(invalidRfcPhoneContext, RegionCode.ZZ); + fail("'Unknown' region code not allowed: should fail."); } catch (NumberParseException e) { // Expected this exception. assertEquals("Wrong error type stored in exception.", - NumberParseException.ErrorType.NOT_A_NUMBER, + NumberParseException.ErrorType.INVALID_COUNTRY_CODE, e.getErrorType()); - } catch (NullPointerException e) { - fail("No leading plus provided in phone context - but should not throw a null pointer " + - "exception."); } } @@ -1942,10 +1975,13 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(NZ_NUMBER, phoneUtil.parse("Tel: +64 3 331 6005", RegionCode.ZZ)); assertEquals(NZ_NUMBER, phoneUtil.parse("+64 3 331 6005", null)); assertEquals(INTERNATIONAL_TOLL_FREE, phoneUtil.parse("+800 1234 5678", null)); + assertEquals(UNIVERSAL_PREMIUM_RATE, phoneUtil.parse("+979 123 456 789", null)); // Test parsing RFC3966 format with a phone context. assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;phone-context=+64", RegionCode.ZZ)); assertEquals(NZ_NUMBER, phoneUtil.parse(" tel:03-331-6005;phone-context=+64", RegionCode.ZZ)); + assertEquals(NZ_NUMBER, phoneUtil.parse("tel:03-331-6005;isub=12345;phone-context=+64", + RegionCode.ZZ)); // It is important that we set the carrier code to an empty string, since we used // ParseAndKeepRawInput and no carrier code was found. @@ -2112,6 +2148,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { phoneUtil.isNumberMatch("+643 331-6005", "+6433316005")); assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, phoneUtil.isNumberMatch("+64 3 331-6005", "+6433316005")); + assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, + phoneUtil.isNumberMatch("+64 3 331-6005", "tel:+64-3-331-6005;isub=123")); // Test alpha numbers. assertEquals(PhoneNumberUtil.MatchType.EXACT_MATCH, phoneUtil.isNumberMatch("+1800 siX-Flags", "+1 800 7493 5247")); @@ -2162,6 +2200,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { // Extension different, all else the same. assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, phoneUtil.isNumberMatch("+64 3 331-6005 extn 1234", "0116433316005#1235")); + assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, + phoneUtil.isNumberMatch( + "+64 3 331-6005 extn 1234", "tel:+64-3-331-6005;ext=1235")); // NSN matches, but extension is different - not the same number. assertEquals(PhoneNumberUtil.MatchType.NO_MATCH, phoneUtil.isNumberMatch("+64 3 331-6005 ext.1235", "3 331 6005#1234")); @@ -2182,6 +2223,9 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, phoneUtil.isNumberMatch("+64 3 331-6005", "03 331 6005")); assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, + phoneUtil.isNumberMatch( + "+64 3 331-6005", "tel:03-331-6005;isub=1234;phone-context=abc.nz")); + assertEquals(PhoneNumberUtil.MatchType.NSN_MATCH, phoneUtil.isNumberMatch(NZ_NUMBER, "03 331 6005")); // Here the second number possibly starts with the country calling code for New Zealand, // although we are unsure. @@ -2215,6 +2259,14 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { // Short NSN matches with the country not specified for either one or both numbers. assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, phoneUtil.isNumberMatch("+64 3 331-6005", "331 6005")); + assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, + phoneUtil.isNumberMatch("+64 3 331-6005", "tel:331-6005;phone-context=abc.nz")); + assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, + phoneUtil.isNumberMatch("+64 3 331-6005", + "tel:331-6005;isub=1234;phone-context=abc.nz")); + assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, + phoneUtil.isNumberMatch("+64 3 331-6005", + "tel:331-6005;isub=1234;phone-context=abc.nz;a=%A1")); // We did not know that the "0" was a national prefix since neither number has a country code, // so this is considered a SHORT_NSN_MATCH. assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, @@ -2222,6 +2274,8 @@ public class PhoneNumberUtilTest extends TestMetadataTestCase { assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, phoneUtil.isNumberMatch("3 331-6005", "331 6005")); assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, + phoneUtil.isNumberMatch("3 331-6005", "tel:331-6005;phone-context=abc.nz")); + assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, phoneUtil.isNumberMatch("3 331-6005", "+64 331 6005")); // Short NSN match with the country specified. assertEquals(PhoneNumberUtil.MatchType.SHORT_NSN_MATCH, diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_979 b/java/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_979 Binary files differnew file mode 100644 index 0000000..0c143ce --- /dev/null +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/data/PhoneNumberMetadataProtoForTesting_979 diff --git a/java/release_notes.txt b/java/release_notes.txt index 3158778..f7aae05 100644 --- a/java/release_notes.txt +++ b/java/release_notes.txt @@ -1,8 +1,27 @@ +June 21st, 2012: libphonenumber-4.9 +* Bug fix + - formatInOriginalFormat fixed not to add a star sign if it was not present + originally. +* Metadata changes + - BF, CZ, ES, KW + - Non-geographical entities with calling code 882 (BebbiCell, Maritime + Communications, Oration Technologies, Telespazio and Thuraya) + - Geocoding data updates for country calling codes 221, 224, 226, 242, 244, 245 +* Functionality changes: + - Minimum allowed length for a national significant number (NSN) when parsing + changed from 3 to 2. + - Support parsing of RFC3966-formatted strings with an isdn-subaddress or extra + parameters specified. + - Allow soft hyphen to appear in phone numbers (\u00AD) +* Testing changes: + - Add extra unit tests for non-geographical phone number entities + - ExampleNumbersTest testEmergency tests now uses ShortNumberUtil + June 14th, 2012: libphonenumber-4.8.5 * Metadata update only: - AC, CR, DE, DK, IL, IN, IS, KH, LI, LR, MA, MD, MK, PA, SA, SG, SS -June 5th, 2012: libphonenumber-4.8.4 +June 6th, 2012: libphonenumber-4.8.4 * Metadata update only: - AE, RO - Non-geographical entity with calling code 881 (Iridium) |