autofill_profile_unittest.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
153d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr// Copyright 2013 The Chromium Authors. All rights reserved. 253d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr// Use of this source code is governed by a BSD-style license that can be 353d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr// found in the LICENSE file. 453d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 51ae29591efbb29492ce05378909ccf4028d7c1eeBehdad Esfahbod#include "base/basictypes.h" 630e691edd056ba22fa8970280e986747817bec3dBehdad Esfahbod#include "base/format_macros.h" 74162de350edeb4aa09c508e5a39ac5fa20d8d619jvr#include "base/guid.h" 84162de350edeb4aa09c508e5a39ac5fa20d8d619jvr#include "base/memory/scoped_ptr.h" 94162de350edeb4aa09c508e5a39ac5fa20d8d619jvr#include "base/memory/scoped_vector.h" 104162de350edeb4aa09c508e5a39ac5fa20d8d619jvr#include "base/stl_util.h" 114162de350edeb4aa09c508e5a39ac5fa20d8d619jvr#include "base/strings/string16.h" 124162de350edeb4aa09c508e5a39ac5fa20d8d619jvr#include "base/strings/stringprintf.h" 134162de350edeb4aa09c508e5a39ac5fa20d8d619jvr#include "base/strings/utf_string_conversions.h" 1405e2541b49e530a3771b5ec14eee5f956308506ajvr#include "components/autofill/core/browser/autofill_profile.h" 1505e2541b49e530a3771b5ec14eee5f956308506ajvr#include "components/autofill/core/browser/autofill_test_utils.h" 1605e2541b49e530a3771b5ec14eee5f956308506ajvr#include "components/autofill/core/browser/autofill_type.h" 1705e2541b49e530a3771b5ec14eee5f956308506ajvr#include "components/autofill/core/browser/field_types.h" 1805e2541b49e530a3771b5ec14eee5f956308506ajvr#include "components/autofill/core/common/form_field_data.h" 1905e2541b49e530a3771b5ec14eee5f956308506ajvr#include "grit/components_strings.h" 204162de350edeb4aa09c508e5a39ac5fa20d8d619jvr#include "testing/gtest/include/gtest/gtest.h" 2153d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 2253d7523c1c36caf25e72c7a4ab0f9d18d594b895jvrusing base::ASCIIToUTF16; 2353d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 2453d7523c1c36caf25e72c7a4ab0f9d18d594b895jvrnamespace autofill { 2553d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 2653d7523c1c36caf25e72c7a4ab0f9d18d594b895jvrnamespace { 2753d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 2853d7523c1c36caf25e72c7a4ab0f9d18d594b895jvrbase::string16 GetLabel(AutofillProfile* profile) { 2953d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr std::vector<AutofillProfile*> profiles; 3053d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr profiles.push_back(profile); 3153d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr std::vector<base::string16> labels; 3253d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr AutofillProfile::CreateDifferentiatingLabels(profiles, &labels); 3353d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr return labels[0]; 3453d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr} 3553d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 3653d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr// Holds the autofill profile |first|, |middle| and |last| names. 3753d7523c1c36caf25e72c7a4ab0f9d18d594b895jvrstruct NameParts { 3853d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr NameParts(const std::string& first, 3953d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr const std::string& middle, 4053d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr const std::string& last) 4153d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr : first(first), middle(middle), last(last) {} 4253d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 4353d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr std::string first; 4453d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr std::string middle; 4553d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr std::string last; 4653d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr}; 4753d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 4853d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr// Test case to be executed to validate OverwriteOrAppendNames. 494162de350edeb4aa09c508e5a39ac5fa20d8d619jvrstruct TestCase { 504162de350edeb4aa09c508e5a39ac5fa20d8d619jvr TestCase(const NameParts& starting_name, 514162de350edeb4aa09c508e5a39ac5fa20d8d619jvr const NameParts& additional_name, 5253d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr const NameParts& expected_result) 534162de350edeb4aa09c508e5a39ac5fa20d8d619jvr : starting_names(std::vector<NameParts>(1, starting_name)), 5453d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr additional_names(std::vector<NameParts>(1, additional_name)), 554162de350edeb4aa09c508e5a39ac5fa20d8d619jvr expected_result(std::vector<NameParts>(1, expected_result)) {} 564162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 574162de350edeb4aa09c508e5a39ac5fa20d8d619jvr TestCase(const std::vector<NameParts>& starting_names, 584162de350edeb4aa09c508e5a39ac5fa20d8d619jvr const std::vector<NameParts>& additional_names, 594162de350edeb4aa09c508e5a39ac5fa20d8d619jvr const std::vector<NameParts>& expected_result) 604162de350edeb4aa09c508e5a39ac5fa20d8d619jvr : starting_names(starting_names), 6153d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr additional_names(additional_names), 6253d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr expected_result(expected_result) {} 6353d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 644162de350edeb4aa09c508e5a39ac5fa20d8d619jvr std::vector<NameParts> starting_names; 6553d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr std::vector<NameParts> additional_names; 6653d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr std::vector<NameParts> expected_result; 674162de350edeb4aa09c508e5a39ac5fa20d8d619jvr}; 684162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 694162de350edeb4aa09c508e5a39ac5fa20d8d619jvr// Populates |first_names|, |middle_names| and |last_names| from the list of 704162de350edeb4aa09c508e5a39ac5fa20d8d619jvr// NameParts from |starting_names|, |additional_names| or |expected_result| 714162de350edeb4aa09c508e5a39ac5fa20d8d619jvr// from the testcase to create and verify the autofill profile. 724162de350edeb4aa09c508e5a39ac5fa20d8d619jvrvoid GetNamePartsList(const std::vector<NameParts>& names, 7353d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr std::vector<base::string16>* first_names, 744162de350edeb4aa09c508e5a39ac5fa20d8d619jvr std::vector<base::string16>* middle_names, 754162de350edeb4aa09c508e5a39ac5fa20d8d619jvr std::vector<base::string16>* last_names) { 764162de350edeb4aa09c508e5a39ac5fa20d8d619jvr for (size_t i = 0; i < names.size(); ++i) { 774162de350edeb4aa09c508e5a39ac5fa20d8d619jvr first_names->push_back(ASCIIToUTF16(names[i].first)); 784162de350edeb4aa09c508e5a39ac5fa20d8d619jvr middle_names->push_back(ASCIIToUTF16(names[i].middle)); 7953d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr last_names->push_back(ASCIIToUTF16(names[i].last)); 804162de350edeb4aa09c508e5a39ac5fa20d8d619jvr } 814162de350edeb4aa09c508e5a39ac5fa20d8d619jvr} 8253d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr 8353d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr} // namespace 844162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 854162de350edeb4aa09c508e5a39ac5fa20d8d619jvr// Tests different possibilities for summary string generation. 8653d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr// Based on existence of first name, last name, and address line 1. 874162de350edeb4aa09c508e5a39ac5fa20d8d619jvrTEST(AutofillProfileTest, PreviewSummaryString) { 884162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 0/null: "" 894162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile0(base::GenerateGUID(), "https://www.example.com/"); 904162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Empty profile - nothing to update. 914162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary0 = GetLabel(&profile0); 924162de350edeb4aa09c508e5a39ac5fa20d8d619jvr EXPECT_EQ(base::string16(), summary0); 934162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 944162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 0a/empty name and address, so the first two fields of the rest of the 954162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // data is used: "Hollywood, CA" 964162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile00(base::GenerateGUID(), "https://www.example.com/"); 974162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile00, "", "", "", 9853d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr "johnwayne@me.xyz", "Fox", "", "", "Hollywood", "CA", "91601", "US", 994162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "16505678910"); 1004162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary00 = GetLabel(&profile00); 10132c10eecffb4923e0721c395e4b80fb732543f18Behdad Esfahbod EXPECT_EQ(ASCIIToUTF16("Hollywood, CA"), summary00); 1024162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1034162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 1: "<address>" without line 2. 1044162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile1(base::GenerateGUID(), "https://www.example.com/"); 1054162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile1, "", "", "", 1064162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "johnwayne@me.xyz", "Fox", "123 Zoo St.", "", "Hollywood", "CA", 1074162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "91601", "US", "16505678910"); 1084162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary1 = GetLabel(&profile1); 1094162de350edeb4aa09c508e5a39ac5fa20d8d619jvr EXPECT_EQ(ASCIIToUTF16("123 Zoo St., Hollywood"), summary1); 1104162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1114162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 1a: "<address>" with line 2. 1124162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile1a(base::GenerateGUID(), "https://www.example.com/"); 1134162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile1a, "", "", "", 1144162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA", 1154162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "91601", "US", "16505678910"); 1164162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary1a = GetLabel(&profile1a); 1174162de350edeb4aa09c508e5a39ac5fa20d8d619jvr EXPECT_EQ(ASCIIToUTF16("123 Zoo St., unit 5"), summary1a); 1184162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1194162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 2: "<lastname>" 12053d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr AutofillProfile profile2(base::GenerateGUID(), "https://www.example.com/"); 1214162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile2, "", "Mitchell", 1224162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Morrison", "johnwayne@me.xyz", "Fox", "", "", "Hollywood", "CA", 1234162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "91601", "US", "16505678910"); 1244162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary2 = GetLabel(&profile2); 125ac1b4359467ca3deab03186a15eae1d55eb35567Behdad Esfahbod // Summary includes full name, to the maximal extent available. 12605e2541b49e530a3771b5ec14eee5f956308506ajvr EXPECT_EQ(ASCIIToUTF16("Mitchell Morrison, Hollywood"), summary2); 1274162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1284162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 3: "<lastname>, <address>" 1294162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile3(base::GenerateGUID(), "https://www.example.com/"); 1304162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile3, "", "Mitchell", 1314162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Morrison", "johnwayne@me.xyz", "Fox", "123 Zoo St.", "", 1324162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Hollywood", "CA", "91601", "US", "16505678910"); 1334162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary3 = GetLabel(&profile3); 13453d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr EXPECT_EQ(ASCIIToUTF16("Mitchell Morrison, 123 Zoo St."), summary3); 1354162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1364162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 4: "<firstname>" 1374162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile4(base::GenerateGUID(), "https://www.example.com/"); 1384162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile4, "Marion", "Mitchell", "", 1394162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "johnwayne@me.xyz", "Fox", "", "", "Hollywood", "CA", "91601", "US", 1404162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "16505678910"); 1414162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary4 = GetLabel(&profile4); 1424162de350edeb4aa09c508e5a39ac5fa20d8d619jvr EXPECT_EQ(ASCIIToUTF16("Marion Mitchell, Hollywood"), summary4); 1434162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1444162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 5: "<firstname>, <address>" 1454162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile5(base::GenerateGUID(), "https://www.example.com/"); 1464162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile5, "Marion", "Mitchell", "", 1474162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA", 1484162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "91601", "US", "16505678910"); 1494162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary5 = GetLabel(&profile5); 1504162de350edeb4aa09c508e5a39ac5fa20d8d619jvr EXPECT_EQ(ASCIIToUTF16("Marion Mitchell, 123 Zoo St."), summary5); 1514162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1524162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 6: "<firstname> <lastname>" 1534162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile6(base::GenerateGUID(), "https://www.example.com/"); 1544162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile6, "Marion", "Mitchell", 1554162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Morrison", "johnwayne@me.xyz", "Fox", "", "", "Hollywood", "CA", 1564162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "91601", "US", "16505678910"); 1574162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary6 = GetLabel(&profile6); 1584162de350edeb4aa09c508e5a39ac5fa20d8d619jvr EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison, Hollywood"), 1594162de350edeb4aa09c508e5a39ac5fa20d8d619jvr summary6); 1604162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1614162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 7: "<firstname> <lastname>, <address>" 1624162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile7(base::GenerateGUID(), "https://www.example.com/"); 1634162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile7, "Marion", "Mitchell", 1644162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Morrison", "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", 1654162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Hollywood", "CA", "91601", "US", "16505678910"); 1664162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary7 = GetLabel(&profile7); 1674162de350edeb4aa09c508e5a39ac5fa20d8d619jvr EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison, 123 Zoo St."), summary7); 1684162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1694162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // Case 7a: "<firstname> <lastname>, <address>" - same as #7, except for 1704162de350edeb4aa09c508e5a39ac5fa20d8d619jvr // e-mail. 1714162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile profile7a(base::GenerateGUID(), "https://www.example.com/"); 1724162de350edeb4aa09c508e5a39ac5fa20d8d619jvr test::SetProfileInfo(&profile7a, "Marion", "Mitchell", 1734162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Morrison", "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5", 1744162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Hollywood", "CA", "91601", "US", "16505678910"); 1754162de350edeb4aa09c508e5a39ac5fa20d8d619jvr std::vector<AutofillProfile*> profiles; 1764162de350edeb4aa09c508e5a39ac5fa20d8d619jvr profiles.push_back(&profile7); 1774162de350edeb4aa09c508e5a39ac5fa20d8d619jvr profiles.push_back(&profile7a); 1784162de350edeb4aa09c508e5a39ac5fa20d8d619jvr std::vector<base::string16> labels; 1794162de350edeb4aa09c508e5a39ac5fa20d8d619jvr AutofillProfile::CreateDifferentiatingLabels(profiles, &labels); 180ac1b4359467ca3deab03186a15eae1d55eb35567Behdad Esfahbod ASSERT_EQ(profiles.size(), labels.size()); 18105e2541b49e530a3771b5ec14eee5f956308506ajvr summary7 = labels[0]; 1824162de350edeb4aa09c508e5a39ac5fa20d8d619jvr base::string16 summary7a = labels[1]; 1834162de350edeb4aa09c508e5a39ac5fa20d8d619jvr EXPECT_EQ(ASCIIToUTF16( 1844162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Marion Mitchell Morrison, 123 Zoo St., johnwayne@me.xyz"), summary7); 18553d7523c1c36caf25e72c7a4ab0f9d18d594b895jvr EXPECT_EQ(ASCIIToUTF16( 1864162de350edeb4aa09c508e5a39ac5fa20d8d619jvr "Marion Mitchell Morrison, 123 Zoo St., marion@me.xyz"), summary7a); 1874162de350edeb4aa09c508e5a39ac5fa20d8d619jvr} 1884162de350edeb4aa09c508e5a39ac5fa20d8d619jvr 1894162de350edeb4aa09c508e5a39ac5fa20d8d619jvrTEST(AutofillProfileTest, AdjustInferredLabels) { 1903a98ae5baf9ebff980f02eacb4ce8509503824a2jvr ScopedVector<AutofillProfile> profiles; 1913a98ae5baf9ebff980f02eacb4ce8509503824a2jvr profiles.push_back( 192 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 193 test::SetProfileInfo( 194 profiles[0], 195 "John", 196 "", 197 "Doe", 198 "johndoe@hades.com", 199 "Underworld", 200 "666 Erebus St.", 201 "", 202 "Elysium", "CA", 203 "91111", 204 "US", 205 "16502111111"); 206 profiles.push_back( 207 new AutofillProfile(base::GenerateGUID(), "http://www.example.com/")); 208 test::SetProfileInfo( 209 profiles[1], 210 "Jane", 211 "", 212 "Doe", 213 "janedoe@tertium.com", 214 "Pluto Inc.", 215 "123 Letha Shore.", 216 "", 217 "Dis", "CA", 218 "91222", 219 "US", 220 "12345678910"); 221 std::vector<base::string16> labels; 222 AutofillProfile::CreateDifferentiatingLabels(profiles.get(), &labels); 223 ASSERT_EQ(2U, labels.size()); 224 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St."), labels[0]); 225 EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]); 226 227 profiles.push_back( 228 new AutofillProfile(base::GenerateGUID(), "Chrome settings")); 229 test::SetProfileInfo( 230 profiles[2], 231 "John", 232 "", 233 "Doe", 234 "johndoe@tertium.com", 235 "Underworld", 236 "666 Erebus St.", 237 "", 238 "Elysium", "CA", 239 "91111", 240 "US", 241 "16502111111"); 242 labels.clear(); 243 AutofillProfile::CreateDifferentiatingLabels(profiles.get(), &labels); 244 245 // Profile 0 and 2 inferred label now includes an e-mail. 246 ASSERT_EQ(3U, labels.size()); 247 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@hades.com"), 248 labels[0]); 249 EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]); 250 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., johndoe@tertium.com"), 251 labels[2]); 252 253 profiles.resize(2); 254 255 profiles.push_back( 256 new AutofillProfile(base::GenerateGUID(), std::string())); 257 test::SetProfileInfo( 258 profiles[2], 259 "John", 260 "", 261 "Doe", 262 "johndoe@hades.com", 263 "Underworld", 264 "666 Erebus St.", 265 "", 266 "Elysium", "CO", // State is different 267 "91111", 268 "US", 269 "16502111111"); 270 271 labels.clear(); 272 AutofillProfile::CreateDifferentiatingLabels(profiles.get(), &labels); 273 274 // Profile 0 and 2 inferred label now includes a state. 275 ASSERT_EQ(3U, labels.size()); 276 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CA"), labels[0]); 277 EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]); 278 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO"), labels[2]); 279 280 profiles.push_back( 281 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 282 test::SetProfileInfo( 283 profiles[3], 284 "John", 285 "", 286 "Doe", 287 "johndoe@hades.com", 288 "Underworld", 289 "666 Erebus St.", 290 "", 291 "Elysium", "CO", // State is different for some. 292 "91111", 293 "US", 294 "16504444444"); // Phone is different for some. 295 296 labels.clear(); 297 AutofillProfile::CreateDifferentiatingLabels(profiles.get(), &labels); 298 ASSERT_EQ(4U, labels.size()); 299 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CA"), labels[0]); 300 EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]); 301 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, 16502111111"), 302 labels[2]); 303 // This one differs from other ones by unique phone, so no need for extra 304 // information. 305 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, 16504444444"), 306 labels[3]); 307 308 profiles.push_back( 309 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 310 test::SetProfileInfo( 311 profiles[4], 312 "John", 313 "", 314 "Doe", 315 "johndoe@styx.com", // E-Mail is different for some. 316 "Underworld", 317 "666 Erebus St.", 318 "", 319 "Elysium", "CO", // State is different for some. 320 "91111", 321 "US", 322 "16504444444"); // Phone is different for some. 323 324 labels.clear(); 325 AutofillProfile::CreateDifferentiatingLabels(profiles.get(), &labels); 326 ASSERT_EQ(5U, labels.size()); 327 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CA"), labels[0]); 328 EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]); 329 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, johndoe@hades.com," 330 " 16502111111"), labels[2]); 331 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, johndoe@hades.com," 332 " 16504444444"), labels[3]); 333 // This one differs from other ones by unique e-mail, so no need for extra 334 // information. 335 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., CO, johndoe@styx.com"), 336 labels[4]); 337} 338 339TEST(AutofillProfileTest, CreateInferredLabels) { 340 ScopedVector<AutofillProfile> profiles; 341 profiles.push_back( 342 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 343 test::SetProfileInfo(profiles[0], 344 "John", 345 "", 346 "Doe", 347 "johndoe@hades.com", 348 "Underworld", 349 "666 Erebus St.", 350 "", 351 "Elysium", "CA", 352 "91111", 353 "US", 354 "16502111111"); 355 profiles.push_back( 356 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 357 test::SetProfileInfo(profiles[1], 358 "Jane", 359 "", 360 "Doe", 361 "janedoe@tertium.com", 362 "Pluto Inc.", 363 "123 Letha Shore.", 364 "", 365 "Dis", "CA", 366 "91222", 367 "US", 368 "12345678910"); 369 std::vector<base::string16> labels; 370 // Two fields at least - no filter. 371 AutofillProfile::CreateInferredLabels(profiles.get(), NULL, UNKNOWN_TYPE, 2, 372 &labels); 373 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St."), labels[0]); 374 EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore."), labels[1]); 375 376 // Three fields at least - no filter. 377 AutofillProfile::CreateInferredLabels(profiles.get(), NULL, UNKNOWN_TYPE, 3, 378 &labels); 379 EXPECT_EQ(ASCIIToUTF16("John Doe, 666 Erebus St., Elysium"), 380 labels[0]); 381 EXPECT_EQ(ASCIIToUTF16("Jane Doe, 123 Letha Shore., Dis"), 382 labels[1]); 383 384 std::vector<ServerFieldType> suggested_fields; 385 suggested_fields.push_back(ADDRESS_HOME_CITY); 386 suggested_fields.push_back(ADDRESS_HOME_STATE); 387 suggested_fields.push_back(ADDRESS_HOME_ZIP); 388 389 // Two fields at least, from suggested fields - no filter. 390 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 391 UNKNOWN_TYPE, 2, &labels); 392 EXPECT_EQ(ASCIIToUTF16("Elysium, CA"), labels[0]); 393 EXPECT_EQ(ASCIIToUTF16("Dis, CA"), labels[1]); 394 395 // Three fields at least, from suggested fields - no filter. 396 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 397 UNKNOWN_TYPE, 3, &labels); 398 EXPECT_EQ(ASCIIToUTF16("Elysium, CA, 91111"), labels[0]); 399 EXPECT_EQ(ASCIIToUTF16("Dis, CA, 91222"), labels[1]); 400 401 // Three fields at least, from suggested fields - but filter reduces available 402 // fields to two. 403 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 404 ADDRESS_HOME_STATE, 3, &labels); 405 EXPECT_EQ(ASCIIToUTF16("Elysium, 91111"), labels[0]); 406 EXPECT_EQ(ASCIIToUTF16("Dis, 91222"), labels[1]); 407 408 suggested_fields.clear(); 409 // In our implementation we always display NAME_FULL for all NAME* fields... 410 suggested_fields.push_back(NAME_MIDDLE); 411 // One field at least, from suggested fields - no filter. 412 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 413 UNKNOWN_TYPE, 1, &labels); 414 EXPECT_EQ(ASCIIToUTF16("John Doe"), labels[0]); 415 EXPECT_EQ(ASCIIToUTF16("Jane Doe"), labels[1]); 416 417 // One field at least, from suggested fields - filter the same as suggested 418 // field. 419 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 420 NAME_MIDDLE, 1, &labels); 421 EXPECT_EQ(base::string16(), labels[0]); 422 EXPECT_EQ(base::string16(), labels[1]); 423 424 suggested_fields.clear(); 425 // In our implementation we always display NAME_FULL for NAME_MIDDLE_INITIAL 426 suggested_fields.push_back(NAME_MIDDLE_INITIAL); 427 // One field at least, from suggested fields - no filter. 428 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 429 UNKNOWN_TYPE, 1, &labels); 430 EXPECT_EQ(ASCIIToUTF16("John Doe"), labels[0]); 431 EXPECT_EQ(ASCIIToUTF16("Jane Doe"), labels[1]); 432 433 // One field at least, from suggested fields - filter same as the first non- 434 // unknown suggested field. 435 suggested_fields.clear(); 436 suggested_fields.push_back(UNKNOWN_TYPE); 437 suggested_fields.push_back(NAME_FULL); 438 suggested_fields.push_back(ADDRESS_HOME_LINE1); 439 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 440 NAME_FULL, 1, &labels); 441 EXPECT_EQ(base::string16(ASCIIToUTF16("666 Erebus St.")), labels[0]); 442 EXPECT_EQ(base::string16(ASCIIToUTF16("123 Letha Shore.")), labels[1]); 443} 444 445// Test that we fall back to using the full name if there are no other 446// distinguishing fields, but only if it makes sense given the suggested fields. 447TEST(AutofillProfileTest, CreateInferredLabelsFallsBackToFullName) { 448 ScopedVector<AutofillProfile> profiles; 449 profiles.push_back( 450 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 451 test::SetProfileInfo(profiles[0], 452 "John", "", "Doe", "doe@example.com", "", 453 "88 Nowhere Ave.", "", "", "", "", "", ""); 454 profiles.push_back( 455 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 456 test::SetProfileInfo(profiles[1], 457 "Johnny", "K", "Doe", "doe@example.com", "", 458 "88 Nowhere Ave.", "", "", "", "", "", ""); 459 460 // If the only name field in the suggested fields is the excluded field, we 461 // should not fall back to the full name as a distinguishing field. 462 std::vector<ServerFieldType> suggested_fields; 463 suggested_fields.push_back(NAME_LAST); 464 suggested_fields.push_back(ADDRESS_HOME_LINE1); 465 suggested_fields.push_back(EMAIL_ADDRESS); 466 std::vector<base::string16> labels; 467 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 468 NAME_LAST, 1, &labels); 469 ASSERT_EQ(2U, labels.size()); 470 EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave."), labels[0]); 471 EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave."), labels[1]); 472 473 // Otherwise, we should. 474 suggested_fields.push_back(NAME_FIRST); 475 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 476 NAME_LAST, 1, &labels); 477 ASSERT_EQ(2U, labels.size()); 478 EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., John Doe"), labels[0]); 479 EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., Johnny K Doe"), labels[1]); 480} 481 482// Test that we do not show duplicate fields in the labels. 483TEST(AutofillProfileTest, CreateInferredLabelsNoDuplicatedFields) { 484 ScopedVector<AutofillProfile> profiles; 485 profiles.push_back( 486 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 487 test::SetProfileInfo(profiles[0], 488 "John", "", "Doe", "doe@example.com", "", 489 "88 Nowhere Ave.", "", "", "", "", "", ""); 490 profiles.push_back( 491 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 492 test::SetProfileInfo(profiles[1], 493 "John", "", "Doe", "dojo@example.com", "", 494 "88 Nowhere Ave.", "", "", "", "", "", ""); 495 496 // If the only name field in the suggested fields is the excluded field, we 497 // should not fall back to the full name as a distinguishing field. 498 std::vector<ServerFieldType> suggested_fields; 499 suggested_fields.push_back(ADDRESS_HOME_LINE1); 500 suggested_fields.push_back(ADDRESS_BILLING_LINE1); 501 suggested_fields.push_back(EMAIL_ADDRESS); 502 std::vector<base::string16> labels; 503 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 504 UNKNOWN_TYPE, 2, &labels); 505 ASSERT_EQ(2U, labels.size()); 506 EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., doe@example.com"), labels[0]); 507 EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., dojo@example.com"), labels[1]); 508} 509 510// Make sure that empty fields are not treated as distinguishing fields. 511TEST(AutofillProfileTest, CreateInferredLabelsSkipsEmptyFields) { 512 ScopedVector<AutofillProfile> profiles; 513 profiles.push_back( 514 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 515 test::SetProfileInfo(profiles[0], 516 "John", "", "Doe", "doe@example.com", 517 "Gogole", "", "", "", "", "", "", ""); 518 profiles.push_back( 519 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 520 test::SetProfileInfo(profiles[1], 521 "John", "", "Doe", "doe@example.com", 522 "Ggoole", "", "", "", "", "", "", ""); 523 profiles.push_back( 524 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 525 test::SetProfileInfo(profiles[2], 526 "John", "", "Doe", "john.doe@example.com", 527 "Goolge", "", "", "", "", "", "", ""); 528 529 std::vector<base::string16> labels; 530 AutofillProfile::CreateInferredLabels(profiles.get(), NULL, UNKNOWN_TYPE, 3, 531 &labels); 532 ASSERT_EQ(3U, labels.size()); 533 EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Gogole"), labels[0]); 534 EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Ggoole"), labels[1]); 535 EXPECT_EQ(ASCIIToUTF16("John Doe, john.doe@example.com, Goolge"), labels[2]); 536 537 // A field must have a non-empty value for each profile to be considered a 538 // distinguishing field. 539 profiles[1]->SetRawInfo(ADDRESS_HOME_LINE1, ASCIIToUTF16("88 Nowhere Ave.")); 540 AutofillProfile::CreateInferredLabels(profiles.get(), NULL, UNKNOWN_TYPE, 1, 541 &labels); 542 ASSERT_EQ(3U, labels.size()); 543 EXPECT_EQ(ASCIIToUTF16("John Doe, doe@example.com, Gogole"), labels[0]); 544 EXPECT_EQ(ASCIIToUTF16("John Doe, 88 Nowhere Ave., doe@example.com, Ggoole"), 545 labels[1]) << labels[1]; 546 EXPECT_EQ(ASCIIToUTF16("John Doe, john.doe@example.com"), labels[2]); 547} 548 549// Test that labels that would otherwise have multiline values are flattened. 550TEST(AutofillProfileTest, CreateInferredLabelsFlattensMultiLineValues) { 551 ScopedVector<AutofillProfile> profiles; 552 profiles.push_back( 553 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 554 test::SetProfileInfo(profiles[0], 555 "John", "", "Doe", "doe@example.com", "", 556 "88 Nowhere Ave.", "Apt. 42", "", "", "", "", ""); 557 558 // If the only name field in the suggested fields is the excluded field, we 559 // should not fall back to the full name as a distinguishing field. 560 std::vector<ServerFieldType> suggested_fields; 561 suggested_fields.push_back(NAME_FULL); 562 suggested_fields.push_back(ADDRESS_HOME_STREET_ADDRESS); 563 std::vector<base::string16> labels; 564 AutofillProfile::CreateInferredLabels(profiles.get(), &suggested_fields, 565 NAME_FULL, 1, &labels); 566 ASSERT_EQ(1U, labels.size()); 567 EXPECT_EQ(ASCIIToUTF16("88 Nowhere Ave., Apt. 42"), labels[0]); 568} 569 570TEST(AutofillProfileTest, IsSubsetOf) { 571 scoped_ptr<AutofillProfile> a, b; 572 573 // |a| is a subset of |b|. 574 a.reset( 575 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 576 b.reset( 577 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 578 test::SetProfileInfo(a.get(), "Thomas", NULL, "Jefferson", 579 "declaration_guy@gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 580 NULL); 581 test::SetProfileInfo(b.get(), "Thomas", NULL, "Jefferson", 582 "declaration_guy@gmail.com", "United States Government", "Monticello", 583 NULL, "Charlottesville", "Virginia", "22902", NULL, NULL); 584 EXPECT_TRUE(a->IsSubsetOf(*b, "en-US")); 585 586 // |b| is not a subset of |a|. 587 EXPECT_FALSE(b->IsSubsetOf(*a, "en-US")); 588 589 // |a| is a subset of |a|. 590 EXPECT_TRUE(a->IsSubsetOf(*a, "en-US")); 591 592 // One field in |b| is different. 593 a.reset( 594 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 595 b.reset( 596 new AutofillProfile(base::GenerateGUID(), "https://www.example.com/")); 597 test::SetProfileInfo(a.get(), "Thomas", NULL, "Jefferson", 598 "declaration_guy@gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 599 NULL); 600 test::SetProfileInfo(a.get(), "Thomas", NULL, "Adams", 601 "declaration_guy@gmail.com", NULL, NULL, NULL, NULL, NULL, NULL, NULL, 602 NULL); 603 EXPECT_FALSE(a->IsSubsetOf(*b, "en-US")); 604} 605 606TEST(AutofillProfileTest, OverwriteWithOrAddTo) { 607 AutofillProfile a(base::GenerateGUID(), "https://www.example.com"); 608 test::SetProfileInfo(&a, "Marion", "Mitchell", "Morrison", 609 "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5", 610 "Hollywood", "CA", "91601", "US", 611 "12345678910"); 612 std::vector<base::string16> names; 613 a.GetRawMultiInfo(NAME_FULL, &names); 614 names.push_back(ASCIIToUTF16("Marion Morrison")); 615 a.SetRawMultiInfo(NAME_FULL, names); 616 617 // Create an identical profile except that the new profile: 618 // (1) Has a different origin, 619 // (2) Has a different address line 2, 620 // (3) Lacks a company name, 621 // (4) Has a different full name variant, and 622 // (5) Has a language code. 623 AutofillProfile b = a; 624 b.set_guid(base::GenerateGUID()); 625 b.set_origin("Chrome settings"); 626 b.SetRawInfo(ADDRESS_HOME_LINE2, ASCIIToUTF16("area 51")); 627 b.SetRawInfo(COMPANY_NAME, base::string16()); 628 b.GetRawMultiInfo(NAME_FULL, &names); 629 names.push_back(ASCIIToUTF16("Marion M. Morrison")); 630 b.SetRawMultiInfo(NAME_FULL, names); 631 b.set_language_code("en"); 632 633 a.OverwriteWithOrAddTo(b, "en-US"); 634 EXPECT_EQ("Chrome settings", a.origin()); 635 EXPECT_EQ(ASCIIToUTF16("area 51"), a.GetRawInfo(ADDRESS_HOME_LINE2)); 636 EXPECT_EQ(ASCIIToUTF16("Fox"), a.GetRawInfo(COMPANY_NAME)); 637 a.GetRawMultiInfo(NAME_FULL, &names); 638 ASSERT_EQ(3U, names.size()); 639 EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison"), names[0]); 640 EXPECT_EQ(ASCIIToUTF16("Marion Morrison"), names[1]); 641 EXPECT_EQ(ASCIIToUTF16("Marion M. Morrison"), names[2]); 642 EXPECT_EQ("en", a.language_code()); 643} 644 645TEST(AutofillProfileTest, AssignmentOperator) { 646 AutofillProfile a(base::GenerateGUID(), "https://www.example.com/"); 647 test::SetProfileInfo(&a, "Marion", "Mitchell", "Morrison", 648 "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5", 649 "Hollywood", "CA", "91601", "US", 650 "12345678910"); 651 652 // Result of assignment should be logically equal to the original profile. 653 AutofillProfile b(base::GenerateGUID(), "http://www.example.com/"); 654 b = a; 655 EXPECT_TRUE(a == b); 656 657 // Assignment to self should not change the profile value. 658 a = a; 659 EXPECT_TRUE(a == b); 660} 661 662TEST(AutofillProfileTest, Copy) { 663 AutofillProfile a(base::GenerateGUID(), "https://www.example.com/"); 664 test::SetProfileInfo(&a, "Marion", "Mitchell", "Morrison", 665 "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5", 666 "Hollywood", "CA", "91601", "US", 667 "12345678910"); 668 669 // Clone should be logically equal to the original. 670 AutofillProfile b(a); 671 EXPECT_TRUE(a == b); 672} 673 674TEST(AutofillProfileTest, Compare) { 675 AutofillProfile a(base::GenerateGUID(), std::string()); 676 AutofillProfile b(base::GenerateGUID(), std::string()); 677 678 // Empty profiles are the same. 679 EXPECT_EQ(0, a.Compare(b)); 680 681 // GUIDs don't count. 682 a.set_guid(base::GenerateGUID()); 683 b.set_guid(base::GenerateGUID()); 684 EXPECT_EQ(0, a.Compare(b)); 685 686 // Origins don't count. 687 a.set_origin("apple"); 688 b.set_origin("banana"); 689 EXPECT_EQ(0, a.Compare(b)); 690 691 // Different values produce non-zero results. 692 test::SetProfileInfo(&a, "Jimmy", NULL, NULL, NULL, 693 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 694 test::SetProfileInfo(&b, "Ringo", NULL, NULL, NULL, 695 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 696 EXPECT_GT(0, a.Compare(b)); 697 EXPECT_LT(0, b.Compare(a)); 698 699 // Phone numbers are compared by the full number, including the area code. 700 // This is a regression test for http://crbug.com/163024 701 test::SetProfileInfo(&a, NULL, NULL, NULL, NULL, 702 NULL, NULL, NULL, NULL, NULL, NULL, NULL, "650.555.4321"); 703 test::SetProfileInfo(&b, NULL, NULL, NULL, NULL, 704 NULL, NULL, NULL, NULL, NULL, NULL, NULL, "408.555.4321"); 705 EXPECT_GT(0, a.Compare(b)); 706 EXPECT_LT(0, b.Compare(a)); 707 708 // Addresses are compared in full. Regression test for http://crbug.com/375545 709 test::SetProfileInfo(&a, "John", NULL, NULL, NULL, 710 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 711 a.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, 712 ASCIIToUTF16("line one\nline two")); 713 test::SetProfileInfo(&b, "John", NULL, NULL, NULL, 714 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); 715 b.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, 716 ASCIIToUTF16("line one\nline two\nline three")); 717 EXPECT_GT(0, a.Compare(b)); 718 EXPECT_LT(0, b.Compare(a)); 719} 720 721TEST(AutofillProfileTest, MultiValueNames) { 722 AutofillProfile p(base::GenerateGUID(), "https://www.example.com/"); 723 const base::string16 kJohnDoe(ASCIIToUTF16("John Doe")); 724 const base::string16 kJohnPDoe(ASCIIToUTF16("John P. Doe")); 725 std::vector<base::string16> set_values; 726 set_values.push_back(kJohnDoe); 727 set_values.push_back(kJohnPDoe); 728 p.SetRawMultiInfo(NAME_FULL, set_values); 729 730 // Expect regular |GetInfo| returns the first element. 731 EXPECT_EQ(kJohnDoe, p.GetRawInfo(NAME_FULL)); 732 733 // Ensure that we get out what we put in. 734 std::vector<base::string16> get_values; 735 p.GetRawMultiInfo(NAME_FULL, &get_values); 736 ASSERT_EQ(2UL, get_values.size()); 737 EXPECT_EQ(kJohnDoe, get_values[0]); 738 EXPECT_EQ(kJohnPDoe, get_values[1]); 739 740 // Update the values. 741 AutofillProfile p2 = p; 742 EXPECT_EQ(0, p.Compare(p2)); 743 const base::string16 kNoOne(ASCIIToUTF16("No One")); 744 set_values[1] = kNoOne; 745 p.SetRawMultiInfo(NAME_FULL, set_values); 746 p.GetRawMultiInfo(NAME_FULL, &get_values); 747 ASSERT_EQ(2UL, get_values.size()); 748 EXPECT_EQ(kJohnDoe, get_values[0]); 749 EXPECT_EQ(kNoOne, get_values[1]); 750 EXPECT_NE(0, p.Compare(p2)); 751 752 // Delete values. 753 set_values.clear(); 754 p.SetRawMultiInfo(NAME_FULL, set_values); 755 p.GetRawMultiInfo(NAME_FULL, &get_values); 756 ASSERT_EQ(1UL, get_values.size()); 757 EXPECT_EQ(base::string16(), get_values[0]); 758 759 // Expect regular |GetInfo| returns empty value. 760 EXPECT_EQ(base::string16(), p.GetRawInfo(NAME_FULL)); 761} 762 763TEST(AutofillProfileTest, MultiValueEmails) { 764 AutofillProfile p(base::GenerateGUID(), "https://www.example.com/"); 765 const base::string16 kJohnDoe(ASCIIToUTF16("john@doe.com")); 766 const base::string16 kJohnPDoe(ASCIIToUTF16("john_p@doe.com")); 767 std::vector<base::string16> set_values; 768 set_values.push_back(kJohnDoe); 769 set_values.push_back(kJohnPDoe); 770 p.SetRawMultiInfo(EMAIL_ADDRESS, set_values); 771 772 // Expect regular |GetInfo| returns the first element. 773 EXPECT_EQ(kJohnDoe, p.GetRawInfo(EMAIL_ADDRESS)); 774 775 // Ensure that we get out what we put in. 776 std::vector<base::string16> get_values; 777 p.GetRawMultiInfo(EMAIL_ADDRESS, &get_values); 778 ASSERT_EQ(2UL, get_values.size()); 779 EXPECT_EQ(kJohnDoe, get_values[0]); 780 EXPECT_EQ(kJohnPDoe, get_values[1]); 781 782 // Update the values. 783 AutofillProfile p2 = p; 784 EXPECT_EQ(0, p.Compare(p2)); 785 const base::string16 kNoOne(ASCIIToUTF16("no@one.com")); 786 set_values[1] = kNoOne; 787 p.SetRawMultiInfo(EMAIL_ADDRESS, set_values); 788 p.GetRawMultiInfo(EMAIL_ADDRESS, &get_values); 789 ASSERT_EQ(2UL, get_values.size()); 790 EXPECT_EQ(kJohnDoe, get_values[0]); 791 EXPECT_EQ(kNoOne, get_values[1]); 792 EXPECT_NE(0, p.Compare(p2)); 793 794 // Delete values. 795 set_values.clear(); 796 p.SetRawMultiInfo(EMAIL_ADDRESS, set_values); 797 p.GetRawMultiInfo(EMAIL_ADDRESS, &get_values); 798 ASSERT_EQ(1UL, get_values.size()); 799 EXPECT_EQ(base::string16(), get_values[0]); 800 801 // Expect regular |GetInfo| returns empty value. 802 EXPECT_EQ(base::string16(), p.GetRawInfo(EMAIL_ADDRESS)); 803} 804 805TEST(AutofillProfileTest, MultiValuePhone) { 806 AutofillProfile p(base::GenerateGUID(), "https://www.example.com/"); 807 const base::string16 kJohnDoe(ASCIIToUTF16("4151112222")); 808 const base::string16 kJohnPDoe(ASCIIToUTF16("4151113333")); 809 std::vector<base::string16> set_values; 810 set_values.push_back(kJohnDoe); 811 set_values.push_back(kJohnPDoe); 812 p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values); 813 814 // Expect regular |GetInfo| returns the first element. 815 EXPECT_EQ(kJohnDoe, p.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); 816 817 // Ensure that we get out what we put in. 818 std::vector<base::string16> get_values; 819 p.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &get_values); 820 ASSERT_EQ(2UL, get_values.size()); 821 EXPECT_EQ(kJohnDoe, get_values[0]); 822 EXPECT_EQ(kJohnPDoe, get_values[1]); 823 824 // Update the values. 825 AutofillProfile p2 = p; 826 EXPECT_EQ(0, p.Compare(p2)); 827 const base::string16 kNoOne(ASCIIToUTF16("4152110000")); 828 set_values[1] = kNoOne; 829 p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values); 830 p.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &get_values); 831 ASSERT_EQ(2UL, get_values.size()); 832 EXPECT_EQ(kJohnDoe, get_values[0]); 833 EXPECT_EQ(kNoOne, get_values[1]); 834 EXPECT_NE(0, p.Compare(p2)); 835 836 // Delete values. 837 set_values.clear(); 838 p.SetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, set_values); 839 p.GetRawMultiInfo(PHONE_HOME_WHOLE_NUMBER, &get_values); 840 ASSERT_EQ(1UL, get_values.size()); 841 EXPECT_EQ(base::string16(), get_values[0]); 842 843 // Expect regular |GetInfo| returns empty value. 844 EXPECT_EQ(base::string16(), p.GetRawInfo(PHONE_HOME_WHOLE_NUMBER)); 845} 846 847TEST(AutofillProfileTest, IsPresentButInvalid) { 848 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com/"); 849 EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE)); 850 EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP)); 851 EXPECT_FALSE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER)); 852 853 profile.SetRawInfo(ADDRESS_HOME_COUNTRY, ASCIIToUTF16("US")); 854 EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE)); 855 EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP)); 856 EXPECT_FALSE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER)); 857 858 profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("C")); 859 EXPECT_TRUE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE)); 860 861 profile.SetRawInfo(ADDRESS_HOME_STATE, ASCIIToUTF16("CA")); 862 EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_STATE)); 863 864 profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90")); 865 EXPECT_TRUE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP)); 866 867 profile.SetRawInfo(ADDRESS_HOME_ZIP, ASCIIToUTF16("90210")); 868 EXPECT_FALSE(profile.IsPresentButInvalid(ADDRESS_HOME_ZIP)); 869 870 profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("310")); 871 EXPECT_TRUE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER)); 872 873 profile.SetRawInfo(PHONE_HOME_WHOLE_NUMBER, ASCIIToUTF16("(310) 310-6000")); 874 EXPECT_FALSE(profile.IsPresentButInvalid(PHONE_HOME_WHOLE_NUMBER)); 875} 876 877TEST(AutofillProfileTest, SetRawInfoPreservesLineBreaks) { 878 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com/"); 879 880 profile.SetRawInfo(ADDRESS_HOME_STREET_ADDRESS, 881 ASCIIToUTF16("123 Super St.\n" 882 "Apt. #42")); 883 EXPECT_EQ(ASCIIToUTF16("123 Super St.\n" 884 "Apt. #42"), 885 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 886} 887 888TEST(AutofillProfileTest, SetInfoPreservesLineBreaks) { 889 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com/"); 890 891 profile.SetInfo(AutofillType(ADDRESS_HOME_STREET_ADDRESS), 892 ASCIIToUTF16("123 Super St.\n" 893 "Apt. #42"), 894 "en-US"); 895 EXPECT_EQ(ASCIIToUTF16("123 Super St.\n" 896 "Apt. #42"), 897 profile.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS)); 898} 899 900TEST(AutofillProfileTest, SetRawInfoDoesntTrimWhitespace) { 901 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com/"); 902 903 profile.SetRawInfo(EMAIL_ADDRESS, ASCIIToUTF16("\tuser@example.com ")); 904 EXPECT_EQ(ASCIIToUTF16("\tuser@example.com "), 905 profile.GetRawInfo(EMAIL_ADDRESS)); 906} 907 908TEST(AutofillProfileTest, SetInfoTrimsWhitespace) { 909 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com/"); 910 911 profile.SetInfo(AutofillType(EMAIL_ADDRESS), 912 ASCIIToUTF16("\tuser@example.com "), 913 "en-US"); 914 EXPECT_EQ(ASCIIToUTF16("user@example.com"), 915 profile.GetRawInfo(EMAIL_ADDRESS)); 916} 917 918TEST(AutofillProfileTest, FullAddress) { 919 AutofillProfile profile(base::GenerateGUID(), "https://www.example.com/"); 920 test::SetProfileInfo(&profile, "Marion", "Mitchell", "Morrison", 921 "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5", 922 "Hollywood", "CA", "91601", "US", 923 "12345678910"); 924 925 AutofillType full_address(HTML_TYPE_FULL_ADDRESS, HTML_MODE_NONE); 926 base::string16 formatted_address(ASCIIToUTF16( 927 "Marion Mitchell Morrison\n" 928 "123 Zoo St.\n" 929 "unit 5\n" 930 "Hollywood, CA 91601")); 931 EXPECT_EQ(formatted_address, profile.GetInfo(full_address, "en-US")); 932 // This should fail and leave the profile unchanged. 933 EXPECT_FALSE(profile.SetInfo(full_address, ASCIIToUTF16("foobar"), "en-US")); 934 EXPECT_EQ(formatted_address, profile.GetInfo(full_address, "en-US")); 935 936 // Some things can be missing... 937 profile.SetInfo(AutofillType(ADDRESS_HOME_LINE2), 938 base::string16(), 939 "en-US"); 940 profile.SetInfo(AutofillType(EMAIL_ADDRESS), 941 base::string16(), 942 "en-US"); 943 EXPECT_EQ(ASCIIToUTF16("Marion Mitchell Morrison\n" 944 "123 Zoo St.\n" 945 "Hollywood, CA 91601"), 946 profile.GetInfo(full_address, "en-US")); 947 948 // ...but nothing comes out if a required field is missing. 949 profile.SetInfo(AutofillType(ADDRESS_HOME_STATE), base::string16(), "en-US"); 950 EXPECT_TRUE(profile.GetInfo(full_address, "en-US").empty()); 951 952 // Restore the state but remove country. This should also fail. 953 profile.SetInfo(AutofillType(ADDRESS_HOME_STATE), 954 ASCIIToUTF16("CA"), 955 "en-US"); 956 EXPECT_FALSE(profile.GetInfo(full_address, "en-US").empty()); 957 profile.SetInfo(AutofillType(ADDRESS_HOME_COUNTRY), 958 base::string16(), 959 "en-US"); 960 EXPECT_TRUE(profile.GetInfo(full_address, "en-US").empty()); 961} 962 963TEST(AutofillProfileTest, OverwriteOrAppendNames) { 964 std::vector<TestCase> test_cases; 965 966 // Identical name. 967 test_cases.push_back(TestCase(NameParts("Marion", "Mitchell", "Morrison"), 968 NameParts("Marion", "Mitchell", "Morrison"), 969 NameParts("Marion", "Mitchell", "Morrison"))); 970 test_cases.push_back(TestCase(NameParts("Marion", "Mitchell", "Morrison"), 971 NameParts("MARION", "MITCHELL", "MORRISON"), 972 NameParts("Marion", "Mitchell", "Morrison"))); 973 974 // A parse that has a two-word last name should take precedence over a 975 // parse that assumes the two names are a middle and a last name. 976 test_cases.push_back(TestCase(NameParts("Marion", "Mitchell", "Morrison"), 977 NameParts("Marion", "", "Mitchell Morrison"), 978 NameParts("Marion", "", "Mitchell Morrison"))); 979 test_cases.push_back(TestCase(NameParts("Marion", "", "Mitchell Morrison"), 980 NameParts("Marion", "Mitchell", "Morrison"), 981 NameParts("Marion", "", "Mitchell Morrison"))); 982 983 // A parse that has a two-word first name should take precedence over a 984 // parse that assumes the two names are a first and a middle name. 985 test_cases.push_back(TestCase(NameParts("Marion", "Mitchell", "Morrison"), 986 NameParts("Marion Mitchell", "", "Morrison"), 987 NameParts("Marion Mitchell", "", "Morrison"))); 988 test_cases.push_back(TestCase(NameParts("Marion Mitchell", "", "Morrison"), 989 NameParts("Marion", "Mitchell", "Morrison"), 990 NameParts("Marion Mitchell", "", "Morrison"))); 991 992 // Two names that are identical in full, but not in parts: the parse that 993 // does *not* match the heuristic parse should be preferred. 994 test_cases.push_back( 995 TestCase(NameParts("Arthur", "Ignatius Conan", "Doyle"), 996 // Heurstic parse. 997 NameParts("Arthur Ignatius", "Conan", "Doyle"), 998 NameParts("Arthur", "Ignatius Conan", "Doyle"))); 999 test_cases.push_back( 1000 // Heuristic parse. 1001 TestCase(NameParts("Arthur Ignatius", "Conan", "Doyle"), 1002 NameParts("Arthur", "Ignatius Conan", "Doyle"), 1003 NameParts("Arthur", "Ignatius Conan", "Doyle"))); 1004 1005 // A parse that has a many-word first name and/or last name should take 1006 // precedence over a heuristically parsed name. 1007 test_cases.push_back( 1008 // Heuristic parse. 1009 TestCase(NameParts("Roberto Carlos da", "Silva", "Rocha"), 1010 NameParts("Roberto Carlos da Silva", "", "Rocha"), 1011 NameParts("Roberto Carlos da Silva", "", "Rocha"))); 1012 1013 // Cases where merging 2 profiles with same full names but 1014 // different canonical forms appends instead of overwrites, 1015 // provided they dont form heuristically parsed names. 1016 { 1017 NameParts name1("Marion Mitchell", "", "Morrison"); 1018 NameParts name2("Marion", "", "Mitchell Morrison"); 1019 std::vector<NameParts> starting_names(1, name1); 1020 std::vector<NameParts> additional_names(1, name2); 1021 std::vector<NameParts> expected_result; 1022 expected_result.push_back(name1); 1023 expected_result.push_back(name2); 1024 test_cases.push_back( 1025 TestCase(starting_names, additional_names, expected_result)); 1026 } 1027 1028 // Cases where the names do not have the same full name strings, 1029 // i.e. the list of merged names is longer than either of the incoming 1030 // lists. 1031 { 1032 NameParts name1("Antonio", "Augusto Ribeiro", "Reis Jr."); 1033 NameParts name2("Juninho", "", "Pernambucano"); 1034 NameParts name3("Marion", "Mitchell", "Morrison"); 1035 NameParts name4("Marion", "M.", "Morrison"); 1036 std::vector<NameParts> starting_names; 1037 std::vector<NameParts> additional_names; 1038 std::vector<NameParts> expected_result; 1039 starting_names.push_back(name1); 1040 starting_names.push_back(name2); 1041 additional_names.push_back(name3); 1042 additional_names.push_back(name4); 1043 expected_result.push_back(name1); 1044 expected_result.push_back(name2); 1045 expected_result.push_back(name3); 1046 expected_result.push_back(name4); 1047 test_cases.push_back( 1048 TestCase(starting_names, additional_names, expected_result)); 1049 } 1050 1051 for (std::vector<TestCase>::iterator it = test_cases.begin(); 1052 it != test_cases.end(); 1053 ++it) { 1054 TestCase current_case = *it; 1055 SCOPED_TRACE(current_case.starting_names[0].first + " + " + 1056 current_case.additional_names[0].first + " = " + 1057 current_case.expected_result[0].first); 1058 1059 std::vector<base::string16> first_names, middle_names, last_names; 1060 GetNamePartsList( 1061 current_case.starting_names, &first_names, &middle_names, &last_names); 1062 1063 // Construct the starting_profile. 1064 AutofillProfile starting_profile(base::GenerateGUID(), 1065 "https://www.example.com/"); 1066 1067 starting_profile.SetRawMultiInfo(NAME_FIRST, first_names); 1068 starting_profile.SetRawMultiInfo(NAME_MIDDLE, middle_names); 1069 starting_profile.SetRawMultiInfo(NAME_LAST, last_names); 1070 1071 first_names.clear(); 1072 middle_names.clear(); 1073 last_names.clear(); 1074 GetNamePartsList( 1075 current_case.additional_names, &first_names, &middle_names, 1076 &last_names); 1077 1078 // Construct the additional_profile. 1079 AutofillProfile additional_profile(base::GenerateGUID(), 1080 "https://www.example.com/"); 1081 additional_profile.SetRawMultiInfo(NAME_FIRST, first_names); 1082 additional_profile.SetRawMultiInfo(NAME_MIDDLE, middle_names); 1083 additional_profile.SetRawMultiInfo(NAME_LAST, last_names); 1084 1085 // Merge the names from the |additional_profile| into the |starting_profile| 1086 starting_profile.OverwriteWithOrAddTo(additional_profile, "en-US"); 1087 1088 // Verify the test expectations. 1089 first_names.clear(); 1090 middle_names.clear(); 1091 last_names.clear(); 1092 GetNamePartsList( 1093 current_case.expected_result, &first_names, &middle_names, &last_names); 1094 1095 std::vector<base::string16> merged_first_names, merged_middle_names, 1096 merged_last_names; 1097 starting_profile.GetRawMultiInfo(NAME_FIRST, &merged_first_names); 1098 starting_profile.GetRawMultiInfo(NAME_MIDDLE, &merged_middle_names); 1099 starting_profile.GetRawMultiInfo(NAME_LAST, &merged_last_names); 1100 ASSERT_EQ(current_case.expected_result.size(), merged_first_names.size()); 1101 ASSERT_EQ(current_case.expected_result.size(), merged_middle_names.size()); 1102 ASSERT_EQ(current_case.expected_result.size(), merged_last_names.size()); 1103 1104 for (size_t i = 0; i < current_case.expected_result.size(); ++i) { 1105 EXPECT_EQ(first_names[i], merged_first_names[i]); 1106 EXPECT_EQ(middle_names[i], merged_middle_names[i]); 1107 EXPECT_EQ(last_names[i], merged_last_names[i]); 1108 } 1109 } 1110} 1111 1112} // namespace autofill 1113