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 "components/autofill/core/browser/contact_info.h"
      6 
      7 #include "base/basictypes.h"
      8 #include "base/format_macros.h"
      9 #include "base/strings/string_util.h"
     10 #include "base/strings/stringprintf.h"
     11 #include "base/strings/utf_string_conversions.h"
     12 #include "components/autofill/core/browser/autofill_type.h"
     13 #include "components/autofill/core/browser/field_types.h"
     14 #include "testing/gtest/include/gtest/gtest.h"
     15 
     16 using base::ASCIIToUTF16;
     17 
     18 namespace autofill {
     19 
     20 struct FullNameTestCase {
     21   std::string full_name_input;
     22   std::string given_name_output;
     23   std::string middle_name_output;
     24   std::string family_name_output;
     25 } full_name_test_cases[] = {
     26   { "", "", "", "" },
     27   { "John Smith", "John", "", "Smith" },
     28   { "Julien van der Poel", "Julien", "", "van der Poel" },
     29   { "John J Johnson", "John", "J", "Johnson" },
     30   { "John Smith, Jr.", "John", "", "Smith" },
     31   { "Mr John Smith", "John", "", "Smith" },
     32   { "Mr. John Smith", "John", "", "Smith" },
     33   { "Mr. John Smith, M.D.", "John", "", "Smith" },
     34   { "Mr. John Smith, MD", "John", "", "Smith" },
     35   { "Mr. John Smith MD", "John", "", "Smith" },
     36   { "William Hubert J.R.", "William", "Hubert", "J.R." },
     37   { "John Ma", "John", "", "Ma" },
     38   { "John Smith, MA", "John", "", "Smith" },
     39   { "John Jacob Jingleheimer Smith", "John Jacob", "Jingleheimer", "Smith" },
     40   { "Virgil", "Virgil", "", "" },
     41   { "Murray Gell-Mann", "Murray", "", "Gell-Mann" },
     42   { "Mikhail Yevgrafovich Saltykov-Shchedrin", "Mikhail", "Yevgrafovich",
     43     "Saltykov-Shchedrin" },
     44   { "Arthur Ignatius Conan Doyle", "Arthur Ignatius", "Conan", "Doyle" },
     45 };
     46 
     47 TEST(NameInfoTest, SetFullName) {
     48   for (size_t i = 0; i < arraysize(full_name_test_cases); ++i) {
     49     const FullNameTestCase& test_case = full_name_test_cases[i];
     50     SCOPED_TRACE(test_case.full_name_input);
     51 
     52     NameInfo name;
     53     name.SetInfo(AutofillType(NAME_FULL),
     54                  ASCIIToUTF16(test_case.full_name_input),
     55                  "en-US");
     56     EXPECT_EQ(ASCIIToUTF16(test_case.given_name_output),
     57               name.GetInfo(AutofillType(NAME_FIRST), "en-US"));
     58     EXPECT_EQ(ASCIIToUTF16(test_case.middle_name_output),
     59               name.GetInfo(AutofillType(NAME_MIDDLE), "en-US"));
     60     EXPECT_EQ(ASCIIToUTF16(test_case.family_name_output),
     61               name.GetInfo(AutofillType(NAME_LAST), "en-US"));
     62     EXPECT_EQ(ASCIIToUTF16(test_case.full_name_input),
     63               name.GetInfo(AutofillType(NAME_FULL), "en-US"));
     64   }
     65 }
     66 
     67 TEST(NameInfoTest, GetFullName) {
     68   NameInfo name;
     69   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
     70   name.SetRawInfo(NAME_MIDDLE, base::string16());
     71   name.SetRawInfo(NAME_LAST, base::string16());
     72   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("First"));
     73   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), base::string16());
     74   EXPECT_EQ(name.GetRawInfo(NAME_LAST), base::string16());
     75   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First"));
     76 
     77   name.SetRawInfo(NAME_FIRST, base::string16());
     78   name.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Middle"));
     79   name.SetRawInfo(NAME_LAST, base::string16());
     80   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), base::string16());
     81   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
     82   EXPECT_EQ(name.GetRawInfo(NAME_LAST), base::string16());
     83   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("Middle"));
     84 
     85   name.SetRawInfo(NAME_FIRST, base::string16());
     86   name.SetRawInfo(NAME_MIDDLE, base::string16());
     87   name.SetRawInfo(NAME_LAST, ASCIIToUTF16("Last"));
     88   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), base::string16());
     89   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), base::string16());
     90   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
     91   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("Last"));
     92 
     93   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
     94   name.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Middle"));
     95   name.SetRawInfo(NAME_LAST, base::string16());
     96   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("First"));
     97   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
     98   EXPECT_EQ(name.GetRawInfo(NAME_LAST), base::string16());
     99   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First Middle"));
    100 
    101   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
    102   name.SetRawInfo(NAME_MIDDLE, base::string16());
    103   name.SetRawInfo(NAME_LAST, ASCIIToUTF16("Last"));
    104   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("First"));
    105   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), base::string16());
    106   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
    107   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First Last"));
    108 
    109   name.SetRawInfo(NAME_FIRST, base::string16());
    110   name.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Middle"));
    111   name.SetRawInfo(NAME_LAST, ASCIIToUTF16("Last"));
    112   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), base::string16());
    113   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
    114   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
    115   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("Middle Last"));
    116 
    117   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
    118   name.SetRawInfo(NAME_MIDDLE, ASCIIToUTF16("Middle"));
    119   name.SetRawInfo(NAME_LAST, ASCIIToUTF16("Last"));
    120   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("First"));
    121   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
    122   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
    123   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First Middle Last"));
    124 
    125   name.SetRawInfo(NAME_FULL, ASCIIToUTF16("First Middle Last, MD"));
    126   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("First"));
    127   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
    128   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
    129   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First Middle Last, MD"));
    130 
    131   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("First"));
    132   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("First"));
    133   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
    134   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
    135   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("First Middle Last, MD"));
    136 
    137   // Changing something (e.g., the first name) clears the stored full name.
    138   name.SetRawInfo(NAME_FIRST, ASCIIToUTF16("Second"));
    139   EXPECT_EQ(name.GetRawInfo(NAME_FIRST), ASCIIToUTF16("Second"));
    140   EXPECT_EQ(name.GetRawInfo(NAME_MIDDLE), ASCIIToUTF16("Middle"));
    141   EXPECT_EQ(name.GetRawInfo(NAME_LAST), ASCIIToUTF16("Last"));
    142   EXPECT_EQ(name.GetRawInfo(NAME_FULL), ASCIIToUTF16("Second Middle Last"));
    143 }
    144 
    145 TEST(NameInfoTest, EqualsIgnoreCase) {
    146   struct TestCase {
    147     std::string starting_names[3];
    148     std::string additional_names[3];
    149     bool expected_result;
    150   };
    151 
    152   struct TestCase test_cases[] = {
    153       // Identical name comparison.
    154       {{"Marion", "Mitchell", "Morrison"},
    155        {"Marion", "Mitchell", "Morrison"},
    156        true},
    157 
    158       // Case-insensative comparisons.
    159       {{"Marion", "Mitchell", "Morrison"},
    160        {"Marion", "Mitchell", "MORRISON"},
    161        true},
    162       {{"Marion", "Mitchell", "Morrison"},
    163        {"MARION", "Mitchell", "MORRISON"},
    164        true},
    165       {{"Marion", "Mitchell", "Morrison"},
    166        {"MARION", "MITCHELL", "MORRISON"},
    167        true},
    168       {{"Marion", "", "Mitchell Morrison"},
    169        {"MARION", "", "MITCHELL MORRISON"},
    170        true},
    171       {{"Marion Mitchell", "", "Morrison"},
    172        {"MARION MITCHELL", "", "MORRISON"},
    173        true},
    174 
    175       // Identical full names but different canonical forms.
    176       {{"Marion", "Mitchell", "Morrison"},
    177        {"Marion", "", "Mitchell Morrison"},
    178        false},
    179       {{"Marion", "Mitchell", "Morrison"},
    180        {"Marion Mitchell", "", "MORRISON"},
    181        false},
    182 
    183       // Different names.
    184       {{"Marion", "Mitchell", "Morrison"}, {"Marion", "M.", "Morrison"}, false},
    185       {{"Marion", "Mitchell", "Morrison"}, {"MARION", "M.", "MORRISON"}, false},
    186       {{"Marion", "Mitchell", "Morrison"},
    187        {"David", "Mitchell", "Morrison"},
    188        false},
    189   };
    190 
    191   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) {
    192     SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i));
    193 
    194     // Construct the starting_profile.
    195     NameInfo starting_profile;
    196     starting_profile.SetRawInfo(NAME_FIRST,
    197                                 ASCIIToUTF16(test_cases[i].starting_names[0]));
    198     starting_profile.SetRawInfo(NAME_MIDDLE,
    199                                 ASCIIToUTF16(test_cases[i].starting_names[1]));
    200     starting_profile.SetRawInfo(NAME_LAST,
    201                                 ASCIIToUTF16(test_cases[i].starting_names[2]));
    202 
    203     // Construct the additional_profile.
    204     NameInfo additional_profile;
    205     additional_profile.SetRawInfo(
    206         NAME_FIRST, ASCIIToUTF16(test_cases[i].additional_names[0]));
    207     additional_profile.SetRawInfo(
    208         NAME_MIDDLE, ASCIIToUTF16(test_cases[i].additional_names[1]));
    209     additional_profile.SetRawInfo(
    210         NAME_LAST, ASCIIToUTF16(test_cases[i].additional_names[2]));
    211 
    212     // Verify the test expectations.
    213     EXPECT_EQ(test_cases[i].expected_result,
    214               starting_profile.EqualsIgnoreCase(additional_profile));
    215   }
    216 }
    217 
    218 }  // namespace autofill
    219