Home | History | Annotate | Download | only in browser
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/strings/string16.h"
      6 #include "base/strings/utf_string_conversions.h"
      7 #include "components/autofill/core/browser/autofill_profile.h"
      8 #include "components/autofill/core/browser/autofill_type.h"
      9 #include "components/autofill/core/browser/field_types.h"
     10 #include "components/autofill/core/browser/phone_number.h"
     11 #include "components/autofill/core/browser/phone_number_i18n.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace autofill {
     15 
     16 TEST(PhoneNumberTest, Matcher) {
     17   AutofillProfile profile;
     18   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
     19   // Set phone number so country_code == 1, city_code = 650, number = 2345678.
     20   base::string16 phone(ASCIIToUTF16("1 [650] 234-5678"));
     21   PhoneNumber phone_number(&profile);
     22   phone_number.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER), phone, "US");
     23 
     24   ServerFieldTypeSet matching_types;
     25   phone_number.GetMatchingTypes(base::string16(), "US", &matching_types);
     26   EXPECT_EQ(1U, matching_types.size());
     27   EXPECT_TRUE(matching_types.find(EMPTY_TYPE) != matching_types.end());
     28   matching_types.clear();
     29   phone_number.GetMatchingTypes(ASCIIToUTF16("1"), "US", &matching_types);
     30   EXPECT_EQ(1U, matching_types.size());
     31   EXPECT_TRUE(matching_types.find(PHONE_HOME_COUNTRY_CODE) !=
     32               matching_types.end());
     33   matching_types.clear();
     34   phone_number.GetMatchingTypes(ASCIIToUTF16("16"), "US", &matching_types);
     35   EXPECT_EQ(0U, matching_types.size());
     36   phone_number.GetMatchingTypes(ASCIIToUTF16("165"), "US", &matching_types);
     37   EXPECT_EQ(0U, matching_types.size());
     38   phone_number.GetMatchingTypes(ASCIIToUTF16("1650"), "US", &matching_types);
     39   EXPECT_EQ(0U, matching_types.size());
     40   phone_number.GetMatchingTypes(ASCIIToUTF16("16502"), "US", &matching_types);
     41   EXPECT_EQ(0U, matching_types.size());
     42   phone_number.GetMatchingTypes(ASCIIToUTF16("165023"), "US", &matching_types);
     43   EXPECT_EQ(0U, matching_types.size());
     44   phone_number.GetMatchingTypes(ASCIIToUTF16("1650234"), "US", &matching_types);
     45   EXPECT_EQ(0U, matching_types.size());
     46   matching_types.clear();
     47   phone_number.GetMatchingTypes(ASCIIToUTF16("16502345678"), "US",
     48                                 &matching_types);
     49   EXPECT_EQ(1U, matching_types.size());
     50   EXPECT_TRUE(matching_types.find(PHONE_HOME_WHOLE_NUMBER) !=
     51               matching_types.end());
     52   matching_types.clear();
     53   phone_number.GetMatchingTypes(ASCIIToUTF16("650"), "US", &matching_types);
     54   EXPECT_EQ(1U, matching_types.size());
     55   EXPECT_TRUE(matching_types.find(PHONE_HOME_CITY_CODE) !=
     56               matching_types.end());
     57   matching_types.clear();
     58   phone_number.GetMatchingTypes(ASCIIToUTF16("2345678"), "US", &matching_types);
     59   EXPECT_EQ(1U, matching_types.size());
     60   EXPECT_TRUE(matching_types.find(PHONE_HOME_NUMBER) != matching_types.end());
     61   matching_types.clear();
     62   phone_number.GetMatchingTypes(ASCIIToUTF16("234"), "US", &matching_types);
     63   EXPECT_EQ(1U, matching_types.size());
     64   EXPECT_TRUE(matching_types.find(PHONE_HOME_NUMBER) != matching_types.end());
     65   matching_types.clear();
     66   phone_number.GetMatchingTypes(ASCIIToUTF16("5678"), "US", &matching_types);
     67   EXPECT_EQ(1U, matching_types.size());
     68   EXPECT_TRUE(matching_types.find(PHONE_HOME_NUMBER) != matching_types.end());
     69   matching_types.clear();
     70   phone_number.GetMatchingTypes(ASCIIToUTF16("2345"), "US", &matching_types);
     71   EXPECT_EQ(0U, matching_types.size());
     72   matching_types.clear();
     73   phone_number.GetMatchingTypes(ASCIIToUTF16("6502345678"), "US",
     74                                 &matching_types);
     75   EXPECT_EQ(1U, matching_types.size());
     76   EXPECT_TRUE(matching_types.find(PHONE_HOME_CITY_AND_NUMBER) !=
     77               matching_types.end());
     78   matching_types.clear();
     79   phone_number.GetMatchingTypes(ASCIIToUTF16("(650)2345678"), "US",
     80                                 &matching_types);
     81   EXPECT_EQ(1U, matching_types.size());
     82   EXPECT_TRUE(matching_types.find(PHONE_HOME_CITY_AND_NUMBER) !=
     83               matching_types.end());
     84 }
     85 
     86 // Verify that PhoneNumber::SetInfo() correctly formats the incoming number.
     87 TEST(PhoneNumberTest, SetInfo) {
     88   AutofillProfile profile;
     89   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
     90 
     91   PhoneNumber phone(&profile);
     92   EXPECT_EQ(base::string16(), phone.GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
     93 
     94   // Set the formatted info directly.
     95   EXPECT_TRUE(phone.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER),
     96                             ASCIIToUTF16("(650) 234-5678"), "US"));
     97   EXPECT_EQ(ASCIIToUTF16("(650) 234-5678"),
     98             phone.GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
     99 
    100   // Unformatted numbers should be formatted.
    101   EXPECT_TRUE(phone.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER),
    102                             ASCIIToUTF16("8887776666"), "US"));
    103   EXPECT_EQ(ASCIIToUTF16("(888) 777-6666"),
    104             phone.GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
    105 
    106   // Differently formatted numbers should be re-formatted.
    107   EXPECT_TRUE(phone.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER),
    108                             ASCIIToUTF16("800-432-8765"), "US"));
    109   EXPECT_EQ(ASCIIToUTF16("(800) 432-8765"),
    110             phone.GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
    111 
    112   // Invalid numbers should not be stored.  In the US, phone numbers cannot
    113   // start with the digit '1'.
    114   EXPECT_FALSE(phone.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER),
    115                              ASCIIToUTF16("650111111"), "US"));
    116   EXPECT_EQ(base::string16(), phone.GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
    117 }
    118 
    119 // Test that cached phone numbers are correctly invalidated and updated.
    120 TEST(PhoneNumberTest, UpdateCachedPhoneNumber) {
    121   AutofillProfile profile;
    122   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
    123 
    124   PhoneNumber phone(&profile);
    125   phone.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("6502345678"));
    126   EXPECT_EQ(ASCIIToUTF16("650"),
    127             phone.GetInfo(AutofillType(PHONE_HOME_CITY_CODE), "US"));
    128 
    129   // Update the area code.
    130   phone.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("8322345678"));
    131   EXPECT_EQ(ASCIIToUTF16("832"),
    132             phone.GetInfo(AutofillType(PHONE_HOME_CITY_CODE), "US"));
    133 
    134   // Change the phone number to have a UK format, but try to parse with the
    135   // wrong locale.
    136   phone.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("07023456789"));
    137   EXPECT_EQ(base::string16(),
    138             phone.GetInfo(AutofillType(PHONE_HOME_CITY_CODE), "US"));
    139 
    140   // Now try parsing using the correct locale.  Note that the profile's country
    141   // code should override the app locale, which is still set to "US".
    142   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("GB"));
    143   phone.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("07023456789"));
    144   EXPECT_EQ(ASCIIToUTF16("70"),
    145             phone.GetInfo(AutofillType(PHONE_HOME_CITY_CODE), "US"));
    146 }
    147 
    148 TEST(PhoneNumberTest, PhoneCombineHelper) {
    149   AutofillProfile profile;
    150   profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US"));
    151 
    152   PhoneNumber::PhoneCombineHelper number1;
    153   EXPECT_FALSE(number1.SetInfo(AutofillType(ADDRESS_BILLING_CITY),
    154                                ASCIIToUTF16("1")));
    155   EXPECT_TRUE(number1.SetInfo(AutofillType(PHONE_HOME_COUNTRY_CODE),
    156                               ASCIIToUTF16("1")));
    157   EXPECT_TRUE(number1.SetInfo(AutofillType(PHONE_HOME_CITY_CODE),
    158                               ASCIIToUTF16("650")));
    159   EXPECT_TRUE(number1.SetInfo(AutofillType(PHONE_HOME_NUMBER),
    160                               ASCIIToUTF16("2345678")));
    161   base::string16 parsed_phone;
    162   EXPECT_TRUE(number1.ParseNumber(profile, "en-US", &parsed_phone));
    163   // International format as it has a country code.
    164   EXPECT_EQ(ASCIIToUTF16("+1 650-234-5678"), parsed_phone);
    165 
    166   PhoneNumber::PhoneCombineHelper number3;
    167   EXPECT_TRUE(number3.SetInfo(AutofillType(PHONE_HOME_CITY_CODE),
    168                               ASCIIToUTF16("650")));
    169   EXPECT_TRUE(number3.SetInfo(AutofillType(PHONE_HOME_NUMBER),
    170                               ASCIIToUTF16("2345680")));
    171   EXPECT_TRUE(number3.ParseNumber(profile, "en-US", &parsed_phone));
    172   // National format as it does not have a country code.
    173   EXPECT_EQ(ASCIIToUTF16("(650) 234-5680"), parsed_phone);
    174 
    175   PhoneNumber::PhoneCombineHelper number4;
    176   EXPECT_TRUE(number4.SetInfo(AutofillType(PHONE_HOME_CITY_CODE),
    177                               ASCIIToUTF16("123")));  // Incorrect city code.
    178   EXPECT_TRUE(number4.SetInfo(AutofillType(PHONE_HOME_NUMBER),
    179                               ASCIIToUTF16("2345680")));
    180   EXPECT_FALSE(number4.ParseNumber(profile, "en-US", &parsed_phone));
    181   EXPECT_EQ(base::string16(), parsed_phone);
    182 
    183   PhoneNumber::PhoneCombineHelper number5;
    184   EXPECT_TRUE(number5.SetInfo(AutofillType(PHONE_HOME_CITY_AND_NUMBER),
    185                               ASCIIToUTF16("6502345681")));
    186   EXPECT_TRUE(number5.ParseNumber(profile, "en-US", &parsed_phone));
    187   EXPECT_EQ(ASCIIToUTF16("(650) 234-5681"), parsed_phone);
    188 
    189   PhoneNumber::PhoneCombineHelper number6;
    190   EXPECT_TRUE(number6.SetInfo(AutofillType(PHONE_HOME_CITY_CODE),
    191                               ASCIIToUTF16("650")));
    192   EXPECT_TRUE(number6.SetInfo(AutofillType(PHONE_HOME_NUMBER),
    193                               ASCIIToUTF16("234")));
    194   EXPECT_TRUE(number6.SetInfo(AutofillType(PHONE_HOME_NUMBER),
    195                               ASCIIToUTF16("5682")));
    196   EXPECT_TRUE(number6.ParseNumber(profile, "en-US", &parsed_phone));
    197   EXPECT_EQ(ASCIIToUTF16("(650) 234-5682"), parsed_phone);
    198 
    199   // Ensure parsing is possible when falling back to detecting the country code
    200   // based on the app locale.
    201   PhoneNumber::PhoneCombineHelper number7;
    202   EXPECT_TRUE(number7.SetInfo(AutofillType(PHONE_HOME_CITY_CODE),
    203                               ASCIIToUTF16("650")));
    204   EXPECT_TRUE(number7.SetInfo(AutofillType(PHONE_HOME_NUMBER),
    205                               ASCIIToUTF16("234")));
    206   EXPECT_TRUE(number7.SetInfo(AutofillType(PHONE_HOME_NUMBER),
    207                               ASCIIToUTF16("5682")));
    208   EXPECT_TRUE(number7.ParseNumber(AutofillProfile(), "en-US", &parsed_phone));
    209   EXPECT_EQ(ASCIIToUTF16("(650) 234-5682"), parsed_phone);
    210 }
    211 
    212 }  // namespace autofill
    213