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