/** * @license * Copyright (C) 2018 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. */ /** * @fileoverview Unit tests for the ShortNumberInfo. * * Note that these tests use the test metadata for PhoneNumberUtil related * operations, but the real short number metadata for testing ShortNumberInfo * specific operations. This is not intentional, but mirrors the current state * of the Java test suite. * * @author James Wright */ goog.provide('i18n.phonenumbers.ShortNumberInfoTest'); goog.setTestOnly(); goog.require('goog.testing.jsunit'); goog.require('i18n.phonenumbers.PhoneNumber'); goog.require('i18n.phonenumbers.PhoneNumberUtil'); goog.require('i18n.phonenumbers.RegionCode'); goog.require('i18n.phonenumbers.ShortNumberInfo'); /** @type {i18n.phonenumbers.ShortNumberInfo} */ var shortInfo = i18n.phonenumbers.ShortNumberInfo.getInstance(); /** @type {i18n.phonenumbers.PhoneNumberUtil} */ var phoneUtil = i18n.phonenumbers.PhoneNumberUtil.getInstance(); var RegionCode = i18n.phonenumbers.RegionCode; function testIsPossibleShortNumber() { var possibleNumber = new i18n.phonenumbers.PhoneNumber(); possibleNumber.setCountryCode(33); possibleNumber.setNationalNumber(123456); assertTrue(shortInfo.isPossibleShortNumber(possibleNumber)); assertTrue(shortInfo.isPossibleShortNumberForRegion( phoneUtil.parse('123456', RegionCode.FR), RegionCode.FR)); var impossibleNumber = new i18n.phonenumbers.PhoneNumber(); impossibleNumber.setCountryCode(33); impossibleNumber.setNationalNumber(9); assertFalse(shortInfo.isPossibleShortNumber(impossibleNumber)); // Note that GB and GG share the country calling code 44, and that this number // is possible but not valid. var impossibleUkNumber = new i18n.phonenumbers.PhoneNumber(); impossibleUkNumber.setCountryCode(44); impossibleUkNumber.setNationalNumber(11001); assertTrue(shortInfo.isPossibleShortNumber(impossibleUkNumber)); } function testIsValidShortNumber() { var shortNumber1 = new i18n.phonenumbers.PhoneNumber(); shortNumber1.setCountryCode(33); shortNumber1.setNationalNumber(1010); assertTrue(shortInfo.isValidShortNumber(shortNumber1)); assertTrue(shortInfo.isValidShortNumberForRegion( phoneUtil.parse('1010', RegionCode.FR), RegionCode.FR)); var shortNumber2 = new i18n.phonenumbers.PhoneNumber(); shortNumber2.setCountryCode(33); shortNumber2.setNationalNumber(123456); assertFalse(shortInfo.isValidShortNumber(shortNumber2)); assertFalse(shortInfo.isValidShortNumberForRegion( phoneUtil.parse('123456', RegionCode.FR), RegionCode.FR)); // Note that GB and GG share the country calling code 44. var shortNumber3 = new i18n.phonenumbers.PhoneNumber(); shortNumber3.setCountryCode(44); shortNumber3.setNationalNumber(18001); assertTrue(shortInfo.isValidShortNumber(shortNumber3)); } function testIsCarrierSpecific() { var carrierSpecificNumber = new i18n.phonenumbers.PhoneNumber(); carrierSpecificNumber.setCountryCode(1); carrierSpecificNumber.setNationalNumber(33669); assertTrue(shortInfo.isCarrierSpecific(carrierSpecificNumber)); assertTrue(shortInfo.isCarrierSpecificForRegion( phoneUtil.parse('33669', RegionCode.US), RegionCode.US)); var notCarrierSpecificNumber = new i18n.phonenumbers.PhoneNumber(); notCarrierSpecificNumber.setCountryCode(1); notCarrierSpecificNumber.setNationalNumber(911); assertFalse(shortInfo.isCarrierSpecific(notCarrierSpecificNumber)); assertFalse(shortInfo.isCarrierSpecificForRegion( phoneUtil.parse('911', RegionCode.US), RegionCode.US)); var carrierSpecificNumberForSomeRegion = new i18n.phonenumbers.PhoneNumber(); carrierSpecificNumberForSomeRegion.setCountryCode(1); carrierSpecificNumberForSomeRegion.setNationalNumber(211); assertTrue(shortInfo.isCarrierSpecific(carrierSpecificNumberForSomeRegion)); assertTrue(shortInfo.isCarrierSpecificForRegion( carrierSpecificNumberForSomeRegion, RegionCode.US)); assertFalse(shortInfo.isCarrierSpecificForRegion( carrierSpecificNumberForSomeRegion, RegionCode.BB)); } function testIsSmsService() { var smsServiceNumberForSomeRegion = new i18n.phonenumbers.PhoneNumber(); smsServiceNumberForSomeRegion.setCountryCode(1); smsServiceNumberForSomeRegion.setNationalNumber(21234); assertTrue(shortInfo.isSmsServiceForRegion( smsServiceNumberForSomeRegion, RegionCode.US)); assertFalse(shortInfo.isSmsServiceForRegion( smsServiceNumberForSomeRegion, RegionCode.BB)); } function testGetExpectedCost() { var premiumRateExample = shortInfo.getExampleShortNumberForCost( RegionCode.FR, i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.PREMIUM_RATE); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCostForRegion( phoneUtil.parse(premiumRateExample, RegionCode.FR), RegionCode.FR)); var premiumRateNumber = new i18n.phonenumbers.PhoneNumber(); premiumRateNumber.setCountryCode(33); premiumRateNumber.setNationalNumber(parseInt(premiumRateExample, 10)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCost(premiumRateNumber)); var standardRateExample = shortInfo.getExampleShortNumberForCost( RegionCode.FR, i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.STANDARD_RATE); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCostForRegion( phoneUtil.parse(standardRateExample, RegionCode.FR), RegionCode.FR)); var standardRateNumber = new i18n.phonenumbers.PhoneNumber(); standardRateNumber.setCountryCode(33); standardRateNumber.setNationalNumber(parseInt(standardRateExample, 10)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCost(standardRateNumber)); var tollFreeExample = shortInfo.getExampleShortNumberForCost( RegionCode.FR, i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( phoneUtil.parse(tollFreeExample, RegionCode.FR), RegionCode.FR)); var tollFreeNumber = new i18n.phonenumbers.PhoneNumber(); tollFreeNumber.setCountryCode(33); tollFreeNumber.setNationalNumber(parseInt(tollFreeExample, 10)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCost(tollFreeNumber)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( phoneUtil.parse('12345', RegionCode.FR), RegionCode.FR)); var unknownCostNumber = new i18n.phonenumbers.PhoneNumber(); unknownCostNumber.setCountryCode(33); unknownCostNumber.setNationalNumber(12345); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(unknownCostNumber)); // Test that an invalid number may nevertheless have a cost other than // UNKNOWN_COST. assertFalse(shortInfo.isValidShortNumberForRegion( phoneUtil.parse('116123', RegionCode.FR), RegionCode.FR)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( phoneUtil.parse('116123', RegionCode.FR), RegionCode.FR)); var invalidNumber = new i18n.phonenumbers.PhoneNumber(); invalidNumber.setCountryCode(33); invalidNumber.setNationalNumber(116123); assertFalse(shortInfo.isValidShortNumber(invalidNumber)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCost(invalidNumber)); // Test a nonexistent country code. assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( phoneUtil.parse('911', RegionCode.US), RegionCode.ZZ)); unknownCostNumber = new i18n.phonenumbers.PhoneNumber(); unknownCostNumber.setCountryCode(123); unknownCostNumber.setNationalNumber(911); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(unknownCostNumber)); } function 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. var ambiguousPremiumRateString = '1234'; var ambiguousPremiumRateNumber = new i18n.phonenumbers.PhoneNumber(); ambiguousPremiumRateNumber.setCountryCode(61); ambiguousPremiumRateNumber.setNationalNumber(1234); var ambiguousStandardRateString = '1194'; var ambiguousStandardRateNumber = new i18n.phonenumbers.PhoneNumber(); ambiguousStandardRateNumber.setCountryCode(61); ambiguousStandardRateNumber.setNationalNumber(1194); var ambiguousTollFreeString = '733'; var ambiguousTollFreeNumber = new i18n.phonenumbers.PhoneNumber(); ambiguousTollFreeNumber.setCountryCode(61); ambiguousTollFreeNumber.setNationalNumber(733); assertTrue(shortInfo.isValidShortNumber(ambiguousPremiumRateNumber)); assertTrue(shortInfo.isValidShortNumber(ambiguousStandardRateNumber)); assertTrue(shortInfo.isValidShortNumber(ambiguousTollFreeNumber)); assertTrue(shortInfo.isValidShortNumberForRegion( phoneUtil.parse(ambiguousPremiumRateString, RegionCode.AU), RegionCode.AU)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCostForRegion( phoneUtil.parse(ambiguousPremiumRateString, RegionCode.AU), RegionCode.AU)); assertFalse(shortInfo.isValidShortNumberForRegion( phoneUtil.parse(ambiguousPremiumRateString, RegionCode.CX), RegionCode.CX)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( phoneUtil.parse(ambiguousPremiumRateString, RegionCode.CX), RegionCode.CX)); // PREMIUM_RATE takes precedence over UNKNOWN_COST. assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.PREMIUM_RATE, shortInfo.getExpectedCost(ambiguousPremiumRateNumber)); assertTrue(shortInfo.isValidShortNumberForRegion( phoneUtil.parse(ambiguousStandardRateString, RegionCode.AU), RegionCode.AU)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.STANDARD_RATE, shortInfo.getExpectedCostForRegion( phoneUtil.parse(ambiguousStandardRateString, RegionCode.AU), RegionCode.AU)); assertFalse(shortInfo.isValidShortNumberForRegion( phoneUtil.parse(ambiguousStandardRateString, RegionCode.CX), RegionCode.CX)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( phoneUtil.parse(ambiguousStandardRateString, RegionCode.CX), RegionCode.CX)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(ambiguousStandardRateNumber)); assertTrue(shortInfo.isValidShortNumberForRegion( phoneUtil.parse(ambiguousTollFreeString, RegionCode.AU), RegionCode.AU)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( phoneUtil.parse(ambiguousTollFreeString, RegionCode.AU), RegionCode.AU)); assertFalse(shortInfo.isValidShortNumberForRegion( phoneUtil.parse(ambiguousTollFreeString, RegionCode.CX), RegionCode.CX)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( phoneUtil.parse(ambiguousTollFreeString, RegionCode.CX), RegionCode.CX)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCost(ambiguousTollFreeNumber)); } function testExampleShortNumberPresence() { assertNonEmptyString(shortInfo.getExampleShortNumber(RegionCode.AD)); assertNonEmptyString(shortInfo.getExampleShortNumber(RegionCode.FR)); assertEquals('', shortInfo.getExampleShortNumber(RegionCode.UN001)); assertEquals('', shortInfo.getExampleShortNumber(null)); } function testConnectsToEmergencyNumber_US() { assertTrue(shortInfo.connectsToEmergencyNumber('911', RegionCode.US)); assertTrue(shortInfo.connectsToEmergencyNumber('112', RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber('999', RegionCode.US)); } function testConnectsToEmergencyNumberLongNumber_US() { assertTrue(shortInfo.connectsToEmergencyNumber('9116666666', RegionCode.US)); assertTrue(shortInfo.connectsToEmergencyNumber('1126666666', RegionCode.US)); assertFalse(shortInfo.connectsToEmergencyNumber('9996666666', RegionCode.US)); } function 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)); } function 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)); } function testConnectsToEmergencyNumber_BR() { assertTrue(shortInfo.connectsToEmergencyNumber('911', RegionCode.BR)); assertTrue(shortInfo.connectsToEmergencyNumber('190', RegionCode.BR)); assertFalse(shortInfo.connectsToEmergencyNumber('999', RegionCode.BR)); } function 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)); } function testConnectsToEmergencyNumber_CL() { assertTrue(shortInfo.connectsToEmergencyNumber('131', RegionCode.CL)); assertTrue(shortInfo.connectsToEmergencyNumber('133', RegionCode.CL)); } function 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)); } function 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)); } function 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)); } function testIsEmergencyNumber_US() { assertTrue(shortInfo.isEmergencyNumber('911', RegionCode.US)); assertTrue(shortInfo.isEmergencyNumber('112', RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber('999', RegionCode.US)); } function testIsEmergencyNumberLongNumber_US() { assertFalse(shortInfo.isEmergencyNumber('9116666666', RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber('1126666666', RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber('9996666666', RegionCode.US)); } function 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)); } function 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)); } function testIsEmergencyNumber_BR() { assertTrue(shortInfo.isEmergencyNumber('911', RegionCode.BR)); assertTrue(shortInfo.isEmergencyNumber('190', RegionCode.BR)); assertFalse(shortInfo.isEmergencyNumber('999', RegionCode.BR)); } function testIsEmergencyNumberLongNumber_BR() { assertFalse(shortInfo.isEmergencyNumber('9111', RegionCode.BR)); assertFalse(shortInfo.isEmergencyNumber('1900', RegionCode.BR)); assertFalse(shortInfo.isEmergencyNumber('9996', RegionCode.BR)); } function 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)); } function 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)); } function 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( phoneUtil.parse('112', RegionCode.AU), RegionCode.AU)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( phoneUtil.parse('112', RegionCode.AU), RegionCode.AU)); assertTrue(shortInfo.isEmergencyNumber('112', RegionCode.CX)); assertTrue(shortInfo.isValidShortNumberForRegion( phoneUtil.parse('112', RegionCode.CX), RegionCode.CX)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( phoneUtil.parse('112', RegionCode.CX), RegionCode.CX)); var sharedEmergencyNumber = new i18n.phonenumbers.PhoneNumber(); sharedEmergencyNumber.setCountryCode(61); sharedEmergencyNumber.setNationalNumber(112); assertTrue(shortInfo.isValidShortNumber(sharedEmergencyNumber)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCost(sharedEmergencyNumber)); } function 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( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( phoneUtil.parse('211', RegionCode.BB), RegionCode.BB)); assertFalse(shortInfo.isEmergencyNumber('211', RegionCode.US)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( phoneUtil.parse('211', RegionCode.US), RegionCode.US)); assertFalse(shortInfo.isEmergencyNumber('211', RegionCode.CA)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.TOLL_FREE, shortInfo.getExpectedCostForRegion( phoneUtil.parse('211', RegionCode.CA), RegionCode.CA)); } function testCountryCallingCodeIsNotIgnored() { // +46 is the country calling code for Sweden (SE), and 40404 is a valid short // number in the US. assertFalse(shortInfo.isPossibleShortNumberForRegion( phoneUtil.parse('+4640404', RegionCode.SE), RegionCode.US)); assertFalse(shortInfo.isValidShortNumberForRegion( phoneUtil.parse('+4640404', RegionCode.SE), RegionCode.US)); assertEquals( i18n.phonenumbers.ShortNumberInfo.ShortNumberCost.UNKNOWN_COST, shortInfo.getExpectedCostForRegion( phoneUtil.parse('+4640404', RegionCode.SE), RegionCode.US)); }