#include <gtest/gtest.h>
+#include "phonenumbers/default_logger.h"
#include "phonenumbers/phonemetadata.pb.h"
#include "phonenumbers/phonenumber.h"
#include "phonenumbers/phonenumber.pb.h"
namespace i18n {
namespace phonenumbers {
-using std::endl;
using std::find;
-using std::make_pair;
using std::ostream;
using google::protobuf::RepeatedPtrField;
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.
phone_util_.Normalize(number);
}
+ void NormalizeDiallableCharsOnly(string* number) const {
+ phone_util_.NormalizeDiallableCharsOnly(number);
+ }
+
bool IsNumberGeographical(const PhoneNumber& phone_number) const {
return phone_util_.IsNumberGeographical(phone_number);
}
}
const PhoneNumberUtil& phone_util_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(PhoneNumberUtilTest);
};
TEST_F(PhoneNumberUtilTest, ContainsOnlyValidDigits) {
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, GetRegionCodesForCountryCallingCode) {
list<string> regions;
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);
- test_number.Clear();
+
success = phone_util_.GetExampleNumberForType(RegionCode::DE(),
PhoneNumberUtil::MOBILE,
&test_number);
// Here we test that an example number was not returned, and that the number
// passed in was not modified.
+ test_number.Clear();
EXPECT_FALSE(success);
EXPECT_EQ(PhoneNumber::default_instance(), test_number);
+
// For the US, the example number is placed under general description, and
// hence should be used for both fixed line and mobile, so neither of these
// should return null.
- test_number.Clear();
success = phone_util_.GetExampleNumberForType(RegionCode::US(),
PhoneNumberUtil::FIXED_LINE,
&test_number);
// number passed in was modified.
EXPECT_TRUE(success);
EXPECT_NE(PhoneNumber::default_instance(), test_number);
- test_number.Clear();
success = phone_util_.GetExampleNumberForType(RegionCode::US(),
PhoneNumberUtil::MOBILE,
&test_number);
EXPECT_TRUE(success);
EXPECT_NE(PhoneNumber::default_instance(), test_number);
- test_number.Clear();
// 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);
- test_number.Clear();
// 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));
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(301234567L);
+ 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(6502530000LL);
+ 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) {
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(4, phone_util_.GetLengthOfNationalDestinationCode(number));
}
+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.
number.set_national_number(123456789ULL);
EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
phone_util_.IsPossibleNumberWithReason(number));
-
- // Try with number that we don't have metadata for.
- PhoneNumber ad_number;
- ad_number.set_country_code(376);
- ad_number.set_national_number(12345ULL);
- EXPECT_EQ(PhoneNumberUtil::IS_POSSIBLE,
- phone_util_.IsPossibleNumberWithReason(ad_number));
- ad_number.set_country_code(376);
- ad_number.set_national_number(1ULL);
- EXPECT_EQ(PhoneNumberUtil::TOO_SHORT,
- phone_util_.IsPossibleNumberWithReason(ad_number));
- ad_number.set_country_code(376);
- ad_number.set_national_number(12345678901234567ULL);
- EXPECT_EQ(PhoneNumberUtil::TOO_LONG,
- phone_util_.IsPossibleNumberWithReason(ad_number));
}
TEST_F(PhoneNumberUtilTest, IsNotPossibleNumber) {
<< "Conversion did not correctly remove alpha characters";
}
+TEST_F(PhoneNumberUtilTest, NormaliseStripNonDiallableCharacters) {
+ string input_number("03*4-56&+a#234");
+ NormalizeDiallableCharsOnly(&input_number);
+ static const string kExpectedOutput("03*456+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");
phone_util_.Format(ad_number, PhoneNumberUtil::NATIONAL, &formatted_number);
EXPECT_EQ("12345", formatted_number);
EXPECT_EQ(PhoneNumberUtil::UNKNOWN, phone_util_.GetNumberType(ad_number));
- EXPECT_TRUE(phone_util_.IsValidNumber(ad_number));
+ EXPECT_FALSE(phone_util_.IsValidNumber(ad_number));
// Test dialing a US number from within Andorra.
PhoneNumber us_number;
}
TEST_F(PhoneNumberUtilTest, IsNumberMatchMatches) {
- // Test simple matches where formatting is different, or leading zeroes, or
+ // 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",
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:+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.
- test_number.Clear();
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.
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("01164 3 331 6005",
RegionCode::US(), &test_number));
EXPECT_EQ(nz_number, test_number);
- test_number.Clear();
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.
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+01164 3 331 6005",
RegionCode::US(), &test_number));
EXPECT_EQ(nz_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+0064 3 331 6005",
RegionCode::NZ(), &test_number));
EXPECT_EQ(nz_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+ 00 64 3 331 6005",
RegionCode::NZ(), &test_number));
PhoneNumber us_local_number;
us_local_number.set_country_code(1);
us_local_number.set_national_number(2530000ULL);
- test_number.Clear();
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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse(
"tel:253-0000;isub=12345;phone-context=www.google.com",
// 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.
- test_number.Clear();
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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("tel:2530000;isub=12345;phone-context=1234.com",
RegionCode::US(), &test_number));
nz_number.Clear();
nz_number.set_country_code(64);
nz_number.set_national_number(64123456ULL);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+64(0)64123456",
RegionCode::US(), &test_number));
PhoneNumber de_number;
de_number.set_country_code(49);
de_number.set_national_number(12345678ULL);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("123/45678", RegionCode::DE(), &test_number));
EXPECT_EQ(de_number, test_number);
// 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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("123-456-7890", RegionCode::US(), &test_number));
EXPECT_EQ(us_number, test_number);
PhoneNumber star_number;
star_number.set_country_code(81);
star_number.set_national_number(2345ULL);
- test_number.Clear();
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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("12", RegionCode::NZ(), &test_number));
EXPECT_EQ(short_number, test_number);
phone_util_.Parse("0800 DDA 005", RegionCode::NZ(), &test_number));
EXPECT_EQ(tollfree_number, test_number);
- test_number.Clear();
PhoneNumber premium_number;
premium_number.set_country_code(64);
premium_number.set_national_number(9003326005ULL);
// Not enough alpha characters for them to be considered intentional, so they
// are stripped.
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("0900 332 6005a",
RegionCode::NZ(), &test_number));
EXPECT_EQ(premium_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("0900 332 600a5",
RegionCode::NZ(), &test_number));
EXPECT_EQ(premium_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("0900 332 600A5",
RegionCode::NZ(), &test_number));
EXPECT_EQ(premium_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("0900 a332 600A5",
RegionCode::NZ(), &test_number));
phone_util_.Parse("+1 (650) 333-6000",
RegionCode::US(), &test_number));
EXPECT_EQ(us_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+1-650-333-6000",
RegionCode::US(), &test_number));
// Calling the US number from Singapore by using different service providers
// 1st test: calling using SingTel IDD service (IDD is 001)
- test_number.Clear();
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)
- test_number.Clear();
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)
- test_number.Clear();
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
- test_number.Clear();
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.
- test_number.Clear();
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.
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("\xEF\xBC\x8B" "1 (650) 333-6000",
/* "+1 (650) 333-6000" */
RegionCode::SG(), &test_number));
// Using a soft hyphen U+00AD.
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("1 (650) 333" "\xC2\xAD" "-6000",
/* "1 (650) 333Â-6000Â" */
EXPECT_EQ(us_number, test_number);
// The whole number, including punctuation, is here represented in full-width
// form.
- test_number.Clear();
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"
EXPECT_EQ(us_number, test_number);
// Using the U+30FC dash.
- test_number.Clear();
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"
PhoneNumber toll_free_number;
toll_free_number.set_country_code(800);
toll_free_number.set_national_number(12345678ULL);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("011 800 1234 5678",
RegionCode::US(), &test_number));
phone_util_.Parse("+39 02-36618 300",
RegionCode::NZ(), &test_number));
EXPECT_EQ(it_number, test_number);
- test_number.Clear();
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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("312 345 678", RegionCode::IT(), &test_number));
EXPECT_EQ(it_number, test_number);
phone_util_.Parse("+54 9 343 555 1212", RegionCode::AR(),
&test_number));
EXPECT_EQ(ar_number, test_number);
- test_number.Clear();
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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+54 9 3715 65 4320", RegionCode::AR(),
&test_number));
EXPECT_EQ(ar_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("03715 15 65 4320", RegionCode::AR(),
&test_number));
// Test parsing fixed-line numbers of Argentina.
ar_number.set_national_number(1137970000ULL);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+54 11 3797 0000", RegionCode::AR(),
&test_number));
EXPECT_EQ(ar_number, test_number);
- test_number.Clear();
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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+54 3715 65 4321", RegionCode::AR(),
&test_number));
EXPECT_EQ(ar_number, test_number);
- test_number.Clear();
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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+54 23 1234 0000", RegionCode::AR(),
&test_number));
EXPECT_EQ(ar_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("023 1234 0000", RegionCode::AR(), &test_number));
EXPECT_EQ(ar_number, test_number);
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("0123456789", RegionCode::AR(), &test_number));
EXPECT_EQ(ar_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("(0) 123456789", RegionCode::AR(), &test_number));
EXPECT_EQ(ar_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("0 123456789", RegionCode::AR(), &test_number));
EXPECT_EQ(ar_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("(0xx) 123456789", RegionCode::AR(),
&test_number));
// 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.
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("011xx5481429712", RegionCode::US(),
&test_number));
phone_util_.Parse("+52 (449)978-0001", RegionCode::MX(),
&test_number));
EXPECT_EQ(mx_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("01 (449)978-0001", RegionCode::MX(),
&test_number));
EXPECT_EQ(mx_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("(449)978-0001", RegionCode::MX(),
&test_number));
mx_number.Clear();
mx_number.set_country_code(52);
mx_number.set_national_number(13312345678ULL);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+52 1 33 1234-5678", RegionCode::MX(),
&test_number));
EXPECT_EQ(mx_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("044 (33) 1234-5678", RegionCode::MX(),
&test_number));
EXPECT_EQ(mx_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("045 33 1234-5678", RegionCode::MX(),
&test_number));
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);
phone_util_.Parse("03 331 6005 ext 3456", RegionCode::NZ(),
&test_number));
EXPECT_EQ(nz_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("03 331 6005x3456", RegionCode::NZ(),
&test_number));
EXPECT_EQ(nz_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("03-331 6005 int.3456", RegionCode::NZ(),
&test_number));
EXPECT_EQ(nz_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("03 331 6005 #3456", RegionCode::NZ(),
&test_number));
PhoneNumber non_extn_number;
non_extn_number.set_country_code(1);
non_extn_number.set_national_number(80074935247ULL);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("1800 six-flags", RegionCode::US(),
&test_number));
EXPECT_EQ(non_extn_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("1800 SIX-FLAGS", RegionCode::US(),
&test_number));
EXPECT_EQ(non_extn_number, test_number);
- test_number.Clear();
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);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("(1800) 7493.5247", RegionCode::US(),
&test_number));
extn_number.set_country_code(1);
extn_number.set_national_number(80074935247ULL);
extn_number.set_extension("1234");
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("0~0 1800 7493 5247 ~1234", RegionCode::PL(),
&test_number));
uk_number.set_country_code(44);
uk_number.set_national_number(2034567890ULL);
uk_number.set_extension("456");
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44 2034567890x456", RegionCode::NZ(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44 2034567890x456", RegionCode::GB(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44 2034567890 x456", RegionCode::GB(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44 2034567890 X456", RegionCode::GB(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44 2034567890 x 456 ", RegionCode::GB(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44 2034567890 X 456", RegionCode::GB(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44-2034567890;ext=456", RegionCode::GB(),
&test_number));
EXPECT_EQ(uk_number, test_number);
- test_number.Clear();
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.
- test_number.Clear();
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.
- test_number.Clear();
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.
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+44-2034567890\xEF\xBD\x98\xEF\xBD\x94""456",
RegionCode::GB(), &test_number));
us_with_extension.set_country_code(1);
us_with_extension.set_national_number(8009013355ULL);
us_with_extension.set_extension("7246433");
- test_number.Clear();
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);
- test_number.Clear();
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_number.Clear();
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);
- test_number.Clear();
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);
- test_number.Clear();
// Repeat with the small letter o with acute accent created by combining
// characters.
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
RegionCode::US(),
&test_number));
EXPECT_EQ(us_with_extension, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("(800) 901-3355 , 7246433", RegionCode::US(),
&test_number));
EXPECT_EQ(us_with_extension, test_number);
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("(800) 901-3355 ext: 7246433", RegionCode::US(),
&test_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");
- test_number.Clear();
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_number.Clear();
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_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("(212)123-1234 x508\\x1234", RegionCode::US(),
&test_number));
us_with_extension.set_country_code(1);
us_with_extension.set_national_number(6451231234ULL);
us_with_extension.set_extension("910");
- test_number.Clear();
EXPECT_EQ(PhoneNumberUtil::NO_PARSING_ERROR,
phone_util_.Parse("+1 (645) 123 1234-910#", RegionCode::US(),
&test_number));
&test_number));
EXPECT_EQ(alpha_numeric_number, test_number);
- // Try with invalid region - expect failure.
+ // 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(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);