/* * Copyright (C) 2009 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.PhoneNumberUtil.PhoneNumberType; import com.google.i18n.phonenumbers.Phonemetadata.PhoneNumberDesc; import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber; import junit.framework.TestCase; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; /** * Verifies all of the example numbers in the metadata are valid and of the correct type. If no * example number exists for a particular type, the test still passes since not all types are * relevant for all regions. Tests that check the XML schema will ensure that an exampleNumber * node is present for every phone number description. */ public class ExampleNumbersTest extends TestCase { private static final Logger logger = Logger.getLogger(ExampleNumbersTest.class.getName()); private PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance(); private ShortNumberInfo shortNumberInfo = ShortNumberInfo.getInstance(); private List invalidCases = new ArrayList(); private List wrongTypeCases = new ArrayList(); /** * @param exampleNumberRequestedType type we are requesting an example number for * @param possibleExpectedTypes acceptable types that this number should match, such as * FIXED_LINE and FIXED_LINE_OR_MOBILE for a fixed line example number. */ private void checkNumbersValidAndCorrectType(PhoneNumberType exampleNumberRequestedType, Set possibleExpectedTypes) { for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumberForType(regionCode, exampleNumberRequestedType); if (exampleNumber != null) { if (!phoneNumberUtil.isValidNumber(exampleNumber)) { invalidCases.add(exampleNumber); logger.log(Level.SEVERE, "Failed validation for " + exampleNumber.toString()); } else { // We know the number is valid, now we check the type. PhoneNumberType exampleNumberType = phoneNumberUtil.getNumberType(exampleNumber); if (!possibleExpectedTypes.contains(exampleNumberType)) { wrongTypeCases.add(exampleNumber); logger.log(Level.SEVERE, "Wrong type for " + exampleNumber.toString() + ": got " + exampleNumberType); logger.log(Level.WARNING, "Expected types: "); for (PhoneNumberType type : possibleExpectedTypes) { logger.log(Level.WARNING, type.toString()); } } } } } } public void testFixedLine() throws Exception { Set fixedLineTypes = EnumSet.of(PhoneNumberType.FIXED_LINE, PhoneNumberType.FIXED_LINE_OR_MOBILE); checkNumbersValidAndCorrectType(PhoneNumberType.FIXED_LINE, fixedLineTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testMobile() throws Exception { Set mobileTypes = EnumSet.of(PhoneNumberType.MOBILE, PhoneNumberType.FIXED_LINE_OR_MOBILE); checkNumbersValidAndCorrectType(PhoneNumberType.MOBILE, mobileTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testTollFree() throws Exception { Set tollFreeTypes = EnumSet.of(PhoneNumberType.TOLL_FREE); checkNumbersValidAndCorrectType(PhoneNumberType.TOLL_FREE, tollFreeTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testPremiumRate() throws Exception { Set premiumRateTypes = EnumSet.of(PhoneNumberType.PREMIUM_RATE); checkNumbersValidAndCorrectType(PhoneNumberType.PREMIUM_RATE, premiumRateTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testVoip() throws Exception { Set voipTypes = EnumSet.of(PhoneNumberType.VOIP); checkNumbersValidAndCorrectType(PhoneNumberType.VOIP, voipTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testPager() throws Exception { Set pagerTypes = EnumSet.of(PhoneNumberType.PAGER); checkNumbersValidAndCorrectType(PhoneNumberType.PAGER, pagerTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testUan() throws Exception { Set uanTypes = EnumSet.of(PhoneNumberType.UAN); checkNumbersValidAndCorrectType(PhoneNumberType.UAN, uanTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testVoicemail() throws Exception { Set voicemailTypes = EnumSet.of(PhoneNumberType.VOICEMAIL); checkNumbersValidAndCorrectType(PhoneNumberType.VOICEMAIL, voicemailTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testSharedCost() throws Exception { Set sharedCostTypes = EnumSet.of(PhoneNumberType.SHARED_COST); checkNumbersValidAndCorrectType(PhoneNumberType.SHARED_COST, sharedCostTypes); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testCanBeInternationallyDialled() throws Exception { for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumber exampleNumber = null; PhoneNumberDesc desc = phoneNumberUtil.getMetadataForRegion(regionCode).getNoInternationalDialling(); try { if (desc.hasExampleNumber()) { exampleNumber = phoneNumberUtil.parse(desc.getExampleNumber(), regionCode); } } catch (NumberParseException e) { logger.log(Level.SEVERE, e.toString()); } if (exampleNumber != null && phoneNumberUtil.canBeInternationallyDialled(exampleNumber)) { wrongTypeCases.add(exampleNumber); logger.log(Level.SEVERE, "Number " + exampleNumber.toString() + " should not be internationally diallable"); } } assertEquals(0, wrongTypeCases.size()); } public void testGlobalNetworkNumbers() throws Exception { for (Integer callingCode : phoneNumberUtil.getSupportedGlobalNetworkCallingCodes()) { PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumberForNonGeoEntity(callingCode); assertNotNull("No example phone number for calling code " + callingCode, exampleNumber); if (!phoneNumberUtil.isValidNumber(exampleNumber)) { invalidCases.add(exampleNumber); logger.log(Level.SEVERE, "Failed validation for " + exampleNumber.toString()); } } assertEquals(0, invalidCases.size()); } public void testEveryRegionHasAnExampleNumber() throws Exception { for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumber(regionCode); assertNotNull("No example number found for region " + regionCode, exampleNumber); } } public void testEveryRegionHasAnInvalidExampleNumber() throws Exception { for (String regionCode : phoneNumberUtil.getSupportedRegions()) { PhoneNumber exampleNumber = phoneNumberUtil.getInvalidExampleNumber(regionCode); assertNotNull("No invalid example number found for region " + regionCode, exampleNumber); } } public void testEveryTypeHasAnExampleNumber() throws Exception { for (PhoneNumberUtil.PhoneNumberType type : PhoneNumberUtil.PhoneNumberType.values()) { if (type == PhoneNumberType.UNKNOWN) { continue; } PhoneNumber exampleNumber = phoneNumberUtil.getExampleNumberForType(type); assertNotNull("No example number found for type " + type, exampleNumber); } } public void testShortNumbersValidAndCorrectCost() throws Exception { List invalidStringCases = new ArrayList(); for (String regionCode : shortNumberInfo.getSupportedRegions()) { String exampleShortNumber = shortNumberInfo.getExampleShortNumber(regionCode); if (!shortNumberInfo.isValidShortNumberForRegion( phoneNumberUtil.parse(exampleShortNumber, regionCode), regionCode)) { String invalidStringCase = "region_code: " + regionCode + ", national_number: " + exampleShortNumber; invalidStringCases.add(invalidStringCase); logger.log(Level.SEVERE, "Failed validation for string " + invalidStringCase); } PhoneNumber phoneNumber = phoneNumberUtil.parse(exampleShortNumber, regionCode); if (!shortNumberInfo.isValidShortNumber(phoneNumber)) { invalidCases.add(phoneNumber); logger.log(Level.SEVERE, "Failed validation for " + phoneNumber.toString()); } for (ShortNumberInfo.ShortNumberCost cost : ShortNumberInfo.ShortNumberCost.values()) { exampleShortNumber = shortNumberInfo.getExampleShortNumberForCost(regionCode, cost); if (!exampleShortNumber.equals("")) { phoneNumber = phoneNumberUtil.parse(exampleShortNumber, regionCode); ShortNumberInfo.ShortNumberCost exampleShortNumberCost = shortNumberInfo.getExpectedCostForRegion(phoneNumber, regionCode); if (cost != exampleShortNumberCost) { wrongTypeCases.add(phoneNumber); logger.log(Level.SEVERE, "Wrong cost for " + phoneNumber.toString() + ": got " + exampleShortNumberCost + ", expected: " + cost); } } } } assertEquals(0, invalidStringCases.size()); assertEquals(0, invalidCases.size()); assertEquals(0, wrongTypeCases.size()); } public void testEmergency() throws Exception { int wrongTypeCounter = 0; for (String regionCode : shortNumberInfo.getSupportedRegions()) { PhoneNumberDesc desc = MetadataManager.getShortNumberMetadataForRegion(regionCode).getEmergency(); if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); PhoneNumber phoneNumber = phoneNumberUtil.parse(exampleNumber, regionCode); if (!shortNumberInfo.isPossibleShortNumberForRegion(phoneNumber, regionCode) || !shortNumberInfo.isEmergencyNumber(exampleNumber, regionCode)) { wrongTypeCounter++; logger.log(Level.SEVERE, "Emergency example number test failed for " + regionCode); } else if (shortNumberInfo.getExpectedCostForRegion(phoneNumber, regionCode) != ShortNumberInfo.ShortNumberCost.TOLL_FREE) { wrongTypeCounter++; logger.log(Level.WARNING, "Emergency example number not toll free for " + regionCode); } } } assertEquals(0, wrongTypeCounter); } public void testCarrierSpecificShortNumbers() throws Exception { int wrongTagCounter = 0; for (String regionCode : shortNumberInfo.getSupportedRegions()) { PhoneNumberDesc desc = MetadataManager.getShortNumberMetadataForRegion(regionCode).getCarrierSpecific(); if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); PhoneNumber carrierSpecificNumber = phoneNumberUtil.parse(exampleNumber, regionCode); if (!shortNumberInfo.isPossibleShortNumberForRegion(carrierSpecificNumber, regionCode) || !shortNumberInfo.isCarrierSpecificForRegion(carrierSpecificNumber, regionCode)) { wrongTagCounter++; logger.log(Level.SEVERE, "Carrier-specific test failed for " + regionCode); } } } assertEquals(0, wrongTagCounter); } public void testSmsServiceShortNumbers() throws Exception { int wrongTagCounter = 0; for (String regionCode : shortNumberInfo.getSupportedRegions()) { PhoneNumberDesc desc = MetadataManager.getShortNumberMetadataForRegion(regionCode).getSmsServices(); if (desc.hasExampleNumber()) { String exampleNumber = desc.getExampleNumber(); PhoneNumber smsServiceNumber = phoneNumberUtil.parse(exampleNumber, regionCode); if (!shortNumberInfo.isPossibleShortNumberForRegion(smsServiceNumber, regionCode) || !shortNumberInfo.isSmsServiceForRegion(smsServiceNumber, regionCode)) { wrongTagCounter++; logger.log(Level.SEVERE, "SMS service test failed for " + regionCode); } } } assertEquals(0, wrongTagCounter); } }