Fully quality std::* names.
[platform/upstream/libphonenumber.git] / cpp / test / phonenumbers / phonenumberutil_test.cc
index 8973bd2..31fd893 100644 (file)
@@ -30,6 +30,7 @@
 
 #include <gtest/gtest.h>
 
+#include "phonenumbers/default_logger.h"
 #include "phonenumbers/phonemetadata.pb.h"
 #include "phonenumbers/phonenumber.h"
 #include "phonenumbers/phonenumber.pb.h"
@@ -38,9 +39,7 @@
 namespace i18n {
 namespace phonenumbers {
 
-using std::endl;
 using std::find;
-using std::make_pair;
 using std::ostream;
 
 using google::protobuf::RepeatedPtrField;
@@ -50,6 +49,7 @@ 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.
@@ -90,6 +90,10 @@ class PhoneNumberUtilTest : public testing::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);
   }
@@ -146,6 +150,9 @@ class PhoneNumberUtilTest : public testing::Test {
   }
 
   const PhoneNumberUtil& phone_util_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(PhoneNumberUtilTest);
 };
 
 TEST_F(PhoneNumberUtilTest, ContainsOnlyValidDigits) {
@@ -164,6 +171,20 @@ TEST_F(PhoneNumberUtilTest, GetSupportedRegions) {
   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, &region_code);
+    EXPECT_EQ(RegionCode::UN001(), region_code);
+  }
+}
+
 TEST_F(PhoneNumberUtilTest, GetRegionCodesForCountryCallingCode) {
   list<string> regions;
 
@@ -307,23 +328,25 @@ TEST_F(PhoneNumberUtilTest, GetExampleNumber) {
   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);
@@ -331,21 +354,19 @@ TEST_F(PhoneNumberUtilTest, GetExampleNumber) {
   // 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));
@@ -883,6 +904,7 @@ TEST_F(PhoneNumberUtilTest, FormatWithCarrierCode) {
   // 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);
@@ -946,10 +968,35 @@ TEST_F(PhoneNumberUtilTest, FormatWithPreferredCarrierCode) {
 TEST_F(PhoneNumberUtilTest, FormatNumberForMobileDialing) {
   PhoneNumber test_number;
   string formatted_number;
-  test_number.set_country_code(1);
 
+  // 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.
+  // 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 */
@@ -1010,6 +1057,102 @@ TEST_F(PhoneNumberUtilTest, FormatNumberForMobileDialing) {
   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(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) {
@@ -1216,6 +1359,11 @@ TEST_F(PhoneNumberUtilTest, GetLengthOfNationalDestinationCode) {
   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);
@@ -1255,6 +1403,20 @@ TEST_F(PhoneNumberUtilTest, GetLengthOfNationalDestinationCode) {
   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.
@@ -1578,21 +1740,6 @@ TEST_F(PhoneNumberUtilTest, IsPossibleNumberWithReason) {
   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) {
@@ -2263,6 +2410,14 @@ TEST_F(PhoneNumberUtilTest, NormaliseStripAlphaCharacters) {
       << "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");
@@ -2527,7 +2682,7 @@ TEST_F(PhoneNumberUtilTest, CountryWithNoNumberDesc) {
   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;
@@ -2554,7 +2709,7 @@ TEST_F(PhoneNumberUtilTest, UnknownCountryCallingCode) {
 }
 
 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",
@@ -2823,6 +2978,10 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
             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,
@@ -2838,38 +2997,36 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
             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));
@@ -2878,12 +3035,10 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
   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",
@@ -2892,12 +3047,10 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
   // 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));
@@ -2907,7 +3060,6 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
   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));
@@ -2917,7 +3069,6 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
   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);
@@ -2927,7 +3078,6 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
   // 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);
@@ -2937,7 +3087,6 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
   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);
@@ -2945,7 +3094,6 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumber) {
   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);
@@ -2961,7 +3109,6 @@ TEST_F(PhoneNumberUtilTest, ParseNumberWithAlphaCharacters) {
             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);
@@ -2971,24 +3118,20 @@ TEST_F(PhoneNumberUtilTest, ParseNumberWithAlphaCharacters) {
 
   // 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));
@@ -3004,7 +3147,6 @@ TEST_F(PhoneNumberUtilTest, ParseWithInternationalPrefixes) {
             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));
@@ -3012,44 +3154,37 @@ TEST_F(PhoneNumberUtilTest, ParseWithInternationalPrefixes) {
 
   // 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­" */
@@ -3057,7 +3192,6 @@ TEST_F(PhoneNumberUtilTest, ParseWithInternationalPrefixes) {
   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"
@@ -3069,7 +3203,6 @@ TEST_F(PhoneNumberUtilTest, ParseWithInternationalPrefixes) {
   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"
@@ -3083,7 +3216,6 @@ TEST_F(PhoneNumberUtilTest, ParseWithInternationalPrefixes) {
   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));
@@ -3100,7 +3232,6 @@ TEST_F(PhoneNumberUtilTest, ParseWithLeadingZero) {
             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);
@@ -3108,7 +3239,6 @@ TEST_F(PhoneNumberUtilTest, ParseWithLeadingZero) {
   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);
@@ -3124,19 +3254,16 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumberArgentina) {
             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));
@@ -3144,34 +3271,28 @@ TEST_F(PhoneNumberUtilTest, ParseNationalNumberArgentina) {
 
   // 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);
@@ -3187,15 +3308,12 @@ TEST_F(PhoneNumberUtilTest, ParseWithXInNumber) {
   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));
@@ -3209,7 +3327,6 @@ TEST_F(PhoneNumberUtilTest, ParseWithXInNumber) {
   // 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));
@@ -3227,12 +3344,10 @@ TEST_F(PhoneNumberUtilTest, ParseNumbersMexico) {
             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));
@@ -3242,17 +3357,14 @@ TEST_F(PhoneNumberUtilTest, ParseNumbersMexico) {
   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));
@@ -3431,6 +3543,41 @@ TEST_F(PhoneNumberUtilTest, ParseNumbersWithPlusWithNoRegion) {
   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);
@@ -3441,17 +3588,14 @@ TEST_F(PhoneNumberUtilTest, ParseExtensions) {
             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));
@@ -3461,22 +3605,18 @@ TEST_F(PhoneNumberUtilTest, ParseExtensions) {
   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));
@@ -3487,7 +3627,6 @@ TEST_F(PhoneNumberUtilTest, ParseExtensions) {
   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));
@@ -3500,73 +3639,60 @@ TEST_F(PhoneNumberUtilTest, ParseExtensions) {
   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));
@@ -3576,30 +3702,25 @@ TEST_F(PhoneNumberUtilTest, ParseExtensions) {
   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,
@@ -3608,12 +3729,10 @@ TEST_F(PhoneNumberUtilTest, ParseExtensions) {
                               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));
@@ -3624,17 +3743,14 @@ TEST_F(PhoneNumberUtilTest, ParseExtensions) {
   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));
@@ -3646,7 +3762,6 @@ TEST_F(PhoneNumberUtilTest, ParseExtensions) {
   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));
@@ -3694,7 +3809,8 @@ TEST_F(PhoneNumberUtilTest, ParseAndKeepRaw) {
                                              &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));
@@ -3713,6 +3829,47 @@ TEST_F(PhoneNumberUtilTest, ParseAndKeepRaw) {
   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);