/* * Copyright (C) 2013 The Libphonenumber Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.i18n.phonenumbers; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; /** * Unit tests for ShortNumberInfo.java * * @author Shaopeng Jia */ public class ShortNumberInfoTest extends TestMetadataTestCase { private static final ShortNumberInfo shortInfo = ShortNumberInfo.getInstance(); public void testIsPossibleShortNumber() { PhoneNumber possibleNumber = new PhoneNumber(); possibleNumber.setCountryCode(33).setNationalNumber(123456L); assertTrue(shortInfo.isPossibleShortNumber(possibleNumber)); assertTrue( shortInfo.isPossibleShortNumberForRegion(parse("123456", RegionCode.FR), RegionCode.FR)); PhoneNumber impossibleNumber = new PhoneNumber(); impossibleNumber.setCountryCode(33).setNationalNumber(9L); assertFalse(shortInfo.isPossibleShortNumber(impossibleNumber)); // Note that GB and GG share the country calling code 44, and that this number is possible but // not valid. assertTrue(shortInfo.isPossibleShortNumber( new PhoneNumber().setCountryCode(44).setNationalNumber(11001L))); } public void testIsValidShortNumber() { assertTrue(shortInfo.isValidShortNumber( new PhoneNumber().setCountryCode(33).setNationalNumber(1010L))); assertTrue(shortInfo.isValidShortNumberForRegion(parse("1010", RegionCode.FR), RegionCode.FR)); assertFalse(shortInfo.isValidShortNumber( new PhoneNumber().setCountryCode(33).setNationalNumber(123456L))); assertFalse( shortInfo.isValidShortNumberForRegion(parse("123456", RegionCode.FR), RegionCode.FR)); // Note that GB and GG share the country calling code 44. assertTrue(shortInfo.isValidShortNumber( new PhoneNumber().setCountryCode(44).setNationalNumber(18001L))); } public void testIsCarrierSpecific() { PhoneNumber carrierSpecificNumber = new PhoneNumber(); carrierSpecificNumber.setCountryCode(1).setNationalNumber(33669L); assertTrue(shortInfo.isCarrierSpecific(carrierSpecificNumber)); assertTrue( shortInfo.isCarrierSpecificForRegion(parse("33669", RegionCode.US), RegionCode.US)); PhoneNumber notCarrierSpecificNumber = new PhoneNumber(); notCarrierSpecificNumber.setCountryCode(1).setNationalNumber(911L); assertFalse(shortInfo.isCarrierSpecific(notCarrierSpecificNumber)); assertFalse( shortInfo.isCarrierSpecificForRegion(parse("911", RegionCode.US), RegionCode.US)); PhoneNumber carrierSpecificNumberForSomeRegion = new PhoneNumber(); carrierSpecificNumberForSomeRegion.setCountryCode(1).setNationalNumber(211L); assertTrue(shortInfo.isCarrierSpecific(carrierSpecificNumberForSomeRegion)); assertTrue( shortInfo.isCarrierSpecificForRegion(carrierSpecificNumberForSomeRegion, RegionCode.US)); assertFalse( shortInfo.isCarrierSpecificForRegion(carrierSpecificNumberForSomeRegion, RegionCode.BB)); } public void testGetExpectedCost() { String premiumRateExample = shortInfo.getExampleShortNumberForCost(RegionCode.FR, ShortNumberInfo.ShortNumberCost.PREMIUM_RATE); assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCostForRegion( parse(premiumRateExample, RegionCode.FR), RegionCode.FR)); PhoneNumber premiumRateNumber = new PhoneNumber(); premiumRateNumber.setCountryCode(33).setNationalNumber(Integer.parseInt(premiumRateExample)); assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCost(premiumRateNumber)); String standardRateExample = shortInfo.getExampleShortNumberForCost(RegionCode.FR, ShortNumberInfo.ShortNumberCost.STANDARD_RATE); assertEquals(ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCostForRegion( parse(standardRateExample, RegionCode.FR), RegionCode.FR)); PhoneNumber standardRateNumber = new PhoneNumber(); standardRateNumber.setCountryCode(33).setNationalNumber(Integer.parseInt(standardRateExample)); assertEquals(ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCost(standardRateNumber)); String tollFreeExample = shortInfo.getExampleShortNumberForCost(RegionCode.FR, ShortNumberInfo.ShortNumberCost.TOLL_FREE); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion(parse(tollFreeExample, RegionCode.FR), RegionCode.FR)); PhoneNumber tollFreeNumber = new PhoneNumber(); tollFreeNumber.setCountryCode(33).setNationalNumber(Integer.parseInt(tollFreeExample)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCost(tollFreeNumber)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion(parse("12345", RegionCode.FR), RegionCode.FR)); PhoneNumber unknownCostNumber = new PhoneNumber(); unknownCostNumber.setCountryCode(33).setNationalNumber(12345L); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(unknownCostNumber)); // Test that an invalid number may nevertheless have a cost other than UNKNOWN_COST. assertFalse( shortInfo.isValidShortNumberForRegion(parse("116123", RegionCode.FR), RegionCode.FR)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion(parse("116123", RegionCode.FR), RegionCode.FR)); PhoneNumber invalidNumber = new PhoneNumber(); invalidNumber.setCountryCode(33).setNationalNumber(116123L); assertFalse(shortInfo.isValidShortNumber(invalidNumber)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCost(invalidNumber)); // Test a nonexistent country code. assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion(parse("911", RegionCode.US), RegionCode.ZZ)); unknownCostNumber.clear(); unknownCostNumber.setCountryCode(123).setNationalNumber(911L); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(unknownCostNumber)); } public void testGetExpectedCostForSharedCountryCallingCode() { // Test some numbers which have different costs in countries sharing the same country calling // code. In Australia, 1234 is premium-rate, 1194 is standard-rate, and 733 is toll-free. These // are not known to be valid numbers in the Christmas Islands. String ambiguousPremiumRateString = "1234"; PhoneNumber ambiguousPremiumRateNumber = new PhoneNumber().setCountryCode(61).setNationalNumber(1234L); String ambiguousStandardRateString = "1194"; PhoneNumber ambiguousStandardRateNumber = new PhoneNumber().setCountryCode(61).setNationalNumber(1194L); String ambiguousTollFreeString = "733"; PhoneNumber ambiguousTollFreeNumber = new PhoneNumber().setCountryCode(61).setNationalNumber(733L); assertTrue(shortInfo.isValidShortNumber(ambiguousPremiumRateNumber)); assertTrue(shortInfo.isValidShortNumber(ambiguousStandardRateNumber)); assertTrue(shortInfo.isValidShortNumber(ambiguousTollFreeNumber)); assertTrue(shortInfo.isValidShortNumberForRegion( parse(ambiguousPremiumRateString, RegionCode.AU), RegionCode.AU)); assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCostForRegion( parse(ambiguousPremiumRateString, RegionCode.AU), RegionCode.AU)); assertFalse(shortInfo.isValidShortNumberForRegion( parse(ambiguousPremiumRateString, RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( parse(ambiguousPremiumRateString, RegionCode.CX), RegionCode.CX)); // PREMIUM_RATE takes precedence over UNKNOWN_COST. assertEquals(ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCost(ambiguousPremiumRateNumber)); assertTrue(shortInfo.isValidShortNumberForRegion( parse(ambiguousStandardRateString, RegionCode.AU), RegionCode.AU)); assertEquals(ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCostForRegion( parse(ambiguousStandardRateString, RegionCode.AU), RegionCode.AU)); assertFalse(shortInfo.isValidShortNumberForRegion( parse(ambiguousStandardRateString, RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( parse(ambiguousStandardRateString, RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(ambiguousStandardRateNumber)); assertTrue(shortInfo.isValidShortNumberForRegion(parse(ambiguousTollFreeString, RegionCode.AU), RegionCode.AU)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( parse(ambiguousTollFreeString, RegionCode.AU), RegionCode.AU)); assertFalse(shortInfo.isValidShortNumberForRegion(parse(ambiguousTollFreeString, RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( parse(ambiguousTollFreeString, RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(ambiguousTollFreeNumber)); } public void testGetExampleShortNumber() { assertEquals("8711", shortInfo.getExampleShortNumber(RegionCode.AM)); assertEquals("1010", shortInfo.getExampleShortNumber(RegionCode.FR)); assertEquals("", shortInfo.getExampleShortNumber(RegionCode.UN001)); assertEquals("", shortInfo.getExampleShortNumber(null)); } public void testGetExampleShortNumberForCost() { assertEquals("3010", shortInfo.getExampleShortNumberForCost(RegionCode.FR, ShortNumberInfo.ShortNumberCost.TOLL_FREE)); assertEquals("1023", shortInfo.getExampleShortNumberForCost(RegionCode.FR, ShortNumberInfo.ShortNumberCost.STANDARD_RATE)); assertEquals("42000", shortInfo.getExampleShortNumberForCost(RegionCode.FR, ShortNumberInfo.ShortNumberCost.PREMIUM_RATE)); assertEquals("", shortInfo.getExampleShortNumberForCost(RegionCode.FR, ShortNumberInfo.ShortNumberCost.UNKNOWN_COST)); } public void testConnectsToEmergencyNumber_US() { assertTrue(shortInfo.connectsToEmergencyNumber("911", RegionCode.US)); assertTrue(shortInfo.connectsToEmergencyNumber("112", RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber("999", RegionCode.US)); } public void testConnectsToEmergencyNumberLongNumber_US() { assertTrue(shortInfo.connectsToEmergencyNumber("9116666666", RegionCode.US)); assertTrue(shortInfo.connectsToEmergencyNumber("1126666666", RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber("9996666666", RegionCode.US)); } public void testConnectsToEmergencyNumberWithFormatting_US() { assertTrue(shortInfo.connectsToEmergencyNumber("9-1-1", RegionCode.US)); assertTrue(shortInfo.connectsToEmergencyNumber("1-1-2", RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber("9-9-9", RegionCode.US)); } public void testConnectsToEmergencyNumberWithPlusSign_US() { assertFalse(shortInfo.connectsToEmergencyNumber("+911", RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber("\uFF0B911", RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber(" +911", RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber("+112", RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber("+999", RegionCode.US)); } public void testConnectsToEmergencyNumber_BR() { assertTrue(shortInfo.connectsToEmergencyNumber("911", RegionCode.BR)); assertTrue(shortInfo.connectsToEmergencyNumber("190", RegionCode.BR)); assertFalse(shortInfo.connectsToEmergencyNumber("999", RegionCode.BR)); } public void testConnectsToEmergencyNumberLongNumber_BR() { // Brazilian emergency numbers don't work when additional digits are appended. assertFalse(shortInfo.connectsToEmergencyNumber("9111", RegionCode.BR)); assertFalse(shortInfo.connectsToEmergencyNumber("1900", RegionCode.BR)); assertFalse(shortInfo.connectsToEmergencyNumber("9996", RegionCode.BR)); } public void testConnectsToEmergencyNumber_CL() { assertTrue(shortInfo.connectsToEmergencyNumber("131", RegionCode.CL)); assertTrue(shortInfo.connectsToEmergencyNumber("133", RegionCode.CL)); } public void testConnectsToEmergencyNumberLongNumber_CL() { // Chilean emergency numbers don't work when additional digits are appended. assertFalse(shortInfo.connectsToEmergencyNumber("1313", RegionCode.CL)); assertFalse(shortInfo.connectsToEmergencyNumber("1330", RegionCode.CL)); } public void testConnectsToEmergencyNumber_AO() { // Angola doesn't have any metadata for emergency numbers in the test metadata. assertFalse(shortInfo.connectsToEmergencyNumber("911", RegionCode.AO)); assertFalse(shortInfo.connectsToEmergencyNumber("222123456", RegionCode.AO)); assertFalse(shortInfo.connectsToEmergencyNumber("923123456", RegionCode.AO)); } public void testConnectsToEmergencyNumber_ZW() { // Zimbabwe doesn't have any metadata in the test metadata. assertFalse(shortInfo.connectsToEmergencyNumber("911", RegionCode.ZW)); assertFalse(shortInfo.connectsToEmergencyNumber("01312345", RegionCode.ZW)); assertFalse(shortInfo.connectsToEmergencyNumber("0711234567", RegionCode.ZW)); } public void testIsEmergencyNumber_US() { assertTrue(shortInfo.isEmergencyNumber("911", RegionCode.US)); assertTrue(shortInfo.isEmergencyNumber("112", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("999", RegionCode.US)); } public void testIsEmergencyNumberLongNumber_US() { assertFalse(shortInfo.isEmergencyNumber("9116666666", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("1126666666", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("9996666666", RegionCode.US)); } public void testIsEmergencyNumberWithFormatting_US() { assertTrue(shortInfo.isEmergencyNumber("9-1-1", RegionCode.US)); assertTrue(shortInfo.isEmergencyNumber("*911", RegionCode.US)); assertTrue(shortInfo.isEmergencyNumber("1-1-2", RegionCode.US)); assertTrue(shortInfo.isEmergencyNumber("*112", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("9-9-9", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("*999", RegionCode.US)); } public void testIsEmergencyNumberWithPlusSign_US() { assertFalse(shortInfo.isEmergencyNumber("+911", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("\uFF0B911", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber(" +911", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("+112", RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("+999", RegionCode.US)); } public void testIsEmergencyNumber_BR() { assertTrue(shortInfo.isEmergencyNumber("911", RegionCode.BR)); assertTrue(shortInfo.isEmergencyNumber("190", RegionCode.BR)); assertFalse(shortInfo.isEmergencyNumber("999", RegionCode.BR)); } public void testIsEmergencyNumberLongNumber_BR() { assertFalse(shortInfo.isEmergencyNumber("9111", RegionCode.BR)); assertFalse(shortInfo.isEmergencyNumber("1900", RegionCode.BR)); assertFalse(shortInfo.isEmergencyNumber("9996", RegionCode.BR)); } public void testIsEmergencyNumber_AO() { // Angola doesn't have any metadata for emergency numbers in the test metadata. assertFalse(shortInfo.isEmergencyNumber("911", RegionCode.AO)); assertFalse(shortInfo.isEmergencyNumber("222123456", RegionCode.AO)); assertFalse(shortInfo.isEmergencyNumber("923123456", RegionCode.AO)); } public void testIsEmergencyNumber_ZW() { // Zimbabwe doesn't have any metadata in the test metadata. assertFalse(shortInfo.isEmergencyNumber("911", RegionCode.ZW)); assertFalse(shortInfo.isEmergencyNumber("01312345", RegionCode.ZW)); assertFalse(shortInfo.isEmergencyNumber("0711234567", RegionCode.ZW)); } public void testEmergencyNumberForSharedCountryCallingCode() { // Test the emergency number 112, which is valid in both Australia and the Christmas Islands. assertTrue(shortInfo.isEmergencyNumber("112", RegionCode.AU)); assertTrue(shortInfo.isValidShortNumberForRegion(parse("112", RegionCode.AU), RegionCode.AU)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion(parse("112", RegionCode.AU), RegionCode.AU)); assertTrue(shortInfo.isEmergencyNumber("112", RegionCode.CX)); assertTrue(shortInfo.isValidShortNumberForRegion(parse("112", RegionCode.CX), RegionCode.CX)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion(parse("112", RegionCode.CX), RegionCode.CX)); PhoneNumber sharedEmergencyNumber = new PhoneNumber().setCountryCode(61).setNationalNumber(112L); assertTrue(shortInfo.isValidShortNumber(sharedEmergencyNumber)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCost(sharedEmergencyNumber)); } public void testOverlappingNANPANumber() { // 211 is an emergency number in Barbados, while it is a toll-free information line in Canada // and the USA. assertTrue(shortInfo.isEmergencyNumber("211", RegionCode.BB)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion(parse("211", RegionCode.BB), RegionCode.BB)); assertFalse(shortInfo.isEmergencyNumber("211", RegionCode.US)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion(parse("211", RegionCode.US), RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber("211", RegionCode.CA)); assertEquals(ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion(parse("211", RegionCode.CA), RegionCode.CA)); } public void testCountryCallingCodeIsNotIgnored() { // +46 is the country calling code for Sweden (SE), and 40404 is a valid short number in the US. assertFalse(shortInfo.isPossibleShortNumberForRegion( parse("+4640404", RegionCode.SE), RegionCode.US)); assertFalse(shortInfo.isValidShortNumberForRegion( parse("+4640404", RegionCode.SE), RegionCode.US)); assertEquals(ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( parse("+4640404", RegionCode.SE), RegionCode.US)); } private PhoneNumber parse(String number, String regionCode) { try { return phoneUtil.parse(number, regionCode); } catch (NumberParseException e) { throw new AssertionError( "Test input data should always parse correctly: " + number + " (" + regionCode + ")", e); } } }