/**
         * Gets a valid short number for the specified cost category.
         *
         * @param regionCode the region for which an example short number is needed
         * @param cost the cost category of number that is needed
         * @return a valid short number for the specified region and cost category. Returns an empty
         *     string when the metadata does not contain such information, or the cost is UNKNOWN_COST.
         */
        // @VisibleForTesting
        internal String getExampleShortNumberForCost(String regionCode, ShortNumberCost cost)
        {
            PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);

            if (phoneMetadata == null)
            {
                return("");
            }
            PhoneNumberDesc desc = null;

            switch (cost)
            {
            case ShortNumberCost.TOLL_FREE:
                desc = phoneMetadata.getTollFree();
                break;

            case ShortNumberCost.STANDARD_RATE:
                desc = phoneMetadata.getStandardRate();
                break;

            case ShortNumberCost.PREMIUM_RATE:
                desc = phoneMetadata.getPremiumRate();
                break;

            default:
                // UNKNOWN_COST numbers are computed by the process of elimination from the other cost
                // categories.
                break;
            }
            if (desc != null && desc.hasExampleNumber())
            {
                return(desc.getExampleNumber());
            }
            return("");
        }
        /**
         * Tests whether a short number matches a valid pattern. Note that this doesn't verify the number
         * is actually in use, which is impossible to tell by just looking at the number itself.
         *
         * @param shortNumber the short number to check as a string
         * @param regionDialingFrom the region from which the number is dialed
         * @return whether the short number matches a valid pattern
         */
        public boolean isValidShortNumber(String shortNumber, String regionDialingFrom)
        {
            PhoneMetadata phoneMetadata =
                MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom);

            if (phoneMetadata == null)
            {
                return(false);
            }
            PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc();

            if (!generalDesc.hasNationalNumberPattern() ||
                !phoneUtil.isNumberMatchingDesc(shortNumber, generalDesc))
            {
                return(false);
            }
            PhoneNumberDesc shortNumberDesc = phoneMetadata.getShortCode();

            if (!shortNumberDesc.hasNationalNumberPattern())
            {
                logger.log(Level.WARNING, "No short code national number pattern found for region: " +
                           regionDialingFrom);
                return(false);
            }
            return(phoneUtil.isNumberMatchingDesc(shortNumber, shortNumberDesc));
        }
        /**
         * Check whether a short number is a possible number, given the number in the form of a string,
         * and the region where the number is dialed from. This provides a more lenient check than
         * {@link #isValidShortNumber}.
         *
         * @param shortNumber the short number to check as a string
         * @param regionDialingFrom the region from which the number is dialed
         * @return whether the number is a possible short number
         */
        public boolean isPossibleShortNumber(String shortNumber, String regionDialingFrom)
        {
            PhoneMetadata phoneMetadata =
                MetadataManager.getShortNumberMetadataForRegion(regionDialingFrom);

            if (phoneMetadata == null)
            {
                return(false);
            }
            PhoneNumberDesc generalDesc = phoneMetadata.getGeneralDesc();

            return(phoneUtil.isNumberPossibleForDesc(shortNumber, generalDesc));
        }
        /**
         * Gets a valid short number for the specified region.
         *
         * @param regionCode the region for which an example short number is needed
         * @return a valid short number for the specified region. Returns an empty string when the
         *     metadata does not contain such information.
         */
        // @VisibleForTesting
        internal String getExampleShortNumber(String regionCode)
        {
            PhoneMetadata phoneMetadata = MetadataManager.getShortNumberMetadataForRegion(regionCode);

            if (phoneMetadata == null)
            {
                return("");
            }
            PhoneNumberDesc desc = phoneMetadata.getShortCode();

            if (desc.hasExampleNumber())
            {
                return(desc.getExampleNumber());
            }
            return("");
        }
        [TestMethod] public void testEmergency()
        {
            int wrongTypeCounter = 0;

            foreach (String regionCode in shortNumberInfo.getSupportedRegions())
            {
                if (regionCode == RegionCode.PG)
                {
                    // The only short number for Papua New Guinea is 000, which fails the test, since the
                    // national prefix is 0. This needs to be fixed.
                    continue;
                }
                PhoneNumberDesc desc =
                    MetadataManager.getShortNumberMetadataForRegion(regionCode).getEmergency();
                if (desc.hasExampleNumber())
                {
                    String exampleNumber = desc.getExampleNumber();
                    if (!exampleNumber.matches(desc.getPossibleNumberPattern()) ||
                        !shortNumberInfo.isEmergencyNumber(exampleNumber, regionCode))
                    {
                        wrongTypeCounter++;
                        LOGGER.log(Level.SEVERE, "Emergency example number test failed for " + regionCode);
                    }
                    else
                    {
                        PhoneNumber emergencyNumber = phoneNumberUtil.parse(exampleNumber, regionCode);
                        if (shortNumberInfo.getExpectedCost(emergencyNumber) !=
                            ShortNumberInfo.ShortNumberCost.TOLL_FREE)
                        {
                            wrongTypeCounter++;
                            LOGGER.log(Level.SEVERE, "Emergency example number not toll free for " + regionCode);
                        }
                    }
                }
            }
            assertEquals(0, wrongTypeCounter);
        }
 [TestMethod] public void testCanBeInternationallyDialled()
 {
     foreach (String regionCode in 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());
 }