Clean compile 32-bit builds
[platform/upstream/libphonenumber.git] / cpp / test / phonenumbers / phonenumberutil_test.cc
index 9347f19..13e97df 100644 (file)
@@ -173,6 +173,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;
 
@@ -316,23 +330,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);
@@ -340,21 +356,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));
@@ -1075,6 +1089,72 @@ TEST_F(PhoneNumberUtilTest, FormatNumberForMobileDialing) {
   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) {
@@ -1333,8 +1413,8 @@ TEST_F(PhoneNumberUtilTest, GetCountryMobileToken) {
   phone_util_.GetCountryMobileToken(country_calling_code, &mobile_token);
   EXPECT_EQ("1", mobile_token);
 
-  // Country calling code for United States, which has no mobile token.
-  country_calling_code = phone_util_.GetCountryCodeForRegion(RegionCode::US());
+  // 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);
 }
@@ -1662,21 +1742,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) {
@@ -2619,7 +2684,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;
@@ -2646,7 +2711,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",
@@ -2915,6 +2980,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,
@@ -2930,38 +2999,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));
@@ -2970,12 +3037,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",
@@ -2984,12 +3049,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));
@@ -2999,7 +3062,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));
@@ -3009,7 +3071,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);
@@ -3019,7 +3080,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);
@@ -3029,7 +3089,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);
@@ -3037,7 +3096,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);
@@ -3053,7 +3111,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);
@@ -3063,24 +3120,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));
@@ -3096,7 +3149,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));
@@ -3104,44 +3156,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­" */
@@ -3149,7 +3194,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"
@@ -3161,7 +3205,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"
@@ -3175,7 +3218,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));
@@ -3192,7 +3234,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);
@@ -3200,7 +3241,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);
@@ -3216,19 +3256,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));
@@ -3236,34 +3273,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);
@@ -3279,15 +3310,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));
@@ -3301,7 +3329,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));
@@ -3319,12 +3346,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));
@@ -3334,17 +3359,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));
@@ -3523,6 +3545,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);
@@ -3533,17 +3590,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));
@@ -3553,22 +3607,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));
@@ -3579,7 +3629,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));
@@ -3592,73 +3641,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));
@@ -3668,30 +3704,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,
@@ -3700,12 +3731,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));
@@ -3716,17 +3745,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));
@@ -3738,7 +3764,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));
@@ -3786,7 +3811,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));
@@ -3805,6 +3831,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);