|
|
// 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.
|
|
|
|
|
|
// Author: Shaopeng Jia
|
|
|
// Author: Lara Rennie
|
|
|
// Open-sourced by: Philippe Liard
|
|
|
//
|
|
|
// Note that these tests use the metadata contained in the test metadata file,
|
|
|
// not the normal metadata file, so should not be used for regression test
|
|
|
// purposes - these tests are illustrative only and test functionality.
|
|
|
|
|
|
#include "phonenumbers/phonenumberutil.h"
|
|
|
|
|
|
#include <algorithm>
|
|
|
#include <iostream>
|
|
|
#include <list>
|
|
|
#include <set>
|
|
|
#include <string>
|
|
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
|
#include "phonenumbers/default_logger.h"
|
|
|
#include "phonenumbers/phonemetadata.pb.h"
|
|
|
#include "phonenumbers/phonenumber.h"
|
|
|
#include "phonenumbers/phonenumber.pb.h"
|
|
|
#include "phonenumbers/test_util.h"
|
|
|
|
|
|
namespace i18n {
|
|
|
namespace phonenumbers {
|
|
|
|
|
|
using std::find;
|
|
|
using std::ostream;
|
|
|
|
|
|
using google::protobuf::RepeatedPtrField;
|
|
|
|
|
|
static const int kInvalidCountryCode = 2;
|
|
|
|
|
|
class PhoneNumberUtilTest : public testing::Test {
|
|
|
protected:
|
|
|
PhoneNumberUtilTest() : phone_util_(*PhoneNumberUtil::GetInstance()) {
|
|
|
PhoneNumberUtil::GetInstance()->SetLogger(new StdoutLogger());
|
|
|
}
|
|
|
|
|
|
// Wrapper functions for private functions that we want to test.
|
|
|
const PhoneMetadata* GetPhoneMetadata(const string& region_code) const {
|
|
|
return phone_util_.GetMetadataForRegion(region_code);
|
|
|
}
|
|
|
|
|
|
const PhoneMetadata* GetMetadataForNonGeographicalRegion(
|
|
|
int country_code) const {
|
|
|
return phone_util_.GetMetadataForNonGeographicalRegion(country_code);
|
|
|
}
|
|
|
|
|
|
void ExtractPossibleNumber(const string& number,
|
|
|
string* extracted_number) const {
|
|
|
phone_util_.ExtractPossibleNumber(number, extracted_number);
|
|
|
}
|
|
|
|
|
|
bool IsViablePhoneNumber(const string& number) const {
|
|
|
return phone_util_.IsViablePhoneNumber(number);
|
|
|
}
|
|
|
|
|
|
void Normalize(string* number) const {
|
|
|
phone_util_.Normalize(number);
|
|
|
}
|
|
|
|
|
|
bool IsNumberGeographical(const PhoneNumber& phone_number) const {
|
|
|
return phone_util_.IsNumberGeographical(phone_number);
|
|
|
}
|
|
|
|
|
|
bool IsLeadingZeroPossible(int country_calling_code) const {
|
|
|
return phone_util_.IsLeadingZeroPossible(country_calling_code);
|
|
|
}
|
|
|
|
|
|
PhoneNumber::CountryCodeSource MaybeStripInternationalPrefixAndNormalize(
|
|
|
const string& possible_idd_prefix,
|
|
|
string* number) const {
|
|
|
return phone_util_.MaybeStripInternationalPrefixAndNormalize(
|
|
|
possible_idd_prefix,
|
|
|
number);
|
|
|
}
|
|
|
|
|
|
void MaybeStripNationalPrefixAndCarrierCode(const PhoneMetadata& metadata,
|
|
|
string* number,
|
|
|
string* carrier_code) const {
|
|
|
phone_util_.MaybeStripNationalPrefixAndCarrierCode(metadata, number,
|
|
|
carrier_code);
|
|
|
}
|
|
|
|
|
|
bool MaybeStripExtension(string* number, string* extension) const {
|
|
|
return phone_util_.MaybeStripExtension(number, extension);
|
|
|
}
|
|
|
|
|
|
PhoneNumberUtil::ErrorType MaybeExtractCountryCode(
|
|
|
const PhoneMetadata* default_region_metadata,
|
|
|
bool keep_raw_input,
|
|
|
string* national_number,
|
|
|
PhoneNumber* phone_number) const {
|
|
|
return phone_util_.MaybeExtractCountryCode(default_region_metadata,
|
|
|
keep_raw_input,
|
|
|
national_number,
|
|
|
phone_number);
|
|
|
}
|
|
|
|
|
|
bool ContainsOnlyValidDigits(const string& s) const {
|
|
|
return phone_util_.ContainsOnlyValidDigits(s);
|
|
|
}
|
|
|
|
|
|
const PhoneNumberUtil& phone_util_;
|
|
|
|
|
|
private:
|
|
|
DISALLOW_COPY_AND_ASSIGN(PhoneNumberUtilTest);
|
|
|
};
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ContainsOnlyValidDigits) {
|
|
|
EXPECT_TRUE(ContainsOnlyValidDigits(""));
|
|
|
EXPECT_TRUE(ContainsOnlyValidDigits("2"));
|
|
|
EXPECT_TRUE(ContainsOnlyValidDigits("25"));
|
|
|
EXPECT_TRUE(ContainsOnlyValidDigits("\xEF\xBC\x96" /* "6" */));
|
|
|
EXPECT_FALSE(ContainsOnlyValidDigits("a"));
|
|
|
EXPECT_FALSE(ContainsOnlyValidDigits("2a"));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetSupportedRegions) {
|
|
|
set<string> regions;
|
|
|
|
|
|
phone_util_.GetSupportedRegions(®ions);
|
|
|
EXPECT_GT(regions.size(), 0U);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetSupportedGlobalNetworkCallingCodes) {
|
|
|
set<int> calling_codes;
|
|
|
|
|
|
phone_util_.GetSupportedGlobalNetworkCallingCodes(&calling_codes);
|
|
|
EXPECT_GT(calling_codes.size(), 0U);
|
|
|
for (set<int>::const_iterator it = calling_codes.begin();
|
|
|
it != calling_codes.end(); ++it) {
|
|
|
EXPECT_GT(*it, 0);
|
|
|
string region_code;
|
|
|
phone_util_.GetRegionCodeForCountryCode(*it, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::UN001(), region_code);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetSupportedTypesForRegion) {
|
|
|
std::set<PhoneNumberUtil::PhoneNumberType> types;
|
|
|
phone_util_.GetSupportedTypesForRegion(RegionCode::BR(), &types);
|
|
|
EXPECT_NE(types.find(PhoneNumberUtil::FIXED_LINE), types.end());
|
|
|
// Our test data has no mobile numbers for Brazil.
|
|
|
EXPECT_EQ(types.find(PhoneNumberUtil::MOBILE), types.end());
|
|
|
// UNKNOWN should never be returned.
|
|
|
EXPECT_EQ(types.find(PhoneNumberUtil::UNKNOWN), types.end());
|
|
|
|
|
|
types.clear();
|
|
|
// In the US, many numbers are classified as FIXED_LINE_OR_MOBILE; but we
|
|
|
// don't want to expose this as a supported type, instead we say FIXED_LINE
|
|
|
// and MOBILE are both present.
|
|
|
phone_util_.GetSupportedTypesForRegion(RegionCode::US(), &types);
|
|
|
EXPECT_NE(types.find(PhoneNumberUtil::FIXED_LINE), types.end());
|
|
|
EXPECT_NE(types.find(PhoneNumberUtil::MOBILE), types.end());
|
|
|
EXPECT_EQ(types.find(PhoneNumberUtil::FIXED_LINE_OR_MOBILE), types.end());
|
|
|
types.clear();
|
|
|
phone_util_.GetSupportedTypesForRegion(RegionCode::ZZ(), &types);
|
|
|
// Test the invalid region code.
|
|
|
EXPECT_EQ(0, types.size());
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetSupportedTypesForNonGeoEntity) {
|
|
|
std::set<PhoneNumberUtil::PhoneNumberType> types;
|
|
|
// No data exists for 999 at all, no types should be returned.
|
|
|
phone_util_.GetSupportedTypesForNonGeoEntity(999, &types);
|
|
|
EXPECT_EQ(0, types.size());
|
|
|
|
|
|
types.clear();
|
|
|
phone_util_.GetSupportedTypesForNonGeoEntity(979, &types);
|
|
|
EXPECT_NE(types.find(PhoneNumberUtil::PREMIUM_RATE), types.end());
|
|
|
EXPECT_EQ(types.find(PhoneNumberUtil::MOBILE), types.end());
|
|
|
EXPECT_EQ(types.find(PhoneNumberUtil::UNKNOWN), types.end());
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetRegionCodesForCountryCallingCode) {
|
|
|
list<string> regions;
|
|
|
|
|
|
phone_util_.GetRegionCodesForCountryCallingCode(1, ®ions);
|
|
|
EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::US())
|
|
|
!= regions.end());
|
|
|
EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::BS())
|
|
|
!= regions.end());
|
|
|
|
|
|
regions.clear();
|
|
|
phone_util_.GetRegionCodesForCountryCallingCode(44, ®ions);
|
|
|
EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::GB())
|
|
|
!= regions.end());
|
|
|
|
|
|
regions.clear();
|
|
|
phone_util_.GetRegionCodesForCountryCallingCode(49, ®ions);
|
|
|
EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::DE())
|
|
|
!= regions.end());
|
|
|
|
|
|
regions.clear();
|
|
|
phone_util_.GetRegionCodesForCountryCallingCode(800, ®ions);
|
|
|
EXPECT_TRUE(find(regions.begin(), regions.end(), RegionCode::UN001())
|
|
|
!= regions.end());
|
|
|
|
|
|
regions.clear();
|
|
|
phone_util_.GetRegionCodesForCountryCallingCode(
|
|
|
kInvalidCountryCode, ®ions);
|
|
|
EXPECT_TRUE(regions.empty());
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetInstanceLoadUSMetadata) {
|
|
|
const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::US());
|
|
|
EXPECT_EQ("US", metadata->id());
|
|
|
EXPECT_EQ(1, metadata->country_code());
|
|
|
EXPECT_EQ("011", metadata->international_prefix());
|
|
|
EXPECT_TRUE(metadata->has_national_prefix());
|
|
|
ASSERT_EQ(2, metadata->number_format_size());
|
|
|
EXPECT_EQ("(\\d{3})(\\d{3})(\\d{4})",
|
|
|
metadata->number_format(1).pattern());
|
|
|
EXPECT_EQ("$1 $2 $3", metadata->number_format(1).format());
|
|
|
EXPECT_EQ("[13-689]\\d{9}|2[0-35-9]\\d{8}",
|
|
|
metadata->general_desc().national_number_pattern());
|
|
|
EXPECT_EQ("[13-689]\\d{9}|2[0-35-9]\\d{8}",
|
|
|
metadata->fixed_line().national_number_pattern());
|
|
|
EXPECT_EQ(1, metadata->general_desc().possible_length_size());
|
|
|
EXPECT_EQ(10, metadata->general_desc().possible_length(0));
|
|
|
// Possible lengths are the same as the general description, so aren't stored
|
|
|
// separately in the toll free element as well.
|
|
|
EXPECT_EQ(0, metadata->toll_free().possible_length_size());
|
|
|
EXPECT_EQ("900\\d{7}", metadata->premium_rate().national_number_pattern());
|
|
|
// No shared-cost data is available, so it should be initialised to "NA".
|
|
|
EXPECT_EQ("NA", metadata->shared_cost().national_number_pattern());
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetInstanceLoadDEMetadata) {
|
|
|
const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::DE());
|
|
|
EXPECT_EQ("DE", metadata->id());
|
|
|
EXPECT_EQ(49, metadata->country_code());
|
|
|
EXPECT_EQ("00", metadata->international_prefix());
|
|
|
EXPECT_EQ("0", metadata->national_prefix());
|
|
|
ASSERT_EQ(6, metadata->number_format_size());
|
|
|
EXPECT_EQ(1, metadata->number_format(5).leading_digits_pattern_size());
|
|
|
EXPECT_EQ("900", metadata->number_format(5).leading_digits_pattern(0));
|
|
|
EXPECT_EQ("(\\d{3})(\\d{3,4})(\\d{4})",
|
|
|
metadata->number_format(5).pattern());
|
|
|
EXPECT_EQ(2, metadata->general_desc().possible_length_local_only_size());
|
|
|
EXPECT_EQ(8, metadata->general_desc().possible_length_size());
|
|
|
// Nothing is present for fixed-line, since it is the same as the general
|
|
|
// desc, so for efficiency reasons we don't store an extra value.
|
|
|
EXPECT_EQ(0, metadata->fixed_line().possible_length_size());
|
|
|
EXPECT_EQ(2, metadata->mobile().possible_length_size());
|
|
|
EXPECT_EQ("$1 $2 $3", metadata->number_format(5).format());
|
|
|
EXPECT_EQ("(?:[24-6]\\d{2}|3[03-9]\\d|[789](?:0[2-9]|[1-9]\\d))\\d{1,8}",
|
|
|
metadata->fixed_line().national_number_pattern());
|
|
|
EXPECT_EQ("30123456", metadata->fixed_line().example_number());
|
|
|
EXPECT_EQ(10, metadata->toll_free().possible_length(0));
|
|
|
EXPECT_EQ("900([135]\\d{6}|9\\d{7})",
|
|
|
metadata->premium_rate().national_number_pattern());
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetInstanceLoadARMetadata) {
|
|
|
const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::AR());
|
|
|
EXPECT_EQ("AR", metadata->id());
|
|
|
EXPECT_EQ(54, metadata->country_code());
|
|
|
EXPECT_EQ("00", metadata->international_prefix());
|
|
|
EXPECT_EQ("0", metadata->national_prefix());
|
|
|
EXPECT_EQ("0(?:(11|343|3715)15)?", metadata->national_prefix_for_parsing());
|
|
|
EXPECT_EQ("9$1", metadata->national_prefix_transform_rule());
|
|
|
ASSERT_EQ(5, metadata->number_format_size());
|
|
|
EXPECT_EQ("$2 15 $3-$4", metadata->number_format(2).format());
|
|
|
EXPECT_EQ("(9)(\\d{4})(\\d{2})(\\d{4})",
|
|
|
metadata->number_format(3).pattern());
|
|
|
EXPECT_EQ("(9)(\\d{4})(\\d{2})(\\d{4})",
|
|
|
metadata->intl_number_format(3).pattern());
|
|
|
EXPECT_EQ("$1 $2 $3 $4", metadata->intl_number_format(3).format());
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetInstanceLoadInternationalTollFreeMetadata) {
|
|
|
const PhoneMetadata* metadata = GetMetadataForNonGeographicalRegion(800);
|
|
|
EXPECT_FALSE(metadata == NULL);
|
|
|
EXPECT_EQ("001", metadata->id());
|
|
|
EXPECT_EQ(800, metadata->country_code());
|
|
|
EXPECT_EQ("$1 $2", metadata->number_format(0).format());
|
|
|
EXPECT_EQ("(\\d{4})(\\d{4})", metadata->number_format(0).pattern());
|
|
|
EXPECT_EQ(0, metadata->general_desc().possible_length_local_only_size());
|
|
|
EXPECT_EQ(1, metadata->general_desc().possible_length_size());
|
|
|
EXPECT_EQ("12345678", metadata->toll_free().example_number());
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetNationalSignificantNumber) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(6502530000ULL);
|
|
|
string national_significant_number;
|
|
|
phone_util_.GetNationalSignificantNumber(number,
|
|
|
&national_significant_number);
|
|
|
EXPECT_EQ("6502530000", national_significant_number);
|
|
|
|
|
|
// An Italian mobile number.
|
|
|
national_significant_number.clear();
|
|
|
number.set_country_code(39);
|
|
|
number.set_national_number(312345678ULL);
|
|
|
phone_util_.GetNationalSignificantNumber(number,
|
|
|
&national_significant_number);
|
|
|
EXPECT_EQ("312345678", national_significant_number);
|
|
|
|
|
|
// An Italian fixed line number.
|
|
|
national_significant_number.clear();
|
|
|
number.set_country_code(39);
|
|
|
number.set_national_number(236618300ULL);
|
|
|
number.set_italian_leading_zero(true);
|
|
|
phone_util_.GetNationalSignificantNumber(number,
|
|
|
&national_significant_number);
|
|
|
EXPECT_EQ("0236618300", national_significant_number);
|
|
|
|
|
|
national_significant_number.clear();
|
|
|
number.Clear();
|
|
|
number.set_country_code(800);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
phone_util_.GetNationalSignificantNumber(number,
|
|
|
&national_significant_number);
|
|
|
EXPECT_EQ("12345678", national_significant_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetNationalSignificantNumber_ManyLeadingZeros) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(650ULL);
|
|
|
number.set_italian_leading_zero(true);
|
|
|
number.set_number_of_leading_zeros(2);
|
|
|
string national_significant_number;
|
|
|
phone_util_.GetNationalSignificantNumber(number,
|
|
|
&national_significant_number);
|
|
|
EXPECT_EQ("00650", national_significant_number);
|
|
|
|
|
|
// Set a bad value; we shouldn't crash, we shouldn't output any leading zeros
|
|
|
// at all.
|
|
|
number.set_number_of_leading_zeros(-3);
|
|
|
national_significant_number.clear();
|
|
|
phone_util_.GetNationalSignificantNumber(number,
|
|
|
&national_significant_number);
|
|
|
EXPECT_EQ("650", national_significant_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetExampleNumber) {
|
|
|
PhoneNumber de_number;
|
|
|
de_number.set_country_code(49);
|
|
|
de_number.set_national_number(30123456ULL);
|
|
|
PhoneNumber test_number;
|
|
|
bool success = phone_util_.GetExampleNumber(RegionCode::DE(), &test_number);
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_EQ(de_number, test_number);
|
|
|
|
|
|
success = phone_util_.GetExampleNumberForType(
|
|
|
RegionCode::DE(), PhoneNumberUtil::FIXED_LINE, &test_number);
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_EQ(de_number, test_number);
|
|
|
|
|
|
// Should return the same response if asked for FIXED_LINE_OR_MOBILE too.
|
|
|
success = phone_util_.GetExampleNumberForType(
|
|
|
RegionCode::DE(), PhoneNumberUtil::FIXED_LINE_OR_MOBILE, &test_number);
|
|
|
EXPECT_EQ(de_number, test_number);
|
|
|
|
|
|
success = phone_util_.GetExampleNumberForType(
|
|
|
RegionCode::DE(), PhoneNumberUtil::MOBILE, &test_number);
|
|
|
// We have data for the US, but no data for VOICEMAIL, so the number passed in
|
|
|
// should be left empty.
|
|
|
success = phone_util_.GetExampleNumberForType(
|
|
|
RegionCode::US(), PhoneNumberUtil::VOICEMAIL, &test_number);
|
|
|
test_number.Clear();
|
|
|
EXPECT_FALSE(success);
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
success = phone_util_.GetExampleNumberForType(
|
|
|
RegionCode::US(), PhoneNumberUtil::FIXED_LINE, &test_number);
|
|
|
// Here we test that the call to get an example number succeeded, and that the
|
|
|
// number passed in was modified.
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_NE(PhoneNumber::default_instance(), test_number);
|
|
|
success = phone_util_.GetExampleNumberForType(
|
|
|
RegionCode::US(), PhoneNumberUtil::MOBILE, &test_number);
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_NE(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
// CS is an invalid region, so we have no data for it. We should return false.
|
|
|
test_number.Clear();
|
|
|
EXPECT_FALSE(phone_util_.GetExampleNumberForType(
|
|
|
RegionCode::CS(), PhoneNumberUtil::MOBILE, &test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
// RegionCode 001 is reserved for supporting non-geographical country calling
|
|
|
// code. We don't support getting an example number for it with this method.
|
|
|
EXPECT_FALSE(phone_util_.GetExampleNumber(RegionCode::UN001(), &test_number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetInvalidExampleNumber) {
|
|
|
// RegionCode 001 is reserved for supporting non-geographical country calling
|
|
|
// codes. We don't support getting an invalid example number for it with
|
|
|
// GetInvalidExampleNumber.
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_FALSE(phone_util_.GetInvalidExampleNumber(RegionCode::UN001(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
EXPECT_FALSE(phone_util_.GetInvalidExampleNumber(RegionCode::CS(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_TRUE(phone_util_.GetInvalidExampleNumber(RegionCode::US(),
|
|
|
&test_number));
|
|
|
// At least the country calling code should be set correctly.
|
|
|
EXPECT_EQ(1, test_number.country_code());
|
|
|
EXPECT_NE(0, test_number.national_number());
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetExampleNumberForNonGeoEntity) {
|
|
|
PhoneNumber toll_free_number;
|
|
|
toll_free_number.set_country_code(800);
|
|
|
toll_free_number.set_national_number(12345678ULL);
|
|
|
PhoneNumber test_number;
|
|
|
bool success =
|
|
|
phone_util_.GetExampleNumberForNonGeoEntity(800 , &test_number);
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_EQ(toll_free_number, test_number);
|
|
|
|
|
|
PhoneNumber universal_premium_rate;
|
|
|
universal_premium_rate.set_country_code(979);
|
|
|
universal_premium_rate.set_national_number(123456789ULL);
|
|
|
success = phone_util_.GetExampleNumberForNonGeoEntity(979 , &test_number);
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_EQ(universal_premium_rate, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetExampleNumberWithoutRegion) {
|
|
|
// In our test metadata we don't cover all types: in our real metadata, we do.
|
|
|
PhoneNumber test_number;
|
|
|
bool success = phone_util_.GetExampleNumberForType(
|
|
|
PhoneNumberUtil::FIXED_LINE,
|
|
|
&test_number);
|
|
|
// We test that the call to get an example number succeeded, and that the
|
|
|
// number passed in was modified.
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_NE(PhoneNumber::default_instance(), test_number);
|
|
|
test_number.Clear();
|
|
|
|
|
|
success = phone_util_.GetExampleNumberForType(PhoneNumberUtil::MOBILE,
|
|
|
&test_number);
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_NE(PhoneNumber::default_instance(), test_number);
|
|
|
test_number.Clear();
|
|
|
|
|
|
success = phone_util_.GetExampleNumberForType(PhoneNumberUtil::PREMIUM_RATE,
|
|
|
&test_number);
|
|
|
EXPECT_TRUE(success);
|
|
|
EXPECT_NE(PhoneNumber::default_instance(), test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatUSNumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.set_national_number(6502530000ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("650 253 0000", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 650 253 0000", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(8002530000ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("800 253 0000", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 800 253 0000", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(9002530000ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("900 253 0000", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 900 253 0000", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::RFC3966, &formatted_number);
|
|
|
EXPECT_EQ("tel:+1-900-253-0000", formatted_number);
|
|
|
test_number.set_national_number(0ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("0", formatted_number);
|
|
|
// Numbers with all zeros in the national number part will be formatted by
|
|
|
// using the raw_input if that is available no matter which format is
|
|
|
// specified.
|
|
|
test_number.set_raw_input("000-000-0000");
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("000-000-0000", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatBSNumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.set_national_number(2421234567ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("242 123 4567", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 242 123 4567", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(8002530000ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("800 253 0000", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 800 253 0000", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(9002530000ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("900 253 0000", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 900 253 0000", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatGBNumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(44);
|
|
|
test_number.set_national_number(2087389353ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("(020) 8738 9353", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+44 20 8738 9353", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(7912345678ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("(07912) 345 678", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+44 7912 345 678", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatDENumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(49);
|
|
|
test_number.set_national_number(301234ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("030/1234", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+49 30/1234", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::RFC3966, &formatted_number);
|
|
|
EXPECT_EQ("tel:+49-30-1234", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(291123ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("0291 123", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+49 291 123", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(29112345678ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("0291 12345678", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+49 291 12345678", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(9123123ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("09123 123", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+49 9123 123", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(80212345ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("08021 2345", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+49 8021 2345", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(1234ULL);
|
|
|
// Note this number is correctly formatted without national prefix. Most of
|
|
|
// the numbers that are treated as invalid numbers by the library are short
|
|
|
// numbers, and they are usually not dialed with national prefix.
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("1234", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+49 1234", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatITNumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(39);
|
|
|
test_number.set_national_number(236618300ULL);
|
|
|
test_number.set_italian_leading_zero(true);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("02 3661 8300", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+39 02 3661 8300", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+390236618300", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(345678901ULL);
|
|
|
test_number.set_italian_leading_zero(false);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("345 678 901", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+39 345 678 901", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+39345678901", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatAUNumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(61);
|
|
|
test_number.set_national_number(236618300ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("02 3661 8300", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+61 2 3661 8300", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+61236618300", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(1800123456ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("1800 123 456", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+61 1800 123 456", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+611800123456", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatARNumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(54);
|
|
|
test_number.set_national_number(1187654321ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("011 8765-4321", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+54 11 8765-4321", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+541187654321", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(91187654321ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("011 15 8765-4321", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+54 9 11 8765 4321", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+5491187654321", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatMXNumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(52);
|
|
|
test_number.set_national_number(12345678900ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("045 234 567 8900", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+52 1 234 567 8900", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+5212345678900", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(15512345678ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("045 55 1234 5678", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+52 1 55 1234 5678", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+5215512345678", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(3312345678LL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("01 33 1234 5678", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+52 33 1234 5678", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+523312345678", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(8211234567LL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("01 821 123 4567", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+52 821 123 4567", formatted_number);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+528211234567", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatOutOfCountryCallingNumber) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.set_national_number(9002530000ULL);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::DE(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("00 1 900 253 0000", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(6502530000ULL);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::BS(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("1 650 253 0000", formatted_number);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::PL(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("00 1 650 253 0000", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(44);
|
|
|
test_number.set_national_number(7912345678ULL);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("011 44 7912 345 678", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(49);
|
|
|
test_number.set_national_number(1234ULL);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::GB(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("00 49 1234", formatted_number);
|
|
|
// Note this number is correctly formatted without national prefix. Most of
|
|
|
// the numbers that are treated as invalid numbers by the library are short
|
|
|
// numbers, and they are usually not dialed with national prefix.
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::DE(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("1234", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(39);
|
|
|
test_number.set_national_number(236618300ULL);
|
|
|
test_number.set_italian_leading_zero(true);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("011 39 02 3661 8300", formatted_number);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::IT(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("02 3661 8300", formatted_number);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::SG(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+39 02 3661 8300", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(65);
|
|
|
test_number.set_national_number(94777892ULL);
|
|
|
test_number.set_italian_leading_zero(false);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::SG(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("9477 7892", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(800);
|
|
|
test_number.set_national_number(12345678ULL);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("011 800 1234 5678", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(54);
|
|
|
test_number.set_national_number(91187654321ULL);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("011 54 9 11 8765 4321", formatted_number);
|
|
|
|
|
|
test_number.set_extension("1234");
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("011 54 9 11 8765 4321 ext. 1234", formatted_number);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0011 54 9 11 8765 4321 ext. 1234", formatted_number);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AR(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("011 15 8765-4321 ext. 1234", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatOutOfCountryWithInvalidRegion) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.set_national_number(6502530000ULL);
|
|
|
// AQ/Antarctica isn't a valid region code for phone number formatting,
|
|
|
// so this falls back to intl formatting.
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AQ(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 650 253 0000", formatted_number);
|
|
|
// For region code 001, the out-of-country format always turns into the
|
|
|
// international format.
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::UN001(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 650 253 0000", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatOutOfCountryWithPreferredIntlPrefix) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(39);
|
|
|
test_number.set_national_number(236618300ULL);
|
|
|
test_number.set_italian_leading_zero(true);
|
|
|
// This should use 0011, since that is the preferred international prefix
|
|
|
// (both 0011 and 0012 are accepted as possible international prefixes in our
|
|
|
// test metadta.)
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(test_number, RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0011 39 02 3661 8300", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatOutOfCountryKeepingAlphaChars) {
|
|
|
PhoneNumber alpha_numeric_number;
|
|
|
string formatted_number;
|
|
|
alpha_numeric_number.set_country_code(1);
|
|
|
alpha_numeric_number.set_national_number(8007493524ULL);
|
|
|
alpha_numeric_number.set_raw_input("1800 six-flag");
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number);
|
|
|
|
|
|
formatted_number.clear();
|
|
|
alpha_numeric_number.set_raw_input("1-800-SIX-flag");
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0011 1 800-SIX-FLAG", formatted_number);
|
|
|
|
|
|
formatted_number.clear();
|
|
|
alpha_numeric_number.set_raw_input("Call us from UK: 00 1 800 SIX-flag");
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number);
|
|
|
|
|
|
formatted_number.clear();
|
|
|
alpha_numeric_number.set_raw_input("800 SIX-flag");
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0011 1 800 SIX-FLAG", formatted_number);
|
|
|
|
|
|
// Formatting from within the NANPA region.
|
|
|
formatted_number.clear();
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("1 800 SIX-FLAG", formatted_number);
|
|
|
formatted_number.clear();
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::BS(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("1 800 SIX-FLAG", formatted_number);
|
|
|
|
|
|
// Testing that if the raw input doesn't exist, it is formatted using
|
|
|
// FormatOutOfCountryCallingNumber.
|
|
|
alpha_numeric_number.clear_raw_input();
|
|
|
formatted_number.clear();
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::DE(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("00 1 800 749 3524", formatted_number);
|
|
|
|
|
|
// Testing AU alpha number formatted from Australia.
|
|
|
alpha_numeric_number.set_country_code(61);
|
|
|
alpha_numeric_number.set_national_number(827493524ULL);
|
|
|
alpha_numeric_number.set_raw_input("+61 82749-FLAG");
|
|
|
formatted_number.clear();
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
// This number should have the national prefix prefixed.
|
|
|
EXPECT_EQ("082749-FLAG", formatted_number);
|
|
|
|
|
|
alpha_numeric_number.set_raw_input("082749-FLAG");
|
|
|
formatted_number.clear();
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("082749-FLAG", formatted_number);
|
|
|
|
|
|
alpha_numeric_number.set_national_number(18007493524ULL);
|
|
|
alpha_numeric_number.set_raw_input("1-800-SIX-flag");
|
|
|
formatted_number.clear();
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
// This number should not have the national prefix prefixed, in accordance
|
|
|
// with the override for this specific formatting rule.
|
|
|
EXPECT_EQ("1-800-SIX-FLAG", formatted_number);
|
|
|
// The metadata should not be permanently changed, since we copied it before
|
|
|
// modifying patterns. Here we check this.
|
|
|
formatted_number.clear();
|
|
|
alpha_numeric_number.set_national_number(1800749352ULL);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(alpha_numeric_number,
|
|
|
RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("1800 749 352", formatted_number);
|
|
|
|
|
|
// Testing a country with multiple international prefixes.
|
|
|
formatted_number.clear();
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::SG(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+61 1-800-SIX-FLAG", formatted_number);
|
|
|
// Testing the case of calling from a non-supported region.
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AQ(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+61 1-800-SIX-FLAG", formatted_number);
|
|
|
|
|
|
// Testing the case with an invalid country code.
|
|
|
formatted_number.clear();
|
|
|
alpha_numeric_number.set_country_code(0);
|
|
|
alpha_numeric_number.set_national_number(18007493524ULL);
|
|
|
alpha_numeric_number.set_raw_input("1-800-SIX-flag");
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::DE(),
|
|
|
&formatted_number);
|
|
|
// Uses the raw input only.
|
|
|
EXPECT_EQ("1-800-SIX-flag", formatted_number);
|
|
|
|
|
|
// Testing the case of an invalid alpha number.
|
|
|
formatted_number.clear();
|
|
|
alpha_numeric_number.set_country_code(1);
|
|
|
alpha_numeric_number.set_national_number(80749ULL);
|
|
|
alpha_numeric_number.set_raw_input("180-SIX");
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::DE(),
|
|
|
&formatted_number);
|
|
|
// No country-code stripping can be done.
|
|
|
EXPECT_EQ("00 1 180-SIX", formatted_number);
|
|
|
// Testing the case of calling from a non-supported region.
|
|
|
phone_util_.FormatOutOfCountryKeepingAlphaChars(alpha_numeric_number,
|
|
|
RegionCode::AQ(),
|
|
|
&formatted_number);
|
|
|
// No country-code stripping can be done since the number is invalid.
|
|
|
EXPECT_EQ("+1 180-SIX", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatWithCarrierCode) {
|
|
|
// We only support this for AR in our test metadata.
|
|
|
PhoneNumber ar_number;
|
|
|
string formatted_number;
|
|
|
ar_number.set_country_code(54);
|
|
|
ar_number.set_national_number(91234125678ULL);
|
|
|
phone_util_.Format(ar_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("01234 12-5678", formatted_number);
|
|
|
// Test formatting with a carrier code.
|
|
|
phone_util_.FormatNationalNumberWithCarrierCode(ar_number, "15",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01234 15 12-5678", formatted_number);
|
|
|
phone_util_.FormatNationalNumberWithCarrierCode(ar_number, "",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01234 12-5678", formatted_number);
|
|
|
// Here the international rule is used, so no carrier code should be present.
|
|
|
phone_util_.Format(ar_number, PhoneNumberUtil::E164, &formatted_number);
|
|
|
EXPECT_EQ("+5491234125678", formatted_number);
|
|
|
|
|
|
// We don't support this for the US so there should be no change.
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
us_number.set_national_number(4241231234ULL);
|
|
|
phone_util_.Format(us_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("424 123 1234", formatted_number);
|
|
|
phone_util_.FormatNationalNumberWithCarrierCode(us_number, "15",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("424 123 1234", formatted_number);
|
|
|
|
|
|
// Invalid country code should just get the NSN.
|
|
|
PhoneNumber invalid_number;
|
|
|
invalid_number.set_country_code(kInvalidCountryCode);
|
|
|
invalid_number.set_national_number(12345ULL);
|
|
|
phone_util_.FormatNationalNumberWithCarrierCode(invalid_number, "89",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("12345", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatWithPreferredCarrierCode) {
|
|
|
// We only support this for AR in our test metadata.
|
|
|
PhoneNumber ar_number;
|
|
|
string formatted_number;
|
|
|
ar_number.set_country_code(54);
|
|
|
ar_number.set_national_number(91234125678ULL);
|
|
|
// Test formatting with no preferred carrier code stored in the number itself.
|
|
|
phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01234 15 12-5678", formatted_number);
|
|
|
phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01234 12-5678", formatted_number);
|
|
|
// Test formatting with preferred carrier code present.
|
|
|
ar_number.set_preferred_domestic_carrier_code("19");
|
|
|
phone_util_.Format(ar_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("01234 12-5678", formatted_number);
|
|
|
phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01234 19 12-5678", formatted_number);
|
|
|
phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01234 19 12-5678", formatted_number);
|
|
|
// When the preferred_domestic_carrier_code is present (even when it is just a
|
|
|
// space), use it instead of the default carrier code passed in.
|
|
|
ar_number.set_preferred_domestic_carrier_code(" ");
|
|
|
phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01234 12-5678", formatted_number);
|
|
|
// When the preferred_domestic_carrier_code is present but empty, treat it as
|
|
|
// unset and use instead the default carrier code passed in.
|
|
|
ar_number.set_preferred_domestic_carrier_code("");
|
|
|
phone_util_.FormatNationalNumberWithPreferredCarrierCode(ar_number, "15",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01234 15 12-5678", formatted_number);
|
|
|
// We don't support this for the US so there should be no change.
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
us_number.set_national_number(4241231234ULL);
|
|
|
us_number.set_preferred_domestic_carrier_code("99");
|
|
|
phone_util_.Format(us_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("424 123 1234", formatted_number);
|
|
|
phone_util_.FormatNationalNumberWithPreferredCarrierCode(us_number, "15",
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("424 123 1234", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatNumberForMobileDialing) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
|
|
|
// Numbers are normally dialed in national format in-country, and
|
|
|
// international format from outside the country.
|
|
|
test_number.set_country_code(49);
|
|
|
test_number.set_national_number(30123456ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::DE(), false, /* remove formatting */
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("030123456", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::CH(), false, /* remove formatting */
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+4930123456", formatted_number);
|
|
|
|
|
|
test_number.set_extension("1234");
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::DE(), false, /* remove formatting */
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("030123456", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::CH(), false, /* remove formatting */
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+4930123456", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.clear_extension();
|
|
|
// US toll free numbers are marked as noInternationalDialling in the test
|
|
|
// metadata for testing purposes. For such numbers, we expect nothing to be
|
|
|
// returned when the region code is not the same one.
|
|
|
test_number.set_national_number(8002530000ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), true, /* keep formatting */
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("800 253 0000", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::CN(), true, &formatted_number);
|
|
|
EXPECT_EQ("", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), false, /* remove formatting */
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("8002530000", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::CN(), false, &formatted_number);
|
|
|
EXPECT_EQ("", formatted_number);
|
|
|
|
|
|
test_number.set_national_number(6502530000ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), true, &formatted_number);
|
|
|
EXPECT_EQ("+1 650 253 0000", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), false, &formatted_number);
|
|
|
EXPECT_EQ("+16502530000", formatted_number);
|
|
|
|
|
|
test_number.set_extension("1234");
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), true, &formatted_number);
|
|
|
EXPECT_EQ("+1 650 253 0000", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), false, &formatted_number);
|
|
|
EXPECT_EQ("+16502530000", formatted_number);
|
|
|
|
|
|
// An invalid US number, which is one digit too long.
|
|
|
test_number.set_national_number(65025300001ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), true, &formatted_number);
|
|
|
EXPECT_EQ("+1 65025300001", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), false, &formatted_number);
|
|
|
EXPECT_EQ("+165025300001", formatted_number);
|
|
|
|
|
|
// Star numbers. In real life they appear in Israel, but we have them in JP
|
|
|
// in our test metadata.
|
|
|
test_number.set_country_code(81);
|
|
|
test_number.set_national_number(2345ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::JP(), true, &formatted_number);
|
|
|
EXPECT_EQ("*2345", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::JP(), false, &formatted_number);
|
|
|
EXPECT_EQ("*2345", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(800);
|
|
|
test_number.set_national_number(12345678ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::JP(), false, &formatted_number);
|
|
|
EXPECT_EQ("+80012345678", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::JP(), true, &formatted_number);
|
|
|
EXPECT_EQ("+800 1234 5678", formatted_number);
|
|
|
|
|
|
// UAE numbers beginning with 600 (classified as UAN) need to be dialled
|
|
|
// without +971 locally.
|
|
|
test_number.set_country_code(971);
|
|
|
test_number.set_national_number(600123456ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::JP(), false, &formatted_number);
|
|
|
EXPECT_EQ("+971600123456", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::AE(), true, &formatted_number);
|
|
|
EXPECT_EQ("600123456", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(52);
|
|
|
test_number.set_national_number(3312345678ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::MX(), false, &formatted_number);
|
|
|
EXPECT_EQ("+523312345678", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), false, &formatted_number);
|
|
|
EXPECT_EQ("+523312345678", formatted_number);
|
|
|
|
|
|
// Non-geographical numbers should always be dialed in international format.
|
|
|
test_number.set_country_code(800);
|
|
|
test_number.set_national_number(12345678ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), false, &formatted_number);
|
|
|
EXPECT_EQ("+80012345678", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::UN001(), false, &formatted_number);
|
|
|
EXPECT_EQ("+80012345678", formatted_number);
|
|
|
|
|
|
// Test that a short number is formatted correctly for mobile dialing within
|
|
|
// the region, and is not diallable from outside the region.
|
|
|
test_number.set_country_code(49);
|
|
|
test_number.set_national_number(123L);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::DE(), false, &formatted_number);
|
|
|
EXPECT_EQ("123", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::IT(), false, &formatted_number);
|
|
|
EXPECT_EQ("", formatted_number);
|
|
|
|
|
|
// Test the special logic for Hungary, where the national prefix must be
|
|
|
// added before dialing from a mobile phone for regular length numbers, but
|
|
|
// not for short numbers.
|
|
|
test_number.set_country_code(36);
|
|
|
test_number.set_national_number(301234567ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::HU(), false, &formatted_number);
|
|
|
EXPECT_EQ("06301234567", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::JP(), false, &formatted_number);
|
|
|
EXPECT_EQ("+36301234567", formatted_number);
|
|
|
test_number.set_national_number(104L);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::HU(), false, &formatted_number);
|
|
|
EXPECT_EQ("104", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::JP(), false, &formatted_number);
|
|
|
EXPECT_EQ("", formatted_number);
|
|
|
|
|
|
// Test the special logic for NANPA countries, for which regular length phone
|
|
|
// numbers are always output in international format, but short numbers are
|
|
|
// in national format.
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.set_national_number(6502530000ULL);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), false, &formatted_number);
|
|
|
EXPECT_EQ("+16502530000", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::CA(), false, &formatted_number);
|
|
|
EXPECT_EQ("+16502530000", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::BR(), false, &formatted_number);
|
|
|
EXPECT_EQ("+16502530000", formatted_number);
|
|
|
test_number.set_national_number(911L);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::US(), false, &formatted_number);
|
|
|
EXPECT_EQ("911", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::CA(), false, &formatted_number);
|
|
|
EXPECT_EQ("", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::BR(), false, &formatted_number);
|
|
|
EXPECT_EQ("", formatted_number);
|
|
|
// Test that the Australian emergency number 000 is formatted correctly.
|
|
|
test_number.set_country_code(61);
|
|
|
test_number.set_national_number(0L);
|
|
|
test_number.set_italian_leading_zero(true);
|
|
|
test_number.set_number_of_leading_zeros(2);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::AU(), false, &formatted_number);
|
|
|
EXPECT_EQ("000", formatted_number);
|
|
|
phone_util_.FormatNumberForMobileDialing(
|
|
|
test_number, RegionCode::NZ(), false, &formatted_number);
|
|
|
EXPECT_EQ("", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatByPattern) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.set_national_number(6502530000ULL);
|
|
|
|
|
|
RepeatedPtrField<NumberFormat> number_formats;
|
|
|
NumberFormat* number_format = number_formats.Add();
|
|
|
number_format->set_pattern("(\\d{3})(\\d{3})(\\d{4})");
|
|
|
number_format->set_format("($1) $2-$3");
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("(650) 253-0000", formatted_number);
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 (650) 253-0000", formatted_number);
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::RFC3966,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("tel:+1-650-253-0000", formatted_number);
|
|
|
|
|
|
// $NP is set to '1' for the US. Here we check that for other NANPA countries
|
|
|
// the US rules are followed.
|
|
|
number_format->set_national_prefix_formatting_rule("$NP ($FG)");
|
|
|
number_format->set_format("$1 $2-$3");
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.set_national_number(4168819999ULL);
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("1 (416) 881-9999", formatted_number);
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+1 416 881-9999", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(39);
|
|
|
test_number.set_national_number(236618300ULL);
|
|
|
test_number.set_italian_leading_zero(true);
|
|
|
number_format->set_pattern("(\\d{2})(\\d{5})(\\d{3})");
|
|
|
number_format->set_format("$1-$2 $3");
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("02-36618 300", formatted_number);
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+39 02-36618 300", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(44);
|
|
|
test_number.set_national_number(2012345678ULL);
|
|
|
test_number.set_italian_leading_zero(false);
|
|
|
number_format->set_national_prefix_formatting_rule("$NP$FG");
|
|
|
number_format->set_pattern("(\\d{2})(\\d{4})(\\d{4})");
|
|
|
number_format->set_format("$1 $2 $3");
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("020 1234 5678", formatted_number);
|
|
|
|
|
|
number_format->set_national_prefix_formatting_rule("($NP$FG)");
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("(020) 1234 5678", formatted_number);
|
|
|
number_format->set_national_prefix_formatting_rule("");
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::NATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("20 1234 5678", formatted_number);
|
|
|
number_format->set_national_prefix_formatting_rule("");
|
|
|
phone_util_.FormatByPattern(test_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
number_formats,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+44 20 1234 5678", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatE164Number) {
|
|
|
PhoneNumber test_number;
|
|
|
string formatted_number;
|
|
|
test_number.set_country_code(1);
|
|
|
test_number.set_national_number(6502530000ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164, &formatted_number);
|
|
|
EXPECT_EQ("+16502530000", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(49);
|
|
|
test_number.set_national_number(301234ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164, &formatted_number);
|
|
|
EXPECT_EQ("+49301234", formatted_number);
|
|
|
|
|
|
test_number.set_country_code(800);
|
|
|
test_number.set_national_number(12345678ULL);
|
|
|
phone_util_.Format(test_number, PhoneNumberUtil::E164, &formatted_number);
|
|
|
EXPECT_EQ("+80012345678", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatNumberWithExtension) {
|
|
|
PhoneNumber nz_number;
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(33316005ULL);
|
|
|
nz_number.set_extension("1234");
|
|
|
string formatted_number;
|
|
|
// Uses default extension prefix:
|
|
|
phone_util_.Format(nz_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("03-331 6005 ext. 1234", formatted_number);
|
|
|
// Uses RFC 3966 syntax.
|
|
|
phone_util_.Format(nz_number, PhoneNumberUtil::RFC3966, &formatted_number);
|
|
|
EXPECT_EQ("tel:+64-3-331-6005;ext=1234", formatted_number);
|
|
|
// Extension prefix overridden in the territory information for the US:
|
|
|
PhoneNumber us_number_with_extension;
|
|
|
us_number_with_extension.set_country_code(1);
|
|
|
us_number_with_extension.set_national_number(6502530000ULL);
|
|
|
us_number_with_extension.set_extension("4567");
|
|
|
phone_util_.Format(us_number_with_extension,
|
|
|
PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("650 253 0000 extn. 4567", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetLengthOfGeographicalAreaCode) {
|
|
|
PhoneNumber number;
|
|
|
// Google MTV, which has area code "650".
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(6502530000ULL);
|
|
|
EXPECT_EQ(3, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// A North America toll-free number, which has no area code.
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(8002530000ULL);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// An invalid US number (1 digit shorter), which has no area code.
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(650253000ULL);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// Google London, which has area code "20".
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(2070313000ULL);
|
|
|
EXPECT_EQ(2, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// A mobile number in the UK does not have an area code (by default, mobile
|
|
|
// numbers do not, unless they have been added to our list of exceptions).
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(7912345678ULL);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// Google Buenos Aires, which has area code "11".
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(1155303000ULL);
|
|
|
EXPECT_EQ(2, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// A mobile number in Argentina also has an area code.
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(91187654321ULL);
|
|
|
EXPECT_EQ(3, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// Google Sydney, which has area code "2".
|
|
|
number.set_country_code(61);
|
|
|
number.set_national_number(293744000ULL);
|
|
|
EXPECT_EQ(1, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// Italian numbers - there is no national prefix, but it still has an area
|
|
|
// code.
|
|
|
number.set_country_code(39);
|
|
|
number.set_national_number(236618300ULL);
|
|
|
number.set_italian_leading_zero(true);
|
|
|
EXPECT_EQ(2, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// Google Singapore. Singapore has no area code and no national prefix.
|
|
|
number.set_country_code(65);
|
|
|
number.set_national_number(65218000ULL);
|
|
|
number.set_italian_leading_zero(false);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// An international toll free number, which has no area code.
|
|
|
number.set_country_code(800);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(number));
|
|
|
|
|
|
// A mobile number from China is geographical, but does not have an area code.
|
|
|
PhoneNumber cn_mobile;
|
|
|
cn_mobile.set_country_code(86);
|
|
|
cn_mobile.set_national_number(18912341234ULL);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfGeographicalAreaCode(cn_mobile));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetLengthOfNationalDestinationCode) {
|
|
|
PhoneNumber number;
|
|
|
// Google MTV, which has national destination code (NDC) "650".
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(6502530000ULL);
|
|
|
EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// A North America toll-free number, which has NDC "800".
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(8002530000ULL);
|
|
|
EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// Google London, which has NDC "20".
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(2070313000ULL);
|
|
|
EXPECT_EQ(2, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// A UK mobile phone, which has NDC "7912"
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(7912345678ULL);
|
|
|
EXPECT_EQ(4, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// Google Buenos Aires, which has NDC "11".
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(1155303000ULL);
|
|
|
EXPECT_EQ(2, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// An Argentinian mobile which has NDC "911".
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(91187654321ULL);
|
|
|
EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// Google Sydney, which has NDC "2".
|
|
|
number.set_country_code(61);
|
|
|
number.set_national_number(293744000ULL);
|
|
|
EXPECT_EQ(1, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// Google Singapore. Singapore has NDC "6521".
|
|
|
number.set_country_code(65);
|
|
|
number.set_national_number(65218000ULL);
|
|
|
EXPECT_EQ(4, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// An invalid US number (1 digit shorter), which has no NDC.
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(650253000ULL);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// A number containing an invalid country code, which shouldn't have any NDC.
|
|
|
number.set_country_code(123);
|
|
|
number.set_national_number(650253000ULL);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// A number that has only one group of digits after country code when
|
|
|
// formatted in the international format.
|
|
|
number.set_country_code(376);
|
|
|
number.set_national_number(12345ULL);
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// The same number above, but with an extension.
|
|
|
number.set_country_code(376);
|
|
|
number.set_national_number(12345ULL);
|
|
|
number.set_extension("321");
|
|
|
EXPECT_EQ(0, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// An international toll free number, which has NDC "1234".
|
|
|
number.Clear();
|
|
|
number.set_country_code(800);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_EQ(4, phone_util_.GetLengthOfNationalDestinationCode(number));
|
|
|
|
|
|
// A mobile number from China is geographical, but does not have an area code:
|
|
|
// however it still can be considered to have a national destination code.
|
|
|
PhoneNumber cn_mobile;
|
|
|
cn_mobile.set_country_code(86);
|
|
|
cn_mobile.set_national_number(18912341234ULL);
|
|
|
EXPECT_EQ(3, phone_util_.GetLengthOfNationalDestinationCode(cn_mobile));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetCountryMobileToken) {
|
|
|
int country_calling_code;
|
|
|
string mobile_token;
|
|
|
|
|
|
country_calling_code = phone_util_.GetCountryCodeForRegion(RegionCode::MX());
|
|
|
phone_util_.GetCountryMobileToken(country_calling_code, &mobile_token);
|
|
|
EXPECT_EQ("1", mobile_token);
|
|
|
|
|
|
// Country calling code for Sweden, which has no mobile token.
|
|
|
country_calling_code = phone_util_.GetCountryCodeForRegion(RegionCode::SE());
|
|
|
phone_util_.GetCountryMobileToken(country_calling_code, &mobile_token);
|
|
|
EXPECT_EQ("", mobile_token);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ExtractPossibleNumber) {
|
|
|
// Removes preceding funky punctuation and letters but leaves the rest
|
|
|
// untouched.
|
|
|
string extracted_number;
|
|
|
ExtractPossibleNumber("Tel:0800-345-600", &extracted_number);
|
|
|
EXPECT_EQ("0800-345-600", extracted_number);
|
|
|
ExtractPossibleNumber("Tel:0800 FOR PIZZA", &extracted_number);
|
|
|
EXPECT_EQ("0800 FOR PIZZA", extracted_number);
|
|
|
|
|
|
// Should not remove plus sign.
|
|
|
ExtractPossibleNumber("Tel:+800-345-600", &extracted_number);
|
|
|
EXPECT_EQ("+800-345-600", extracted_number);
|
|
|
// Should recognise wide digits as possible start values.
|
|
|
ExtractPossibleNumber("\xEF\xBC\x90\xEF\xBC\x92\xEF\xBC\x93" /* "023" */,
|
|
|
&extracted_number);
|
|
|
EXPECT_EQ("\xEF\xBC\x90\xEF\xBC\x92\xEF\xBC\x93" /* "023" */,
|
|
|
extracted_number);
|
|
|
// Dashes are not possible start values and should be removed.
|
|
|
ExtractPossibleNumber("Num-\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93"
|
|
|
/* "Num-123" */, &extracted_number);
|
|
|
EXPECT_EQ("\xEF\xBC\x91\xEF\xBC\x92\xEF\xBC\x93" /* "123" */,
|
|
|
extracted_number);
|
|
|
// If not possible number present, return empty string.
|
|
|
ExtractPossibleNumber("Num-....", &extracted_number);
|
|
|
EXPECT_EQ("", extracted_number);
|
|
|
// Leading brackets are stripped - these are not used when parsing.
|
|
|
ExtractPossibleNumber("(650) 253-0000", &extracted_number);
|
|
|
EXPECT_EQ("650) 253-0000", extracted_number);
|
|
|
|
|
|
// Trailing non-alpha-numeric characters should be removed.
|
|
|
ExtractPossibleNumber("(650) 253-0000..- ..", &extracted_number);
|
|
|
EXPECT_EQ("650) 253-0000", extracted_number);
|
|
|
ExtractPossibleNumber("(650) 253-0000.", &extracted_number);
|
|
|
EXPECT_EQ("650) 253-0000", extracted_number);
|
|
|
// This case has a trailing RTL char.
|
|
|
ExtractPossibleNumber("(650) 253-0000\xE2\x80\x8F"
|
|
|
/* "(650) 253-0000" */, &extracted_number);
|
|
|
EXPECT_EQ("650) 253-0000", extracted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNANPACountry) {
|
|
|
EXPECT_TRUE(phone_util_.IsNANPACountry(RegionCode::US()));
|
|
|
EXPECT_TRUE(phone_util_.IsNANPACountry(RegionCode::BS()));
|
|
|
EXPECT_FALSE(phone_util_.IsNANPACountry(RegionCode::DE()));
|
|
|
EXPECT_FALSE(phone_util_.IsNANPACountry(RegionCode::GetUnknown()));
|
|
|
EXPECT_FALSE(phone_util_.IsNANPACountry(RegionCode::UN001()));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsValidNumber) {
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
us_number.set_national_number(6502530000ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumber(us_number));
|
|
|
|
|
|
PhoneNumber it_number;
|
|
|
it_number.set_country_code(39);
|
|
|
it_number.set_national_number(236618300ULL);
|
|
|
it_number.set_italian_leading_zero(true);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumber(it_number));
|
|
|
|
|
|
PhoneNumber gb_number;
|
|
|
gb_number.set_country_code(44);
|
|
|
gb_number.set_national_number(7912345678ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumber(gb_number));
|
|
|
|
|
|
PhoneNumber nz_number;
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(21387835ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumber(nz_number));
|
|
|
|
|
|
PhoneNumber intl_toll_free_number;
|
|
|
intl_toll_free_number.set_country_code(800);
|
|
|
intl_toll_free_number.set_national_number(12345678ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumber(intl_toll_free_number));
|
|
|
|
|
|
PhoneNumber universal_premium_rate;
|
|
|
universal_premium_rate.set_country_code(979);
|
|
|
universal_premium_rate.set_national_number(123456789ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumber(universal_premium_rate));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsValidForRegion) {
|
|
|
// This number is valid for the Bahamas, but is not a valid US number.
|
|
|
PhoneNumber bs_number;
|
|
|
bs_number.set_country_code(1);
|
|
|
bs_number.set_national_number(2423232345ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumber(bs_number));
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumberForRegion(bs_number, RegionCode::BS()));
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(bs_number, RegionCode::US()));
|
|
|
bs_number.set_national_number(2421232345ULL);
|
|
|
// This number is no longer valid.
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(bs_number));
|
|
|
|
|
|
// La Mayotte and Réunion use 'leadingDigits' to differentiate them.
|
|
|
PhoneNumber re_number;
|
|
|
re_number.set_country_code(262);
|
|
|
re_number.set_national_number(262123456ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumber(re_number));
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE()));
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT()));
|
|
|
// Now change the number to be a number for La Mayotte.
|
|
|
re_number.set_national_number(269601234ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT()));
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE()));
|
|
|
// This number is no longer valid.
|
|
|
re_number.set_national_number(269123456ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT()));
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE()));
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(re_number));
|
|
|
// However, it should be recognised as from La Mayotte.
|
|
|
string region_code;
|
|
|
phone_util_.GetRegionCodeForNumber(re_number, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::YT(), region_code);
|
|
|
// This number is valid in both places.
|
|
|
re_number.set_national_number(800123456ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::YT()));
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumberForRegion(re_number, RegionCode::RE()));
|
|
|
|
|
|
PhoneNumber intl_toll_free_number;
|
|
|
intl_toll_free_number.set_country_code(800);
|
|
|
intl_toll_free_number.set_national_number(12345678ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsValidNumberForRegion(intl_toll_free_number,
|
|
|
RegionCode::UN001()));
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(intl_toll_free_number,
|
|
|
RegionCode::US()));
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(intl_toll_free_number,
|
|
|
RegionCode::ZZ()));
|
|
|
|
|
|
PhoneNumber invalid_number;
|
|
|
// Invalid country calling codes.
|
|
|
invalid_number.set_country_code(3923);
|
|
|
invalid_number.set_national_number(2366ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(invalid_number,
|
|
|
RegionCode::ZZ()));
|
|
|
invalid_number.set_country_code(3923);
|
|
|
invalid_number.set_national_number(2366ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(invalid_number,
|
|
|
RegionCode::UN001()));
|
|
|
invalid_number.set_country_code(0);
|
|
|
invalid_number.set_national_number(2366ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(invalid_number,
|
|
|
RegionCode::UN001()));
|
|
|
invalid_number.set_country_code(0);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumberForRegion(invalid_number,
|
|
|
RegionCode::ZZ()));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNotValidNumber) {
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
us_number.set_national_number(2530000ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(us_number));
|
|
|
|
|
|
PhoneNumber it_number;
|
|
|
it_number.set_country_code(39);
|
|
|
it_number.set_national_number(23661830000ULL);
|
|
|
it_number.set_italian_leading_zero(true);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(it_number));
|
|
|
|
|
|
PhoneNumber gb_number;
|
|
|
gb_number.set_country_code(44);
|
|
|
gb_number.set_national_number(791234567ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(gb_number));
|
|
|
|
|
|
PhoneNumber de_number;
|
|
|
de_number.set_country_code(49);
|
|
|
de_number.set_national_number(1234ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(de_number));
|
|
|
|
|
|
PhoneNumber nz_number;
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(3316005ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(nz_number));
|
|
|
|
|
|
PhoneNumber invalid_number;
|
|
|
// Invalid country calling codes.
|
|
|
invalid_number.set_country_code(3923);
|
|
|
invalid_number.set_national_number(2366ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(invalid_number));
|
|
|
invalid_number.set_country_code(0);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(invalid_number));
|
|
|
|
|
|
PhoneNumber intl_toll_free_number_too_long;
|
|
|
intl_toll_free_number_too_long.set_country_code(800);
|
|
|
intl_toll_free_number_too_long.set_national_number(123456789ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(intl_toll_free_number_too_long));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetRegionCodeForCountryCode) {
|
|
|
string region_code;
|
|
|
phone_util_.GetRegionCodeForCountryCode(1, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::US(), region_code);
|
|
|
phone_util_.GetRegionCodeForCountryCode(44, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::GB(), region_code);
|
|
|
phone_util_.GetRegionCodeForCountryCode(49, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::DE(), region_code);
|
|
|
phone_util_.GetRegionCodeForCountryCode(800, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::UN001(), region_code);
|
|
|
phone_util_.GetRegionCodeForCountryCode(979, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::UN001(), region_code);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetRegionCodeForNumber) {
|
|
|
string region_code;
|
|
|
PhoneNumber bs_number;
|
|
|
bs_number.set_country_code(1);
|
|
|
bs_number.set_national_number(2423232345ULL);
|
|
|
phone_util_.GetRegionCodeForNumber(bs_number, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::BS(), region_code);
|
|
|
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
us_number.set_national_number(4241231234ULL);
|
|
|
phone_util_.GetRegionCodeForNumber(us_number, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::US(), region_code);
|
|
|
|
|
|
PhoneNumber gb_mobile;
|
|
|
gb_mobile.set_country_code(44);
|
|
|
gb_mobile.set_national_number(7912345678ULL);
|
|
|
phone_util_.GetRegionCodeForNumber(gb_mobile, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::GB(), region_code);
|
|
|
|
|
|
PhoneNumber intl_toll_free_number;
|
|
|
intl_toll_free_number.set_country_code(800);
|
|
|
intl_toll_free_number.set_national_number(12345678ULL);
|
|
|
phone_util_.GetRegionCodeForNumber(intl_toll_free_number, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::UN001(), region_code);
|
|
|
|
|
|
PhoneNumber universal_premium_rate;
|
|
|
universal_premium_rate.set_country_code(979);
|
|
|
universal_premium_rate.set_national_number(123456789ULL);
|
|
|
phone_util_.GetRegionCodeForNumber(universal_premium_rate, ®ion_code);
|
|
|
EXPECT_EQ(RegionCode::UN001(), region_code);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsPossibleNumber) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(6502530000ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumber(number));
|
|
|
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(2530000ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumber(number));
|
|
|
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(2070313000ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumber(number));
|
|
|
|
|
|
number.set_country_code(800);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumber(number));
|
|
|
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 253 0000",
|
|
|
RegionCode::US()));
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 GOO OGLE",
|
|
|
RegionCode::US()));
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("(650) 253-0000",
|
|
|
RegionCode::US()));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForString("253-0000", RegionCode::US()));
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+1 650 253 0000",
|
|
|
RegionCode::GB()));
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+44 20 7031 3000",
|
|
|
RegionCode::GB()));
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("(020) 7031 300",
|
|
|
RegionCode::GB()));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForString("7031 3000", RegionCode::GB()));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForString("3331 6005", RegionCode::NZ()));
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForString("+800 1234 5678",
|
|
|
RegionCode::UN001()));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsPossibleNumberForType_DifferentTypeLengths) {
|
|
|
// We use Argentinian numbers since they have different possible lengths for
|
|
|
// different types.
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(12345ULL);
|
|
|
// Too short for any Argentinian number, including fixed-line.
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
|
|
|
|
|
|
// 6-digit numbers are okay for fixed-line.
|
|
|
number.set_national_number(123456ULL);
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
// But too short for mobile.
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
|
|
|
// And too short for toll-free.
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::TOLL_FREE));
|
|
|
|
|
|
// The same applies to 9-digit numbers.
|
|
|
number.set_national_number(123456789ULL);
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::TOLL_FREE));
|
|
|
|
|
|
// 10-digit numbers are universally possible.
|
|
|
number.set_national_number(1234567890ULL);
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::TOLL_FREE));
|
|
|
|
|
|
// 11-digit numbers are only possible for mobile numbers. Note we don't
|
|
|
// require the leading 9, which all mobile numbers start with, and would be
|
|
|
// required for a valid mobile number.
|
|
|
number.set_national_number(12345678901ULL);
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::TOLL_FREE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsPossibleNumberForType_LocalOnly) {
|
|
|
PhoneNumber number;
|
|
|
// Here we test a number length which matches a local-only length.
|
|
|
number.set_country_code(49);
|
|
|
number.set_national_number(12ULL);
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
// Mobile numbers must be 10 or 11 digits, and there are no local-only
|
|
|
// lengths.
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsPossibleNumberForType_DataMissingForSizeReasons) {
|
|
|
PhoneNumber number;
|
|
|
// Here we test something where the possible lengths match the possible
|
|
|
// lengths of the country as a whole, and hence aren't present in the binary
|
|
|
// for size reasons - this should still work.
|
|
|
// Local-only number.
|
|
|
number.set_country_code(55);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
number.set_national_number(1234567890ULL);
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest,
|
|
|
IsPossibleNumberForType_NumberTypeNotSupportedForRegion) {
|
|
|
PhoneNumber number;
|
|
|
// There are *no* mobile numbers for this region at all, so we return false.
|
|
|
number.set_country_code(55);
|
|
|
number.set_national_number(12345678L);
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
|
|
|
// This matches a fixed-line length though.
|
|
|
EXPECT_TRUE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForType(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
|
|
|
// There are *no* fixed-line OR mobile numbers for this country calling code
|
|
|
// at all, so we return false for these.
|
|
|
number.set_country_code(979);
|
|
|
number.set_national_number(123456789L);
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_FALSE(
|
|
|
phone_util_.IsPossibleNumberForType(number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumberForType(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
EXPECT_TRUE(phone_util_.IsPossibleNumberForType(
|
|
|
number, PhoneNumberUtil::PREMIUM_RATE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsPossibleNumberWithReason) {
|
|
|
// FYI, national numbers for country code +1 that are within 7 to 10 digits
|
|
|
// are possible.
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(6502530000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(2530000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
|
|
|
number.set_country_code(0);
|
|
|
number.set_national_number(2530000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(253000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(65025300000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(2070310000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
|
|
|
number.set_country_code(49);
|
|
|
number.set_national_number(30123456ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
|
|
|
number.set_country_code(65);
|
|
|
number.set_national_number(1234567890ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
|
|
|
number.set_country_code(800);
|
|
|
number.set_national_number(123456789ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberWithReason(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest,
|
|
|
IsPossibleNumberForTypeWithReason_DifferentTypeLengths) {
|
|
|
// We use Argentinian numbers since they have different possible lengths for
|
|
|
// different types.
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(12345ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
|
|
|
// 6-digit numbers are okay for fixed-line.
|
|
|
number.set_national_number(123456ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
// But too short for mobile.
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
// And too short for toll-free.
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::TOLL_FREE));
|
|
|
// The same applies to 9-digit numbers.
|
|
|
number.set_national_number(123456789ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::TOLL_FREE));
|
|
|
// 10-digit numbers are universally possible.
|
|
|
number.set_national_number(1234567890ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::TOLL_FREE));
|
|
|
// 11-digit numbers are possible for mobile numbers. Note we don't require the
|
|
|
// leading 9, which all mobile numbers start with, and would be required for a
|
|
|
// valid mobile number.
|
|
|
number.set_national_number(12345678901ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::TOLL_FREE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsPossibleNumberForTypeWithReason_LocalOnly) {
|
|
|
PhoneNumber number;
|
|
|
// Here we test a number length which matches a local-only length.
|
|
|
number.set_country_code(49);
|
|
|
number.set_national_number(12ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
// Mobile numbers must be 10 or 11 digits, and there are no local-only
|
|
|
// lengths.
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest,
|
|
|
IsPossibleNumberForTypeWithReason_DataMissingForSizeReasons) {
|
|
|
PhoneNumber number;
|
|
|
// Here we test something where the possible lengths match the possible
|
|
|
// lengths of the country as a whole, and hence aren't present in the binary
|
|
|
// for size reasons - this should still work.
|
|
|
// Local-only number.
|
|
|
number.set_country_code(55);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
// Normal-length number.
|
|
|
number.set_national_number(1234567890ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::UNKNOWN));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest,
|
|
|
IsPossibleNumberForTypeWithReason_NumberTypeNotSupportedForRegion) {
|
|
|
PhoneNumber number;
|
|
|
// There are *no* mobile numbers for this region at all, so we return
|
|
|
// INVALID_LENGTH.
|
|
|
number.set_country_code(55);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
// This matches a fixed-line length though.
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE_LOCAL_ONLY,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
// This is too short for fixed-line, and no mobile numbers exist.
|
|
|
number.set_national_number(1234567ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
// This is too short for mobile, and no fixed-line number exist.
|
|
|
number.set_country_code(882);
|
|
|
number.set_national_number(1234567ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
|
|
|
// There are *no* fixed-line OR mobile numbers for this country calling code
|
|
|
// at all, so we return INVALID_LENGTH.
|
|
|
number.set_country_code(979);
|
|
|
number.set_national_number(123456789ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::PREMIUM_RATE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest,
|
|
|
IsPossibleNumberForTypeWithReason_FixedLineOrMobile) {
|
|
|
PhoneNumber number;
|
|
|
// For FIXED_LINE_OR_MOBILE, a number should be considered valid if it matches
|
|
|
// the possible lengths for mobile *or* fixed-line numbers.
|
|
|
number.set_country_code(290);
|
|
|
number.set_national_number(1234ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
|
|
|
number.set_national_number(12345ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_LENGTH,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
|
|
|
number.set_national_number(123456ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
|
|
|
number.set_national_number(1234567ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::MOBILE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::TOLL_FREE));
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
|
|
|
phone_util_.IsPossibleNumberForTypeWithReason(
|
|
|
number, PhoneNumberUtil::FIXED_LINE_OR_MOBILE));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNotPossibleNumber) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(65025300000ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumber(number));
|
|
|
|
|
|
number.set_country_code(800);
|
|
|
number.set_national_number(123456789ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumber(number));
|
|
|
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(253000ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumber(number));
|
|
|
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(300ULL);
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumber(number));
|
|
|
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumberForString("+1 650 253 00000",
|
|
|
RegionCode::US()));
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumberForString("(650) 253-00000",
|
|
|
RegionCode::US()));
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumberForString("I want a Pizza",
|
|
|
RegionCode::US()));
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumberForString("253-000",
|
|
|
RegionCode::US()));
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumberForString("1 3000",
|
|
|
RegionCode::GB()));
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumberForString("+44 300",
|
|
|
RegionCode::GB()));
|
|
|
EXPECT_FALSE(phone_util_.IsPossibleNumberForString("+800 1234 5678 9",
|
|
|
RegionCode::UN001()));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, TruncateTooLongNumber) {
|
|
|
// US number 650-253-0000, but entered with one additional digit at the end.
|
|
|
PhoneNumber too_long_number;
|
|
|
too_long_number.set_country_code(1);
|
|
|
too_long_number.set_national_number(65025300001ULL);
|
|
|
PhoneNumber valid_number;
|
|
|
valid_number.set_country_code(1);
|
|
|
valid_number.set_national_number(6502530000ULL);
|
|
|
EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number));
|
|
|
EXPECT_EQ(valid_number, too_long_number);
|
|
|
|
|
|
too_long_number.set_country_code(800);
|
|
|
too_long_number.set_national_number(123456789ULL);
|
|
|
valid_number.set_country_code(800);
|
|
|
valid_number.set_national_number(12345678ULL);
|
|
|
EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number));
|
|
|
EXPECT_EQ(valid_number, too_long_number);
|
|
|
|
|
|
// GB number 080 1234 5678, but entered with 4 extra digits at the end.
|
|
|
too_long_number.set_country_code(44);
|
|
|
too_long_number.set_national_number(80123456780123ULL);
|
|
|
valid_number.set_country_code(44);
|
|
|
valid_number.set_national_number(8012345678ULL);
|
|
|
EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number));
|
|
|
EXPECT_EQ(valid_number, too_long_number);
|
|
|
|
|
|
// IT number 022 3456 7890, but entered with 3 extra digits at the end.
|
|
|
too_long_number.set_country_code(39);
|
|
|
too_long_number.set_national_number(2234567890123ULL);
|
|
|
too_long_number.set_italian_leading_zero(true);
|
|
|
valid_number.set_country_code(39);
|
|
|
valid_number.set_national_number(2234567890ULL);
|
|
|
valid_number.set_italian_leading_zero(true);
|
|
|
EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&too_long_number));
|
|
|
EXPECT_EQ(valid_number, too_long_number);
|
|
|
|
|
|
// Tests what happens when a valid number is passed in.
|
|
|
PhoneNumber valid_number_copy(valid_number);
|
|
|
EXPECT_TRUE(phone_util_.TruncateTooLongNumber(&valid_number));
|
|
|
// Tests the number is not modified.
|
|
|
EXPECT_EQ(valid_number_copy, valid_number);
|
|
|
|
|
|
// Tests what happens when a number with invalid prefix is passed in.
|
|
|
PhoneNumber number_with_invalid_prefix;
|
|
|
number_with_invalid_prefix.set_country_code(1);
|
|
|
// The test metadata says US numbers cannot have prefix 240.
|
|
|
number_with_invalid_prefix.set_national_number(2401234567ULL);
|
|
|
PhoneNumber invalid_number_copy(number_with_invalid_prefix);
|
|
|
EXPECT_FALSE(phone_util_.TruncateTooLongNumber(&number_with_invalid_prefix));
|
|
|
// Tests the number is not modified.
|
|
|
EXPECT_EQ(invalid_number_copy, number_with_invalid_prefix);
|
|
|
|
|
|
// Tests what happens when a too short number is passed in.
|
|
|
PhoneNumber too_short_number;
|
|
|
too_short_number.set_country_code(1);
|
|
|
too_short_number.set_national_number(1234ULL);
|
|
|
PhoneNumber too_short_number_copy(too_short_number);
|
|
|
EXPECT_FALSE(phone_util_.TruncateTooLongNumber(&too_short_number));
|
|
|
// Tests the number is not modified.
|
|
|
EXPECT_EQ(too_short_number_copy, too_short_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNumberGeographical) {
|
|
|
PhoneNumber number;
|
|
|
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(2423570000ULL);
|
|
|
EXPECT_FALSE(IsNumberGeographical(number)); // Bahamas, mobile phone number.
|
|
|
|
|
|
number.set_country_code(61);
|
|
|
number.set_national_number(236618300ULL);
|
|
|
EXPECT_TRUE(IsNumberGeographical(number)); // Australian fixed line number.
|
|
|
|
|
|
number.set_country_code(800);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_FALSE(IsNumberGeographical(number)); // International toll free
|
|
|
// number.
|
|
|
|
|
|
// We test that mobile phone numbers in relevant regions are indeed considered
|
|
|
// geographical.
|
|
|
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(91187654321ULL);
|
|
|
EXPECT_TRUE(IsNumberGeographical(number)); // Argentina, mobile phone number.
|
|
|
|
|
|
number.set_country_code(52);
|
|
|
number.set_national_number(12345678900ULL);
|
|
|
EXPECT_TRUE(IsNumberGeographical(number)); // Mexico, mobile phone number.
|
|
|
|
|
|
number.set_country_code(52);
|
|
|
number.set_national_number(15512345678ULL);
|
|
|
EXPECT_TRUE(IsNumberGeographical(number)); // Mexico, another mobile phone
|
|
|
// number.
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsLeadingZeroPossible) {
|
|
|
EXPECT_TRUE(IsLeadingZeroPossible(39)); // Italy
|
|
|
EXPECT_FALSE(IsLeadingZeroPossible(1)); // USA
|
|
|
EXPECT_TRUE(IsLeadingZeroPossible(800)); // International toll free
|
|
|
EXPECT_FALSE(IsLeadingZeroPossible(979)); // International premium-rate
|
|
|
EXPECT_FALSE(IsLeadingZeroPossible(888)); // Not in metadata file, should
|
|
|
// return default value of false.
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FormatInOriginalFormat) {
|
|
|
PhoneNumber phone_number;
|
|
|
string formatted_number;
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("+442087654321", RegionCode::GB(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+44 20 8765 4321", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("02087654321", RegionCode::GB(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("(020) 8765 4321", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("011442087654321",
|
|
|
RegionCode::US(), &phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("011 44 20 8765 4321", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("442087654321", RegionCode::GB(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("44 20 8765 4321", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+442087654321", RegionCode::GB(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("(020) 8765 4321", formatted_number);
|
|
|
|
|
|
// Invalid numbers that we have a formatting pattern for should be formatted
|
|
|
// properly. Note area codes starting with 7 are intentionally excluded in
|
|
|
// the test metadata for testing purposes.
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("7345678901", RegionCode::US(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("734 567 8901", formatted_number);
|
|
|
|
|
|
// US is not a leading zero country, and the presence of the leading zero
|
|
|
// leads us to format the number using raw_input.
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("0734567 8901", RegionCode::US(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0734567 8901", formatted_number);
|
|
|
|
|
|
// This number is valid, but we don't have a formatting pattern for it. Fall
|
|
|
// back to the raw input.
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("02-4567-8900", RegionCode::KR(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::KR(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("02-4567-8900", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("01180012345678",
|
|
|
RegionCode::US(), &phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("011 800 1234 5678", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("+80012345678", RegionCode::KR(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::KR(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+800 1234 5678", formatted_number);
|
|
|
|
|
|
// US local numbers are formatted correctly, as we have formatting patterns
|
|
|
// for them.
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("2530000", RegionCode::US(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("253 0000", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// Number with national prefix in the US.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("18003456789", RegionCode::US(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("1 800 345 6789", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// Number without national prefix in the UK.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("2087654321", RegionCode::GB(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("20 8765 4321", formatted_number);
|
|
|
// Make sure no metadata is modified as a result of the previous function
|
|
|
// call.
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+442087654321", RegionCode::GB(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::GB(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("(020) 8765 4321", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// Number with national prefix in Mexico.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("013312345678", RegionCode::MX(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::MX(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("01 33 1234 5678", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// Number without national prefix in Mexico.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("3312345678", RegionCode::MX(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::MX(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("33 1234 5678", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// Italian fixed-line number.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("0212345678", RegionCode::IT(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::IT(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("02 1234 5678", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// Number with national prefix in Japan.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("00777012", RegionCode::JP(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::JP(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0077-7012", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// Number without national prefix in Japan.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("0777012", RegionCode::JP(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::JP(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0777012", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// Number with carrier code in Brazil.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("012 3121286979", RegionCode::BR(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::BR(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("012 3121286979", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
// The default national prefix used in this case is 045. When a number with
|
|
|
// national prefix 044 is entered, we return the raw input as we don't want to
|
|
|
// change the number entered.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("044(33)1234-5678",
|
|
|
RegionCode::MX(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::MX(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("044(33)1234-5678", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("045(33)1234-5678",
|
|
|
RegionCode::MX(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::MX(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("045 33 1234 5678", formatted_number);
|
|
|
|
|
|
// The default international prefix used in this case is 0011. When a number
|
|
|
// with international prefix 0012 is entered, we return the raw input as we
|
|
|
// don't want to change the number entered.
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("0012 16502530000",
|
|
|
RegionCode::AU(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0012 16502530000", formatted_number);
|
|
|
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("0011 16502530000",
|
|
|
RegionCode::AU(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::AU(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("0011 1 650 253 0000", formatted_number);
|
|
|
|
|
|
// Test the star sign is not removed from or added to the original input by
|
|
|
// this method.
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("*1234",
|
|
|
RegionCode::JP(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::JP(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("*1234", formatted_number);
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("1234",
|
|
|
RegionCode::JP(),
|
|
|
&phone_number));
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::JP(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("1234", formatted_number);
|
|
|
|
|
|
// Test that an invalid national number without raw input is just formatted
|
|
|
// as the national number.
|
|
|
phone_number.Clear();
|
|
|
formatted_number.clear();
|
|
|
phone_number.set_country_code_source(PhoneNumber::FROM_DEFAULT_COUNTRY);
|
|
|
phone_number.set_country_code(1);
|
|
|
phone_number.set_national_number(650253000ULL);
|
|
|
phone_util_.FormatInOriginalFormat(phone_number, RegionCode::US(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("650253000", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsPremiumRate) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(9004433030ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(39);
|
|
|
number.set_national_number(892123ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(9187654321ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(49);
|
|
|
number.set_national_number(9001654321ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(49);
|
|
|
number.set_national_number(90091234567ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(979);
|
|
|
number.set_national_number(123456789ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::PREMIUM_RATE, phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsTollFree) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(8881234567ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(39);
|
|
|
number.set_national_number(803123ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(8012345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(49);
|
|
|
number.set_national_number(8001234567ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(800);
|
|
|
number.set_national_number(12345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOLL_FREE, phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsMobile) {
|
|
|
PhoneNumber number;
|
|
|
// A Bahama mobile number
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(2423570000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(39);
|
|
|
number.set_national_number(312345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(7912345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(49);
|
|
|
number.set_national_number(15123456789ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(91187654321ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::MOBILE, phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsFixedLine) {
|
|
|
PhoneNumber number;
|
|
|
// A Bahama fixed-line number
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(2423651234ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
// An Italian fixed-line number
|
|
|
number.Clear();
|
|
|
number.set_country_code(39);
|
|
|
number.set_national_number(236618300ULL);
|
|
|
number.set_italian_leading_zero(true);
|
|
|
EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.Clear();
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(2012345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(49);
|
|
|
number.set_national_number(301234ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::FIXED_LINE, phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsFixedLineAndMobile) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(6502531111ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::FIXED_LINE_OR_MOBILE,
|
|
|
phone_util_.GetNumberType(number));
|
|
|
|
|
|
number.set_country_code(54);
|
|
|
number.set_national_number(1987654321ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::FIXED_LINE_OR_MOBILE,
|
|
|
phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsSharedCost) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(8431231234ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHARED_COST, phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsVoip) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(5631231234ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::VOIP, phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsPersonalNumber) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(44);
|
|
|
number.set_national_number(7031231234ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::PERSONAL_NUMBER,
|
|
|
phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsUnknown) {
|
|
|
PhoneNumber number;
|
|
|
number.set_country_code(1);
|
|
|
number.set_national_number(65025311111ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::UNKNOWN, phone_util_.GetNumberType(number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetCountryCodeForRegion) {
|
|
|
EXPECT_EQ(1, phone_util_.GetCountryCodeForRegion(RegionCode::US()));
|
|
|
EXPECT_EQ(64, phone_util_.GetCountryCodeForRegion(RegionCode::NZ()));
|
|
|
EXPECT_EQ(0, phone_util_.GetCountryCodeForRegion(RegionCode::GetUnknown()));
|
|
|
EXPECT_EQ(0, phone_util_.GetCountryCodeForRegion(RegionCode::UN001()));
|
|
|
// CS is already deprecated so the library doesn't support it.
|
|
|
EXPECT_EQ(0, phone_util_.GetCountryCodeForRegion(RegionCode::CS()));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, GetNationalDiallingPrefixForRegion) {
|
|
|
string ndd_prefix;
|
|
|
phone_util_.GetNddPrefixForRegion(RegionCode::US(), false, &ndd_prefix);
|
|
|
EXPECT_EQ("1", ndd_prefix);
|
|
|
|
|
|
// Test non-main country to see it gets the national dialling prefix for the
|
|
|
// main country with that country calling code.
|
|
|
ndd_prefix.clear();
|
|
|
phone_util_.GetNddPrefixForRegion(RegionCode::BS(), false, &ndd_prefix);
|
|
|
EXPECT_EQ("1", ndd_prefix);
|
|
|
|
|
|
ndd_prefix.clear();
|
|
|
phone_util_.GetNddPrefixForRegion(RegionCode::NZ(), false, &ndd_prefix);
|
|
|
EXPECT_EQ("0", ndd_prefix);
|
|
|
|
|
|
ndd_prefix.clear();
|
|
|
// Test case with non digit in the national prefix.
|
|
|
phone_util_.GetNddPrefixForRegion(RegionCode::AO(), false, &ndd_prefix);
|
|
|
EXPECT_EQ("0~0", ndd_prefix);
|
|
|
|
|
|
ndd_prefix.clear();
|
|
|
phone_util_.GetNddPrefixForRegion(RegionCode::AO(), true, &ndd_prefix);
|
|
|
EXPECT_EQ("00", ndd_prefix);
|
|
|
|
|
|
// Test cases with invalid regions.
|
|
|
ndd_prefix.clear();
|
|
|
phone_util_.GetNddPrefixForRegion(RegionCode::GetUnknown(), false,
|
|
|
&ndd_prefix);
|
|
|
EXPECT_EQ("", ndd_prefix);
|
|
|
|
|
|
ndd_prefix.clear();
|
|
|
phone_util_.GetNddPrefixForRegion(RegionCode::UN001(), false, &ndd_prefix);
|
|
|
EXPECT_EQ("", ndd_prefix);
|
|
|
|
|
|
// CS is already deprecated so the library doesn't support it.
|
|
|
ndd_prefix.clear();
|
|
|
phone_util_.GetNddPrefixForRegion(RegionCode::CS(), false, &ndd_prefix);
|
|
|
EXPECT_EQ("", ndd_prefix);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsViablePhoneNumber) {
|
|
|
EXPECT_FALSE(IsViablePhoneNumber("1"));
|
|
|
// Only one or two digits before strange non-possible punctuation.
|
|
|
EXPECT_FALSE(IsViablePhoneNumber("1+1+1"));
|
|
|
EXPECT_FALSE(IsViablePhoneNumber("80+0"));
|
|
|
// Two digits is viable.
|
|
|
EXPECT_TRUE(IsViablePhoneNumber("00"));
|
|
|
EXPECT_TRUE(IsViablePhoneNumber("111"));
|
|
|
// Alpha numbers.
|
|
|
EXPECT_TRUE(IsViablePhoneNumber("0800-4-pizza"));
|
|
|
EXPECT_TRUE(IsViablePhoneNumber("0800-4-PIZZA"));
|
|
|
// We need at least three digits before any alpha characters.
|
|
|
EXPECT_FALSE(IsViablePhoneNumber("08-PIZZA"));
|
|
|
EXPECT_FALSE(IsViablePhoneNumber("8-PIZZA"));
|
|
|
EXPECT_FALSE(IsViablePhoneNumber("12. March"));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsViablePhoneNumberNonAscii) {
|
|
|
// Only one or two digits before possible punctuation followed by more digits.
|
|
|
// The punctuation used here is the unicode character u+3000.
|
|
|
EXPECT_TRUE(IsViablePhoneNumber("1\xE3\x80\x80" "34" /* "1 34" */));
|
|
|
EXPECT_FALSE(IsViablePhoneNumber("1\xE3\x80\x80" "3+4" /* "1 3+4" */));
|
|
|
// Unicode variants of possible starting character and other allowed
|
|
|
// punctuation/digits.
|
|
|
EXPECT_TRUE(IsViablePhoneNumber("\xEF\xBC\x88" "1\xEF\xBC\x89\xE3\x80\x80"
|
|
|
"3456789" /* "(1) 3456789" */));
|
|
|
// Testing a leading + is okay.
|
|
|
EXPECT_TRUE(IsViablePhoneNumber("+1\xEF\xBC\x89\xE3\x80\x80"
|
|
|
"3456789" /* "+1) 3456789" */));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ConvertAlphaCharactersInNumber) {
|
|
|
string input("1800-ABC-DEF");
|
|
|
phone_util_.ConvertAlphaCharactersInNumber(&input);
|
|
|
// Alpha chars are converted to digits; everything else is left untouched.
|
|
|
static const string kExpectedOutput = "1800-222-333";
|
|
|
EXPECT_EQ(kExpectedOutput, input);
|
|
|
|
|
|
// Try with some non-ASCII characters.
|
|
|
input.assign("1\xE3\x80\x80\xEF\xBC\x88" "800) ABC-DEF"
|
|
|
/* "1 (800) ABC-DEF" */);
|
|
|
static const string kExpectedFullwidthOutput =
|
|
|
"1\xE3\x80\x80\xEF\xBC\x88" "800) 222-333" /* "1 (800) 222-333" */;
|
|
|
phone_util_.ConvertAlphaCharactersInNumber(&input);
|
|
|
EXPECT_EQ(kExpectedFullwidthOutput, input);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, NormaliseRemovePunctuation) {
|
|
|
string input_number("034-56&+#2" "\xC2\xAD" "34");
|
|
|
Normalize(&input_number);
|
|
|
static const string kExpectedOutput("03456234");
|
|
|
EXPECT_EQ(kExpectedOutput, input_number)
|
|
|
<< "Conversion did not correctly remove punctuation";
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, NormaliseReplaceAlphaCharacters) {
|
|
|
string input_number("034-I-am-HUNGRY");
|
|
|
Normalize(&input_number);
|
|
|
static const string kExpectedOutput("034426486479");
|
|
|
EXPECT_EQ(kExpectedOutput, input_number)
|
|
|
<< "Conversion did not correctly replace alpha characters";
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, NormaliseOtherDigits) {
|
|
|
// The first digit is a full-width 2, the last digit is an Arabic-indic digit
|
|
|
// 5.
|
|
|
string input_number("\xEF\xBC\x92" "5\xD9\xA5" /* "25٥" */);
|
|
|
Normalize(&input_number);
|
|
|
static const string kExpectedOutput("255");
|
|
|
EXPECT_EQ(kExpectedOutput, input_number)
|
|
|
<< "Conversion did not correctly replace non-latin digits";
|
|
|
// The first digit is an Eastern-Arabic 5, the latter an Eastern-Arabic 0.
|
|
|
string eastern_arabic_input_number("\xDB\xB5" "2\xDB\xB0" /* "۵2۰" */);
|
|
|
Normalize(&eastern_arabic_input_number);
|
|
|
static const string kExpectedOutput2("520");
|
|
|
EXPECT_EQ(kExpectedOutput2, eastern_arabic_input_number)
|
|
|
<< "Conversion did not correctly replace non-latin digits";
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, NormaliseStripAlphaCharacters) {
|
|
|
string input_number("034-56&+a#234");
|
|
|
phone_util_.NormalizeDigitsOnly(&input_number);
|
|
|
static const string kExpectedOutput("03456234");
|
|
|
EXPECT_EQ(kExpectedOutput, input_number)
|
|
|
<< "Conversion did not correctly remove alpha characters";
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, NormaliseStripNonDiallableCharacters) {
|
|
|
string input_number("03*4-56&+1a#234");
|
|
|
phone_util_.NormalizeDiallableCharsOnly(&input_number);
|
|
|
static const string kExpectedOutput("03*456+1#234");
|
|
|
EXPECT_EQ(kExpectedOutput, input_number)
|
|
|
<< "Conversion did not correctly remove non-diallable characters";
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, MaybeStripInternationalPrefix) {
|
|
|
string international_prefix("00[39]");
|
|
|
string number_to_strip("0034567700-3898003");
|
|
|
// Note the dash is removed as part of the normalization.
|
|
|
string stripped_number("45677003898003");
|
|
|
EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD,
|
|
|
MaybeStripInternationalPrefixAndNormalize(international_prefix,
|
|
|
&number_to_strip));
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "The number was not stripped of its international prefix.";
|
|
|
|
|
|
// Now the number no longer starts with an IDD prefix, so it should now report
|
|
|
// FROM_DEFAULT_COUNTRY.
|
|
|
EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY,
|
|
|
MaybeStripInternationalPrefixAndNormalize(international_prefix,
|
|
|
&number_to_strip));
|
|
|
|
|
|
number_to_strip.assign("00945677003898003");
|
|
|
EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD,
|
|
|
MaybeStripInternationalPrefixAndNormalize(international_prefix,
|
|
|
&number_to_strip));
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "The number was not stripped of its international prefix.";
|
|
|
|
|
|
// Test it works when the international prefix is broken up by spaces.
|
|
|
number_to_strip.assign("00 9 45677003898003");
|
|
|
EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD,
|
|
|
MaybeStripInternationalPrefixAndNormalize(international_prefix,
|
|
|
&number_to_strip));
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "The number was not stripped of its international prefix.";
|
|
|
// Now the number no longer starts with an IDD prefix, so it should now report
|
|
|
// FROM_DEFAULT_COUNTRY.
|
|
|
EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY,
|
|
|
MaybeStripInternationalPrefixAndNormalize(international_prefix,
|
|
|
&number_to_strip));
|
|
|
|
|
|
// Test the + symbol is also recognised and stripped.
|
|
|
number_to_strip.assign("+45677003898003");
|
|
|
stripped_number.assign("45677003898003");
|
|
|
EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN,
|
|
|
MaybeStripInternationalPrefixAndNormalize(international_prefix,
|
|
|
&number_to_strip));
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "The number supplied was not stripped of the plus symbol.";
|
|
|
|
|
|
// If the number afterwards is a zero, we should not strip this - no country
|
|
|
// code begins with 0.
|
|
|
number_to_strip.assign("0090112-3123");
|
|
|
stripped_number.assign("00901123123");
|
|
|
EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY,
|
|
|
MaybeStripInternationalPrefixAndNormalize(international_prefix,
|
|
|
&number_to_strip));
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "The number had a 0 after the match so shouldn't be stripped.";
|
|
|
// Here the 0 is separated by a space from the IDD.
|
|
|
number_to_strip.assign("009 0-112-3123");
|
|
|
EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY,
|
|
|
MaybeStripInternationalPrefixAndNormalize(international_prefix,
|
|
|
&number_to_strip));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, MaybeStripNationalPrefixAndCarrierCode) {
|
|
|
PhoneMetadata metadata;
|
|
|
metadata.set_national_prefix_for_parsing("34");
|
|
|
metadata.mutable_general_desc()->set_national_number_pattern("\\d{4,8}");
|
|
|
string number_to_strip("34356778");
|
|
|
string stripped_number("356778");
|
|
|
string carrier_code;
|
|
|
MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
|
|
|
&carrier_code);
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "Should have had national prefix stripped.";
|
|
|
EXPECT_EQ("", carrier_code) << "Should have had no carrier code stripped.";
|
|
|
// Retry stripping - now the number should not start with the national prefix,
|
|
|
// so no more stripping should occur.
|
|
|
MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
|
|
|
&carrier_code);
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "Should have had no change - no national prefix present.";
|
|
|
// Some countries have no national prefix. Repeat test with none specified.
|
|
|
metadata.clear_national_prefix_for_parsing();
|
|
|
MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
|
|
|
&carrier_code);
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "Should have had no change - empty national prefix.";
|
|
|
// If the resultant number doesn't match the national rule, it shouldn't be
|
|
|
// stripped.
|
|
|
metadata.set_national_prefix_for_parsing("3");
|
|
|
number_to_strip.assign("3123");
|
|
|
stripped_number.assign("3123");
|
|
|
MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
|
|
|
&carrier_code);
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "Should have had no change - after stripping, it wouldn't have "
|
|
|
<< "matched the national rule.";
|
|
|
// Test extracting carrier selection code.
|
|
|
metadata.set_national_prefix_for_parsing("0(81)?");
|
|
|
number_to_strip.assign("08122123456");
|
|
|
stripped_number.assign("22123456");
|
|
|
MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
|
|
|
&carrier_code);
|
|
|
EXPECT_EQ("81", carrier_code) << "Should have had carrier code stripped.";
|
|
|
EXPECT_EQ(stripped_number, number_to_strip)
|
|
|
<< "Should have had national prefix and carrier code stripped.";
|
|
|
// If there was a transform rule, check it was applied.
|
|
|
metadata.set_national_prefix_transform_rule("5$15");
|
|
|
// Note that a capturing group is present here.
|
|
|
metadata.set_national_prefix_for_parsing("0(\\d{2})");
|
|
|
number_to_strip.assign("031123");
|
|
|
string transformed_number("5315123");
|
|
|
MaybeStripNationalPrefixAndCarrierCode(metadata, &number_to_strip,
|
|
|
&carrier_code);
|
|
|
EXPECT_EQ(transformed_number, number_to_strip)
|
|
|
<< "Was not successfully transformed.";
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, MaybeStripExtension) {
|
|
|
// One with extension.
|
|
|
string number("1234576 ext. 1234");
|
|
|
string extension;
|
|
|
string expected_extension("1234");
|
|
|
string stripped_number("1234576");
|
|
|
EXPECT_TRUE(MaybeStripExtension(&number, &extension));
|
|
|
EXPECT_EQ(stripped_number, number);
|
|
|
EXPECT_EQ(expected_extension, extension);
|
|
|
|
|
|
// One without extension.
|
|
|
number.assign("1234-576");
|
|
|
extension.clear();
|
|
|
stripped_number.assign("1234-576");
|
|
|
EXPECT_FALSE(MaybeStripExtension(&number, &extension));
|
|
|
EXPECT_EQ(stripped_number, number);
|
|
|
EXPECT_TRUE(extension.empty());
|
|
|
|
|
|
// One with an extension caught by the second capturing group in
|
|
|
// kKnownExtnPatterns.
|
|
|
number.assign("1234576-123#");
|
|
|
extension.clear();
|
|
|
expected_extension.assign("123");
|
|
|
stripped_number.assign("1234576");
|
|
|
EXPECT_TRUE(MaybeStripExtension(&number, &extension));
|
|
|
EXPECT_EQ(stripped_number, number);
|
|
|
EXPECT_EQ(expected_extension, extension);
|
|
|
|
|
|
number.assign("1234576 ext.123#");
|
|
|
extension.clear();
|
|
|
EXPECT_TRUE(MaybeStripExtension(&number, &extension));
|
|
|
EXPECT_EQ(stripped_number, number);
|
|
|
EXPECT_EQ(expected_extension, extension);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, MaybeExtractCountryCode) {
|
|
|
PhoneNumber number;
|
|
|
const PhoneMetadata* metadata = GetPhoneMetadata(RegionCode::US());
|
|
|
// Note that for the US, the IDD is 011.
|
|
|
string phone_number("011112-3456789");
|
|
|
string stripped_number("123456789");
|
|
|
int expected_country_code = 1;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, true, &phone_number, &number));
|
|
|
EXPECT_EQ(expected_country_code, number.country_code());
|
|
|
EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_IDD, number.country_code_source());
|
|
|
EXPECT_EQ(stripped_number, phone_number);
|
|
|
|
|
|
number.Clear();
|
|
|
phone_number.assign("+80012345678");
|
|
|
stripped_number.assign("12345678");
|
|
|
expected_country_code = 800;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, true, &phone_number, &number));
|
|
|
EXPECT_EQ(expected_country_code, number.country_code());
|
|
|
EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN,
|
|
|
number.country_code_source());
|
|
|
EXPECT_EQ(stripped_number, phone_number);
|
|
|
|
|
|
number.Clear();
|
|
|
phone_number.assign("+6423456789");
|
|
|
stripped_number.assign("23456789");
|
|
|
expected_country_code = 64;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, true, &phone_number, &number));
|
|
|
EXPECT_EQ(expected_country_code, number.country_code());
|
|
|
EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN,
|
|
|
number.country_code_source());
|
|
|
EXPECT_EQ(stripped_number, phone_number);
|
|
|
|
|
|
// Should not have extracted a country code - no international prefix present.
|
|
|
number.Clear();
|
|
|
expected_country_code = 0;
|
|
|
phone_number.assign("2345-6789");
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, true, &phone_number, &number));
|
|
|
EXPECT_EQ(expected_country_code, number.country_code());
|
|
|
EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, number.country_code_source());
|
|
|
EXPECT_EQ(stripped_number, phone_number);
|
|
|
|
|
|
expected_country_code = 0;
|
|
|
phone_number.assign("0119991123456789");
|
|
|
stripped_number.assign(phone_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, true, &phone_number, &number));
|
|
|
|
|
|
number.Clear();
|
|
|
phone_number.assign("(1 610) 619 4466");
|
|
|
stripped_number.assign("6106194466");
|
|
|
expected_country_code = 1;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, true, &phone_number, &number));
|
|
|
EXPECT_EQ(expected_country_code, number.country_code());
|
|
|
EXPECT_EQ(PhoneNumber::FROM_NUMBER_WITHOUT_PLUS_SIGN,
|
|
|
number.country_code_source());
|
|
|
EXPECT_EQ(stripped_number, phone_number);
|
|
|
|
|
|
number.Clear();
|
|
|
phone_number.assign("(1 610) 619 4466");
|
|
|
stripped_number.assign("6106194466");
|
|
|
expected_country_code = 1;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, false, &phone_number, &number));
|
|
|
EXPECT_EQ(expected_country_code, number.country_code());
|
|
|
EXPECT_FALSE(number.has_country_code_source());
|
|
|
EXPECT_EQ(stripped_number, phone_number);
|
|
|
|
|
|
// Should not have extracted a country code - invalid number after extraction
|
|
|
// of uncertain country code.
|
|
|
number.Clear();
|
|
|
phone_number.assign("(1 610) 619 446");
|
|
|
stripped_number.assign("1610619446");
|
|
|
expected_country_code = 0;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, false, &phone_number, &number));
|
|
|
EXPECT_EQ(expected_country_code, number.country_code());
|
|
|
EXPECT_FALSE(number.has_country_code_source());
|
|
|
EXPECT_EQ(stripped_number, phone_number);
|
|
|
|
|
|
number.Clear();
|
|
|
phone_number.assign("(1 610) 619");
|
|
|
stripped_number.assign("1610619");
|
|
|
expected_country_code = 0;
|
|
|
// Should not have extracted a country code - invalid number both before and
|
|
|
// after extraction of uncertain country code.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
MaybeExtractCountryCode(metadata, true, &phone_number, &number));
|
|
|
EXPECT_EQ(expected_country_code, number.country_code());
|
|
|
EXPECT_EQ(PhoneNumber::FROM_DEFAULT_COUNTRY, number.country_code_source());
|
|
|
EXPECT_EQ(stripped_number, phone_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, CountryWithNoNumberDesc) {
|
|
|
string formatted_number;
|
|
|
// Andorra is a country where we don't have PhoneNumberDesc info in the
|
|
|
// metadata.
|
|
|
PhoneNumber ad_number;
|
|
|
ad_number.set_country_code(376);
|
|
|
ad_number.set_national_number(12345ULL);
|
|
|
phone_util_.Format(ad_number, PhoneNumberUtil::INTERNATIONAL,
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("+376 12345", formatted_number);
|
|
|
phone_util_.Format(ad_number, PhoneNumberUtil::E164, &formatted_number);
|
|
|
EXPECT_EQ("+37612345", formatted_number);
|
|
|
phone_util_.Format(ad_number, PhoneNumberUtil::NATIONAL, &formatted_number);
|
|
|
EXPECT_EQ("12345", formatted_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::UNKNOWN, phone_util_.GetNumberType(ad_number));
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(ad_number));
|
|
|
|
|
|
// Test dialing a US number from within Andorra.
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
us_number.set_national_number(6502530000ULL);
|
|
|
phone_util_.FormatOutOfCountryCallingNumber(us_number, RegionCode::AD(),
|
|
|
&formatted_number);
|
|
|
EXPECT_EQ("00 1 650 253 0000", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, UnknownCountryCallingCode) {
|
|
|
PhoneNumber invalid_number;
|
|
|
invalid_number.set_country_code(kInvalidCountryCode);
|
|
|
invalid_number.set_national_number(12345ULL);
|
|
|
|
|
|
EXPECT_FALSE(phone_util_.IsValidNumber(invalid_number));
|
|
|
|
|
|
// It's not very well defined as to what the E164 representation for a number
|
|
|
// with an invalid country calling code is, but just prefixing the country
|
|
|
// code and national number is about the best we can do.
|
|
|
string formatted_number;
|
|
|
phone_util_.Format(invalid_number, PhoneNumberUtil::E164, &formatted_number);
|
|
|
EXPECT_EQ("+212345", formatted_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNumberMatchMatches) {
|
|
|
// Test simple matches where formatting is different, or leading zeros, or
|
|
|
// country code has been specified.
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331 6005",
|
|
|
"+64 03 331 6005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+800 1234 5678",
|
|
|
"+80012345678"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 03 331-6005",
|
|
|
"+64 03331 6005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+643 331-6005",
|
|
|
"+64033316005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+643 331-6005",
|
|
|
"+6433316005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
|
|
|
"+6433316005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings(
|
|
|
"+64 3 331-6005", "tel:+64-3-331-6005;isub=123"));
|
|
|
// Test alpha numbers.
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+1800 siX-Flags",
|
|
|
"+1 800 7493 5247"));
|
|
|
// Test numbers with extensions.
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 extn 1234",
|
|
|
"+6433316005#1234"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 extn 1234",
|
|
|
"+6433316005;1234"));
|
|
|
// Test proto buffers.
|
|
|
PhoneNumber nz_number;
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(33316005ULL);
|
|
|
nz_number.set_extension("3456");
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithOneString(nz_number,
|
|
|
"+643 331 6005 ext 3456"));
|
|
|
nz_number.clear_extension();
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithOneString(nz_number,
|
|
|
"+643 331 6005"));
|
|
|
// Check empty extensions are ignored.
|
|
|
nz_number.set_extension("");
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatchWithOneString(nz_number,
|
|
|
"+643 331 6005"));
|
|
|
// Check variant with two proto buffers.
|
|
|
PhoneNumber nz_number_2;
|
|
|
nz_number_2.set_country_code(64);
|
|
|
nz_number_2.set_national_number(33316005ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatch(nz_number, nz_number_2));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNumberMatchShortMatchIfDiffNumLeadingZeros) {
|
|
|
PhoneNumber nz_number_one;
|
|
|
nz_number_one.set_country_code(64);
|
|
|
nz_number_one.set_national_number(33316005ULL);
|
|
|
nz_number_one.set_italian_leading_zero(true);
|
|
|
|
|
|
PhoneNumber nz_number_two;
|
|
|
nz_number_two.set_country_code(64);
|
|
|
nz_number_two.set_national_number(33316005ULL);
|
|
|
nz_number_two.set_italian_leading_zero(true);
|
|
|
nz_number_two.set_number_of_leading_zeros(2);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
|
|
|
|
|
|
nz_number_one.set_italian_leading_zero(false);
|
|
|
nz_number_one.set_number_of_leading_zeros(1);
|
|
|
nz_number_two.set_italian_leading_zero(true);
|
|
|
nz_number_two.set_number_of_leading_zeros(1);
|
|
|
// Since one doesn't have the "italian_leading_zero" set to true, we ignore
|
|
|
// the number of leading zeros present (1 is in any case the default value).
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNumberMatchAcceptsProtoDefaultsAsMatch) {
|
|
|
PhoneNumber nz_number_one;
|
|
|
nz_number_one.set_country_code(64);
|
|
|
nz_number_one.set_national_number(33316005ULL);
|
|
|
nz_number_one.set_italian_leading_zero(true);
|
|
|
|
|
|
PhoneNumber nz_number_two;
|
|
|
nz_number_two.set_country_code(64);
|
|
|
nz_number_two.set_national_number(33316005ULL);
|
|
|
nz_number_two.set_italian_leading_zero(true);
|
|
|
// The default for number_of_leading_zeros is 1, so it shouldn't normally be
|
|
|
// set, however if it is it should be considered equivalent.
|
|
|
nz_number_two.set_number_of_leading_zeros(1);
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest,
|
|
|
IsNumberMatchMatchesDiffLeadingZerosIfItalianLeadingZeroFalse) {
|
|
|
PhoneNumber nz_number_one;
|
|
|
nz_number_one.set_country_code(64);
|
|
|
nz_number_one.set_national_number(33316005ULL);
|
|
|
|
|
|
PhoneNumber nz_number_two;
|
|
|
nz_number_two.set_country_code(64);
|
|
|
nz_number_two.set_national_number(33316005ULL);
|
|
|
// The default for number_of_leading_zeros is 1, so it shouldn't normally be
|
|
|
// set, however if it is it should be considered equivalent.
|
|
|
nz_number_two.set_number_of_leading_zeros(1);
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
|
|
|
// Even if it is set to ten, it is still equivalent because in both cases
|
|
|
// italian_leading_zero is not true.
|
|
|
nz_number_two.set_number_of_leading_zeros(10);
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatch(nz_number_one, nz_number_two));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNumberMatchIgnoresSomeFields) {
|
|
|
// Check raw_input, country_code_source and preferred_domestic_carrier_code
|
|
|
// are ignored.
|
|
|
PhoneNumber br_number_1;
|
|
|
PhoneNumber br_number_2;
|
|
|
br_number_1.set_country_code(55);
|
|
|
br_number_1.set_national_number(3121286979ULL);
|
|
|
br_number_1.set_country_code_source(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN);
|
|
|
br_number_1.set_preferred_domestic_carrier_code("12");
|
|
|
br_number_1.set_raw_input("012 3121286979");
|
|
|
br_number_2.set_country_code(55);
|
|
|
br_number_2.set_national_number(3121286979ULL);
|
|
|
br_number_2.set_country_code_source(PhoneNumber::FROM_DEFAULT_COUNTRY);
|
|
|
br_number_2.set_preferred_domestic_carrier_code("14");
|
|
|
br_number_2.set_raw_input("143121286979");
|
|
|
EXPECT_EQ(PhoneNumberUtil::EXACT_MATCH,
|
|
|
phone_util_.IsNumberMatch(br_number_1, br_number_2));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNumberMatchNonMatches) {
|
|
|
// NSN matches.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("03 331 6005",
|
|
|
"03 331 6006"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+800 1234 5678",
|
|
|
"+1 800 1234 5678"));
|
|
|
// Different country code, partial number match.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
|
|
|
"+16433316005"));
|
|
|
// Different country code, same number.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
|
|
|
"+6133316005"));
|
|
|
// Extension different, all else the same.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 extn 1234",
|
|
|
"+0116433316005#1235"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings(
|
|
|
"+64 3 331-6005 extn 1234", "tel:+64-3-331-6005;ext=1235"));
|
|
|
// NSN matches, but extension is different - not the same number.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005 ext.1235",
|
|
|
"3 331 6005#1234"));
|
|
|
// Invalid numbers that can't be parsed.
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("4", "3 331 6043"));
|
|
|
// Invalid numbers that can't be parsed.
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+43", "+64 3 331 6005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+43", "64 3 331 6005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_NUMBER,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("Dog", "64 3 331 6005"));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNumberMatchNsnMatches) {
|
|
|
// NSN matches.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
|
|
|
"03 331 6005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings(
|
|
|
"+64 3 331-6005",
|
|
|
"tel:03-331-6005;isub=1234;phone-context=abc.nz"));
|
|
|
|
|
|
PhoneNumber nz_number;
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(33316005ULL);
|
|
|
nz_number.set_extension("");
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithOneString(nz_number, "03 331 6005"));
|
|
|
// Here the second number possibly starts with the country code for New
|
|
|
// Zealand, although we are unsure.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithOneString(nz_number,
|
|
|
"(64-3) 331 6005"));
|
|
|
|
|
|
// Here, the 1 might be a national prefix, if we compare it to the US number,
|
|
|
// so the resultant match is an NSN match.
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
us_number.set_national_number(2345678901ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithOneString(us_number,
|
|
|
"1-234-567-8901"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithOneString(us_number, "2345678901"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+1 234-567 8901",
|
|
|
"1 234 567 8901"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("1 234-567 8901",
|
|
|
"1 234 567 8901"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("1 234-567 8901",
|
|
|
"+1 234 567 8901"));
|
|
|
// For this case, the match will be a short NSN match, because we cannot
|
|
|
// assume that the 1 might be a national prefix, so don't remove it when
|
|
|
// parsing.
|
|
|
PhoneNumber random_number;
|
|
|
random_number.set_country_code(41);
|
|
|
random_number.set_national_number(2345678901ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithOneString(random_number,
|
|
|
"1-234-567-8901"));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsNumberMatchShortNsnMatches) {
|
|
|
// Short NSN matches with the country not specified for either one or both
|
|
|
// numbers.
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
|
|
|
"331 6005"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings(
|
|
|
"+64 3 331-6005", "tel:331-6005;phone-context=abc.nz"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings(
|
|
|
"+64 3 331-6005",
|
|
|
"tel:331-6005;isub=1234;phone-context=abc.nz"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings(
|
|
|
"+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.
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("3 331-6005",
|
|
|
"03 331 6005"));
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("3 331-6005",
|
|
|
"331 6005"));
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings(
|
|
|
"3 331-6005", "tel:331-6005;phone-context=abc.nz"));
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("3 331-6005",
|
|
|
"+64 331 6005"));
|
|
|
|
|
|
// Short NSN match with the country specified.
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("03 331-6005",
|
|
|
"331 6005"));
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("1 234 345 6789",
|
|
|
"345 6789"));
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+1 (234) 345 6789",
|
|
|
"345 6789"));
|
|
|
|
|
|
// NSN matches, country code omitted for one number, extension missing for
|
|
|
// one.
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatchWithTwoStrings("+64 3 331-6005",
|
|
|
"3 331 6005#1234"));
|
|
|
|
|
|
// One has Italian leading zero, one does not.
|
|
|
PhoneNumber it_number_1, it_number_2;
|
|
|
it_number_1.set_country_code(39);
|
|
|
it_number_1.set_national_number(1234ULL);
|
|
|
it_number_1.set_italian_leading_zero(true);
|
|
|
it_number_2.set_country_code(39);
|
|
|
it_number_2.set_national_number(1234ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatch(it_number_1, it_number_2));
|
|
|
|
|
|
// One has an extension, the other has an extension of "".
|
|
|
it_number_1.set_extension("1234");
|
|
|
it_number_1.clear_italian_leading_zero();
|
|
|
it_number_2.set_extension("");
|
|
|
EXPECT_EQ(PhoneNumberUtil::SHORT_NSN_MATCH,
|
|
|
phone_util_.IsNumberMatch(it_number_1, it_number_2));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
|
|
|
PhoneNumber nz_number;
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(33316005ULL);
|
|
|
PhoneNumber test_number;
|
|
|
// National prefix attached.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("033316005", RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
// National prefix missing.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("33316005", RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
// National prefix attached and some formatting present.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03-331 6005", RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03 331 6005", RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
// Test parsing RFC3966 format with a phone context.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:03-331-6005;phone-context=+64",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:331-6005;phone-context=+64-3",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:331-6005;phone-context=+64-3",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("My number is tel:03-331-6005;phone-context=+64",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
// Test parsing RFC3966 format with optional user-defined parameters. The
|
|
|
// parameters will appear after the context if present.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:03-331-6005;phone-context=+64;a=%A1",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
// Test parsing RFC3966 with an ISDN subaddress.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:03-331-6005;isub=12345;phone-context=+64",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:+64-3-331-6005;isub=12345",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03-331-6005;phone-context=+64",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
// Testing international prefixes.
|
|
|
// Should strip country code.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0064 3 331 6005",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
// Try again, but this time we have an international number with Region Code
|
|
|
// US. It should recognise the country code and parse accordingly.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("01164 3 331 6005",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+64 3 331 6005",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
// We should ignore the leading plus here, since it is not followed by a valid
|
|
|
// country code but instead is followed by the IDD for the US.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+01164 3 331 6005",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+0064 3 331 6005",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+ 00 64 3 331 6005",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
|
|
|
PhoneNumber us_local_number;
|
|
|
us_local_number.set_country_code(1);
|
|
|
us_local_number.set_national_number(2530000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:253-0000;phone-context=www.google.com",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(us_local_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse(
|
|
|
"tel:253-0000;isub=12345;phone-context=www.google.com",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(us_local_number, test_number);
|
|
|
// 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.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:2530000;isub=12345;phone-context=1-650",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(us_local_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:2530000;isub=12345;phone-context=1234.com",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(us_local_number, test_number);
|
|
|
|
|
|
// Test for http://b/issue?id=2247493
|
|
|
nz_number.Clear();
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(64123456ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+64(0)64123456",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
|
|
|
// Check that using a "/" is fine in a phone number.
|
|
|
PhoneNumber de_number;
|
|
|
de_number.set_country_code(49);
|
|
|
de_number.set_national_number(12345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("123/45678", RegionCode::DE(), &test_number));
|
|
|
EXPECT_EQ(de_number, test_number);
|
|
|
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
// Check it doesn't use the '1' as a country code when parsing if the phone
|
|
|
// number was already possible.
|
|
|
us_number.set_national_number(1234567890ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("123-456-7890", RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
|
|
|
// Test star numbers. Although this is not strictly valid, we would like to
|
|
|
// make sure we can parse the output we produce when formatting the number.
|
|
|
PhoneNumber star_number;
|
|
|
star_number.set_country_code(81);
|
|
|
star_number.set_national_number(2345ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+81 *2345", RegionCode::JP(), &test_number));
|
|
|
EXPECT_EQ(star_number, test_number);
|
|
|
|
|
|
PhoneNumber short_number;
|
|
|
short_number.set_country_code(64);
|
|
|
short_number.set_national_number(12ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("12", RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(short_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseNumberWithAlphaCharacters) {
|
|
|
// Test case with alpha characters.
|
|
|
PhoneNumber test_number;
|
|
|
PhoneNumber tollfree_number;
|
|
|
tollfree_number.set_country_code(64);
|
|
|
tollfree_number.set_national_number(800332005ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0800 DDA 005", RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(tollfree_number, test_number);
|
|
|
|
|
|
PhoneNumber premium_number;
|
|
|
premium_number.set_country_code(64);
|
|
|
premium_number.set_national_number(9003326005ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0900 DDA 6005", RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(premium_number, test_number);
|
|
|
|
|
|
// Not enough alpha characters for them to be considered intentional, so they
|
|
|
// are stripped.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0900 332 6005a",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(premium_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0900 332 600a5",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(premium_number, test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0900 332 600A5",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(premium_number, test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0900 a332 600A5",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(premium_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseWithInternationalPrefixes) {
|
|
|
PhoneNumber us_number;
|
|
|
us_number.set_country_code(1);
|
|
|
us_number.set_national_number(6503336000ULL);
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+1 (650) 333-6000",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+1-650-333-6000",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
|
|
|
// Calling the US number from Singapore by using different service providers
|
|
|
// 1st test: calling using SingTel IDD service (IDD is 001)
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0011-650-333-6000",
|
|
|
RegionCode::SG(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
// 2nd test: calling using StarHub IDD service (IDD is 008)
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0081-650-333-6000",
|
|
|
RegionCode::SG(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
// 3rd test: calling using SingTel V019 service (IDD is 019)
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0191-650-333-6000",
|
|
|
RegionCode::SG(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
// Calling the US number from Poland
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0~01-650-333-6000",
|
|
|
RegionCode::PL(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
|
|
|
// Using "++" at the start.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("++1 (650) 333-6000",
|
|
|
RegionCode::PL(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
// Using a full-width plus sign.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("\xEF\xBC\x8B" "1 (650) 333-6000",
|
|
|
/* "+1 (650) 333-6000" */
|
|
|
RegionCode::SG(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
// Using a soft hyphen U+00AD.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("1 (650) 333" "\xC2\xAD" "-6000",
|
|
|
/* "1 (650) 333-6000" */
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
// The whole number, including punctuation, is here represented in full-width
|
|
|
// form.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("\xEF\xBC\x8B\xEF\xBC\x91\xE3\x80\x80\xEF\xBC\x88"
|
|
|
"\xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90\xEF\xBC\x89"
|
|
|
"\xE3\x80\x80\xEF\xBC\x93\xEF\xBC\x93\xEF\xBC\x93"
|
|
|
"\xEF\xBC\x8D\xEF\xBC\x96\xEF\xBC\x90\xEF\xBC\x90"
|
|
|
"\xEF\xBC\x90",
|
|
|
/* "+1 (650) 333-6000" */
|
|
|
RegionCode::SG(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
|
|
|
// Using the U+30FC dash.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("\xEF\xBC\x8B\xEF\xBC\x91\xE3\x80\x80\xEF\xBC\x88"
|
|
|
"\xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90\xEF\xBC\x89"
|
|
|
"\xE3\x80\x80\xEF\xBC\x93\xEF\xBC\x93\xEF\xBC\x93"
|
|
|
"\xE3\x83\xBC\xEF\xBC\x96\xEF\xBC\x90\xEF\xBC\x90"
|
|
|
"\xEF\xBC\x90",
|
|
|
/* "+1 (650) 333ー6000" */
|
|
|
RegionCode::SG(), &test_number));
|
|
|
EXPECT_EQ(us_number, test_number);
|
|
|
|
|
|
PhoneNumber toll_free_number;
|
|
|
toll_free_number.set_country_code(800);
|
|
|
toll_free_number.set_national_number(12345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("011 800 1234 5678",
|
|
|
RegionCode::US(), &test_number));
|
|
|
EXPECT_EQ(toll_free_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseWithLeadingZero) {
|
|
|
PhoneNumber it_number;
|
|
|
it_number.set_country_code(39);
|
|
|
it_number.set_national_number(236618300ULL);
|
|
|
it_number.set_italian_leading_zero(true);
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+39 02-36618 300",
|
|
|
RegionCode::NZ(), &test_number));
|
|
|
EXPECT_EQ(it_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("02-36618 300", RegionCode::IT(), &test_number));
|
|
|
EXPECT_EQ(it_number, test_number);
|
|
|
|
|
|
it_number.Clear();
|
|
|
it_number.set_country_code(39);
|
|
|
it_number.set_national_number(312345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("312 345 678", RegionCode::IT(), &test_number));
|
|
|
EXPECT_EQ(it_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseNationalNumberArgentina) {
|
|
|
// Test parsing mobile numbers of Argentina.
|
|
|
PhoneNumber ar_number;
|
|
|
ar_number.set_country_code(54);
|
|
|
ar_number.set_national_number(93435551212ULL);
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+54 9 343 555 1212", RegionCode::AR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0343 15 555 1212", RegionCode::AR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
|
|
|
ar_number.set_national_number(93715654320ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+54 9 3715 65 4320", RegionCode::AR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03715 15 65 4320", RegionCode::AR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
|
|
|
// Test parsing fixed-line numbers of Argentina.
|
|
|
ar_number.set_national_number(1137970000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+54 11 3797 0000", RegionCode::AR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("011 3797 0000", RegionCode::AR(), &test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
|
|
|
ar_number.set_national_number(3715654321ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+54 3715 65 4321", RegionCode::AR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03715 65 4321", RegionCode::AR(), &test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
|
|
|
ar_number.set_national_number(2312340000ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+54 23 1234 0000", RegionCode::AR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("023 1234 0000", RegionCode::AR(), &test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseWithXInNumber) {
|
|
|
// Test that having an 'x' in the phone number at the start is ok and that it
|
|
|
// just gets removed.
|
|
|
PhoneNumber ar_number;
|
|
|
ar_number.set_country_code(54);
|
|
|
ar_number.set_national_number(123456789ULL);
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0123456789", RegionCode::AR(), &test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(0) 123456789", RegionCode::AR(), &test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0 123456789", RegionCode::AR(), &test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(0xx) 123456789", RegionCode::AR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_number, test_number);
|
|
|
|
|
|
PhoneNumber ar_from_us;
|
|
|
ar_from_us.set_country_code(54);
|
|
|
ar_from_us.set_national_number(81429712ULL);
|
|
|
// This test is intentionally constructed such that the number of digit after
|
|
|
// xx is larger than 7, so that the number won't be mistakenly treated as an
|
|
|
// extension, as we allow extensions up to 7 digits. This assumption is okay
|
|
|
// for now as all the countries where a carrier selection code is written in
|
|
|
// the form of xx have a national significant number of length larger than 7.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("011xx5481429712", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(ar_from_us, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseNumbersMexico) {
|
|
|
// Test parsing fixed-line numbers of Mexico.
|
|
|
PhoneNumber mx_number;
|
|
|
|
|
|
mx_number.set_country_code(52);
|
|
|
mx_number.set_national_number(4499780001ULL);
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+52 (449)978-0001", RegionCode::MX(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(mx_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("01 (449)978-0001", RegionCode::MX(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(mx_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(449)978-0001", RegionCode::MX(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(mx_number, test_number);
|
|
|
|
|
|
// Test parsing mobile numbers of Mexico.
|
|
|
mx_number.Clear();
|
|
|
mx_number.set_country_code(52);
|
|
|
mx_number.set_national_number(13312345678ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+52 1 33 1234-5678", RegionCode::MX(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(mx_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("044 (33) 1234-5678", RegionCode::MX(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(mx_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("045 33 1234-5678", RegionCode::MX(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(mx_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, FailedParseOnInvalidNumbers) {
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
|
|
|
phone_util_.Parse("This is not a phone number", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
|
|
|
phone_util_.Parse("1 Still not a number", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
|
|
|
phone_util_.Parse("1 MICROSOFT", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
|
|
|
phone_util_.Parse("12 MICROSOFT", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_LONG_NSN,
|
|
|
phone_util_.Parse("01495 72553301873 810104", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
|
|
|
phone_util_.Parse("+---", RegionCode::DE(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
|
|
|
phone_util_.Parse("+***", RegionCode::DE(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
|
|
|
phone_util_.Parse("+*******91", RegionCode::DE(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_NSN,
|
|
|
phone_util_.Parse("+49 0", RegionCode::DE(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
|
|
|
phone_util_.Parse("+210 3456 56789", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
// 00 is a correct IDD, but 210 is not a valid country code.
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
|
|
|
phone_util_.Parse("+ 00 210 3 331 6005", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
|
|
|
phone_util_.Parse("123 456 7890", RegionCode::GetUnknown(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
|
|
|
phone_util_.Parse("123 456 7890", RegionCode::CS(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD,
|
|
|
phone_util_.Parse("0044-----", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD,
|
|
|
phone_util_.Parse("0044", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD,
|
|
|
phone_util_.Parse("011", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::TOO_SHORT_AFTER_IDD,
|
|
|
phone_util_.Parse("0119", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
// RFC3966 phone-context is a website.
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
|
|
|
phone_util_.Parse("tel:555-1234;phone-context=www.google.com",
|
|
|
RegionCode::ZZ(), &test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
// This is invalid because no "+" sign is present as part of phone-context.
|
|
|
// This should not succeed in being parsed.
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
|
|
|
phone_util_.Parse("tel:555-1234;phone-context=1-331",
|
|
|
RegionCode::ZZ(), &test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
// Only the phone-context symbol is present, but no data.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NOT_A_NUMBER,
|
|
|
phone_util_.Parse(";phone-context=",
|
|
|
RegionCode::ZZ(), &test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseNumbersWithPlusWithNoRegion) {
|
|
|
PhoneNumber nz_number;
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(33316005ULL);
|
|
|
// RegionCode::GetUnknown() is allowed only if the number starts with a '+' -
|
|
|
// then the country code can be calculated.
|
|
|
PhoneNumber result_proto;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+64 3 331 6005", RegionCode::GetUnknown(),
|
|
|
&result_proto));
|
|
|
EXPECT_EQ(nz_number, result_proto);
|
|
|
|
|
|
// Test with full-width plus.
|
|
|
result_proto.Clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("\xEF\xBC\x8B" "64 3 331 6005",
|
|
|
/* "+64 3 331 6005" */
|
|
|
RegionCode::GetUnknown(), &result_proto));
|
|
|
EXPECT_EQ(nz_number, result_proto);
|
|
|
// Test with normal plus but leading characters that need to be stripped.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse(" +64 3 331 6005", RegionCode::GetUnknown(),
|
|
|
&result_proto));
|
|
|
EXPECT_EQ(nz_number, result_proto);
|
|
|
|
|
|
PhoneNumber toll_free_number;
|
|
|
toll_free_number.set_country_code(800);
|
|
|
toll_free_number.set_national_number(12345678ULL);
|
|
|
result_proto.Clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+800 1234 5678",
|
|
|
RegionCode::GetUnknown(), &result_proto));
|
|
|
EXPECT_EQ(toll_free_number, result_proto);
|
|
|
|
|
|
PhoneNumber universal_premium_rate;
|
|
|
universal_premium_rate.set_country_code(979);
|
|
|
universal_premium_rate.set_national_number(123456789ULL);
|
|
|
result_proto.Clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+979 123 456 789",
|
|
|
RegionCode::GetUnknown(), &result_proto));
|
|
|
EXPECT_EQ(universal_premium_rate, result_proto);
|
|
|
|
|
|
result_proto.Clear();
|
|
|
// Test parsing RFC3966 format with a phone context.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:03-331-6005;phone-context=+64",
|
|
|
RegionCode::GetUnknown(), &result_proto));
|
|
|
EXPECT_EQ(nz_number, result_proto);
|
|
|
result_proto.Clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse(" tel:03-331-6005;phone-context=+64",
|
|
|
RegionCode::GetUnknown(), &result_proto));
|
|
|
EXPECT_EQ(nz_number, result_proto);
|
|
|
result_proto.Clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:03-331-6005;isub=12345;phone-context=+64",
|
|
|
RegionCode::GetUnknown(), &result_proto));
|
|
|
EXPECT_EQ(nz_number, result_proto);
|
|
|
|
|
|
nz_number.set_raw_input("+64 3 331 6005");
|
|
|
nz_number.set_country_code_source(PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN);
|
|
|
result_proto.Clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("+64 3 331 6005",
|
|
|
RegionCode::GetUnknown(),
|
|
|
&result_proto));
|
|
|
EXPECT_EQ(nz_number, result_proto);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseNumberTooShortIfNationalPrefixStripped) {
|
|
|
PhoneNumber test_number;
|
|
|
|
|
|
// Test that a number whose first digits happen to coincide with the national
|
|
|
// prefix does not get them stripped if doing so would result in a number too
|
|
|
// short to be a possible (regular length) phone number for that region.
|
|
|
PhoneNumber by_number;
|
|
|
by_number.set_country_code(375);
|
|
|
by_number.set_national_number(8123L);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("8123", RegionCode::BY(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(by_number, test_number);
|
|
|
by_number.set_national_number(81234L);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("81234", RegionCode::BY(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(by_number, test_number);
|
|
|
|
|
|
// The prefix doesn't get stripped, since the input is a viable 6-digit
|
|
|
// number, whereas the result of stripping is only 5 digits.
|
|
|
by_number.set_national_number(812345L);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("812345", RegionCode::BY(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(by_number, test_number);
|
|
|
|
|
|
// The prefix gets stripped, since only 6-digit numbers are possible.
|
|
|
by_number.set_national_number(123456L);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("8123456", RegionCode::BY(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(by_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseExtensions) {
|
|
|
PhoneNumber nz_number;
|
|
|
nz_number.set_country_code(64);
|
|
|
nz_number.set_national_number(33316005ULL);
|
|
|
nz_number.set_extension("3456");
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03 331 6005 ext 3456", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03 331 6005x3456", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03-331 6005 int.3456", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("03 331 6005 #3456", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(nz_number, test_number);
|
|
|
|
|
|
// Test the following do not extract extensions:
|
|
|
PhoneNumber non_extn_number;
|
|
|
non_extn_number.set_country_code(1);
|
|
|
non_extn_number.set_national_number(80074935247ULL);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("1800 six-flags", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(non_extn_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("1800 SIX-FLAGS", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(non_extn_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0~0 1800 7493 5247", RegionCode::PL(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(non_extn_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(1800) 7493.5247", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(non_extn_number, test_number);
|
|
|
|
|
|
// Check that the last instance of an extension token is matched.
|
|
|
PhoneNumber extn_number;
|
|
|
extn_number.set_country_code(1);
|
|
|
extn_number.set_national_number(80074935247ULL);
|
|
|
extn_number.set_extension("1234");
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0~0 1800 7493 5247 ~1234", RegionCode::PL(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(extn_number, test_number);
|
|
|
|
|
|
// Verifying bug-fix where the last digit of a number was previously omitted
|
|
|
// if it was a 0 when extracting the extension. Also verifying a few different
|
|
|
// cases of extensions.
|
|
|
PhoneNumber uk_number;
|
|
|
uk_number.set_country_code(44);
|
|
|
uk_number.set_national_number(2034567890ULL);
|
|
|
uk_number.set_extension("456");
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44 2034567890x456", RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44 2034567890x456", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44 2034567890 x456", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44 2034567890 X456", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44 2034567890 x 456 ", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44-2034567890;ext=456", RegionCode::GB(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("tel:2034567890;ext=456;phone-context=+44",
|
|
|
RegionCode::ZZ(), &test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
|
|
|
// Full-width extension, "extn" only.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse(
|
|
|
"+442034567890\xEF\xBD\x85\xEF\xBD\x98\xEF\xBD\x94\xEF\xBD\x8E"
|
|
|
"456", RegionCode::GB(), &test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
// "xtn" only.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse(
|
|
|
"+44-2034567890\xEF\xBD\x98\xEF\xBD\x94\xEF\xBD\x8E""456",
|
|
|
RegionCode::GB(), &test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
// "xt" only.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+44-2034567890\xEF\xBD\x98\xEF\xBD\x94""456",
|
|
|
RegionCode::GB(), &test_number));
|
|
|
EXPECT_EQ(uk_number, test_number);
|
|
|
|
|
|
PhoneNumber us_with_extension;
|
|
|
us_with_extension.set_country_code(1);
|
|
|
us_with_extension.set_national_number(8009013355ULL);
|
|
|
us_with_extension.set_extension("7246433");
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355 x 7246433", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355 , ext 7246433", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355 ; 7246433", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
// To test an extension character without surrounding spaces.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355;7246433", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355 ,extension 7246433",
|
|
|
RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355 ,extensi\xC3\xB3n 7246433",
|
|
|
/* "(800) 901-3355 ,extensión 7246433" */
|
|
|
RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
// Repeat with the small letter o with acute accent created by combining
|
|
|
// characters.
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355 ,extensio\xCC\x81n 7246433",
|
|
|
/* "(800) 901-3355 ,extensión 7246433" */
|
|
|
RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355 , 7246433", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(800) 901-3355 ext: 7246433", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
|
|
|
// Test that if a number has two extensions specified, we ignore the second.
|
|
|
PhoneNumber us_with_two_extensions_number;
|
|
|
us_with_two_extensions_number.set_country_code(1);
|
|
|
us_with_two_extensions_number.set_national_number(2121231234ULL);
|
|
|
us_with_two_extensions_number.set_extension("508");
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(212)123-1234 x508/x1234", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_two_extensions_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(212)123-1234 x508/ x1234", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_two_extensions_number, test_number);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("(212)123-1234 x508\\x1234", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_two_extensions_number, test_number);
|
|
|
|
|
|
// Test parsing numbers in the form (645) 123-1234-910# works, where the last
|
|
|
// 3 digits before the # are an extension.
|
|
|
us_with_extension.Clear();
|
|
|
us_with_extension.set_country_code(1);
|
|
|
us_with_extension.set_national_number(6451231234ULL);
|
|
|
us_with_extension.set_extension("910");
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("+1 (645) 123 1234-910#", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(us_with_extension, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseAndKeepRaw) {
|
|
|
PhoneNumber alpha_numeric_number;
|
|
|
alpha_numeric_number.set_country_code(1);
|
|
|
alpha_numeric_number.set_national_number(80074935247ULL);
|
|
|
alpha_numeric_number.set_raw_input("800 six-flags");
|
|
|
alpha_numeric_number.set_country_code_source(
|
|
|
PhoneNumber::FROM_DEFAULT_COUNTRY);
|
|
|
|
|
|
PhoneNumber test_number;
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("800 six-flags", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(alpha_numeric_number, test_number);
|
|
|
|
|
|
alpha_numeric_number.set_national_number(8007493524ULL);
|
|
|
alpha_numeric_number.set_raw_input("1800 six-flag");
|
|
|
alpha_numeric_number.set_country_code_source(
|
|
|
PhoneNumber::FROM_NUMBER_WITHOUT_PLUS_SIGN);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("1800 six-flag", RegionCode::US(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(alpha_numeric_number, test_number);
|
|
|
|
|
|
alpha_numeric_number.set_raw_input("+1800 six-flag");
|
|
|
alpha_numeric_number.set_country_code_source(
|
|
|
PhoneNumber::FROM_NUMBER_WITH_PLUS_SIGN);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("+1800 six-flag", RegionCode::CN(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(alpha_numeric_number, test_number);
|
|
|
|
|
|
alpha_numeric_number.set_raw_input("001800 six-flag");
|
|
|
alpha_numeric_number.set_country_code_source(
|
|
|
PhoneNumber::FROM_NUMBER_WITH_IDD);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("001800 six-flag",
|
|
|
RegionCode::NZ(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(alpha_numeric_number, test_number);
|
|
|
|
|
|
// Try with invalid region - expect failure. We clear the test number first
|
|
|
// because if parsing isn't successful, the number parsed in won't be changed.
|
|
|
test_number.Clear();
|
|
|
EXPECT_EQ(PhoneNumberUtil::INVALID_COUNTRY_CODE_ERROR,
|
|
|
phone_util_.Parse("123 456 7890", RegionCode::CS(), &test_number));
|
|
|
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
|
|
|
|
|
|
PhoneNumber korean_number;
|
|
|
korean_number.set_country_code(82);
|
|
|
korean_number.set_national_number(22123456);
|
|
|
korean_number.set_raw_input("08122123456");
|
|
|
korean_number.set_country_code_source(PhoneNumber::FROM_DEFAULT_COUNTRY);
|
|
|
korean_number.set_preferred_domestic_carrier_code("81");
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.ParseAndKeepRawInput("08122123456",
|
|
|
RegionCode::KR(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(korean_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, ParseItalianLeadingZeros) {
|
|
|
PhoneNumber zeros_number;
|
|
|
zeros_number.set_country_code(61);
|
|
|
PhoneNumber test_number;
|
|
|
|
|
|
// Test the number "011".
|
|
|
zeros_number.set_national_number(11L);
|
|
|
zeros_number.set_italian_leading_zero(true);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("011", RegionCode::AU(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(zeros_number, test_number);
|
|
|
|
|
|
// Test the number "001".
|
|
|
zeros_number.set_national_number(1L);
|
|
|
zeros_number.set_italian_leading_zero(true);
|
|
|
zeros_number.set_number_of_leading_zeros(2);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("001", RegionCode::AU(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(zeros_number, test_number);
|
|
|
|
|
|
// Test the number "000". This number has 2 leading zeros.
|
|
|
zeros_number.set_national_number(0L);
|
|
|
zeros_number.set_italian_leading_zero(true);
|
|
|
zeros_number.set_number_of_leading_zeros(2);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("000", RegionCode::AU(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(zeros_number, test_number);
|
|
|
|
|
|
// Test the number "0000". This number has 3 leading zeros.
|
|
|
zeros_number.set_national_number(0L);
|
|
|
zeros_number.set_italian_leading_zero(true);
|
|
|
zeros_number.set_number_of_leading_zeros(3);
|
|
|
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
|
|
|
phone_util_.Parse("0000", RegionCode::AU(),
|
|
|
&test_number));
|
|
|
EXPECT_EQ(zeros_number, test_number);
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, CanBeInternationallyDialled) {
|
|
|
PhoneNumber test_number;
|
|
|
test_number.set_country_code(1);
|
|
|
|
|
|
// We have no-international-dialling rules for the US in our test metadata
|
|
|
// that say that toll-free numbers cannot be dialled internationally.
|
|
|
test_number.set_national_number(8002530000ULL);
|
|
|
EXPECT_FALSE(phone_util_.CanBeInternationallyDialled(test_number));
|
|
|
|
|
|
// Normal US numbers can be internationally dialled.
|
|
|
test_number.set_national_number(6502530000ULL);
|
|
|
EXPECT_TRUE(phone_util_.CanBeInternationallyDialled(test_number));
|
|
|
|
|
|
// Invalid number.
|
|
|
test_number.set_national_number(2530000ULL);
|
|
|
EXPECT_TRUE(phone_util_.CanBeInternationallyDialled(test_number));
|
|
|
|
|
|
// We have no data for NZ - should return true.
|
|
|
test_number.set_country_code(64);
|
|
|
test_number.set_national_number(33316005ULL);
|
|
|
EXPECT_TRUE(phone_util_.CanBeInternationallyDialled(test_number));
|
|
|
|
|
|
test_number.set_country_code(800);
|
|
|
test_number.set_national_number(12345678ULL);
|
|
|
EXPECT_TRUE(phone_util_.CanBeInternationallyDialled(test_number));
|
|
|
}
|
|
|
|
|
|
TEST_F(PhoneNumberUtilTest, IsAlphaNumber) {
|
|
|
EXPECT_TRUE(phone_util_.IsAlphaNumber("1800 six-flags"));
|
|
|
EXPECT_TRUE(phone_util_.IsAlphaNumber("1800 six-flags ext. 1234"));
|
|
|
EXPECT_TRUE(phone_util_.IsAlphaNumber("+800 six-flags"));
|
|
|
EXPECT_TRUE(phone_util_.IsAlphaNumber("180 six-flags"));
|
|
|
EXPECT_FALSE(phone_util_.IsAlphaNumber("1800 123-1234"));
|
|
|
EXPECT_FALSE(phone_util_.IsAlphaNumber("1 six-flags"));
|
|
|
EXPECT_FALSE(phone_util_.IsAlphaNumber("18 six-flags"));
|
|
|
EXPECT_FALSE(phone_util_.IsAlphaNumber("1800 123-1234 extension: 1234"));
|
|
|
EXPECT_FALSE(phone_util_.IsAlphaNumber("+800 1234-1234"));
|
|
|
}
|
|
|
|
|
|
} // namespace phonenumbers
|
|
|
} // namespace i18n
|