Chromium Code Reviews| Index: components/autofill/core/browser/autofill_profile_comparator_unittest.cc |
| diff --git a/components/autofill/core/browser/autofill_profile_comparator_unittest.cc b/components/autofill/core/browser/autofill_profile_comparator_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ca1d2a2f5637dd98c2951819ef8e1b87c70b6cc9 |
| --- /dev/null |
| +++ b/components/autofill/core/browser/autofill_profile_comparator_unittest.cc |
| @@ -0,0 +1,331 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "components/autofill/core/browser/autofill_profile_comparator.h" |
| + |
| +#include "base/guid.h" |
| +#include "base/strings/utf_string_conversions.h" |
| +#include "components/autofill/core/browser/autofill_profile.h" |
| +#include "components/autofill/core/browser/autofill_test_utils.h" |
| +#include "components/autofill/core/browser/field_types.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| + |
| +using autofill::ADDRESS_HOME_CITY; |
| +using autofill::ADDRESS_HOME_COUNTRY; |
| +using autofill::ADDRESS_HOME_LINE1; |
| +using autofill::ADDRESS_HOME_LINE2; |
| +using autofill::ADDRESS_HOME_STATE; |
| +using autofill::ADDRESS_HOME_ZIP; |
| +using autofill::AutofillProfile; |
| +using autofill::AutofillType; |
| +using autofill::NAME_FIRST; |
| +using autofill::NAME_MIDDLE; |
| +using autofill::PHONE_HOME_WHOLE_NUMBER; |
| +using autofill::ServerFieldType; |
| +using base::UTF8ToUTF16; |
| + |
| +namespace { |
| + |
| +class AutofillProfileComparatorTest : public ::testing::Test { |
| + public: |
| + // Expose the protected methods of autofill::AutofillProfileComparator for |
| + // testing. |
| + class AutofillProfileComparator |
| + : public ::autofill::AutofillProfileComparator { |
| + public: |
| + typedef ::autofill::AutofillProfileComparator Super; |
| + using Super::Super; |
| + using Super::UniqueTokens; |
| + using Super::HaveSameTokens; |
| + using Super::GetNameVariants; |
| + using Super::IsNameVariantOf; |
| + using Super::HaveMergeableNames; |
| + using Super::HaveMergeableEmailAddresses; |
| + using Super::HaveMergeableCompanyNames; |
| + using Super::HaveMergeablePhoneNumbers; |
| + using Super::HaveMergeableAddresses; |
| + }; |
| + |
| + AutofillProfileComparatorTest() : comparator_("en-US") {} |
| + |
| + AutofillProfile CreateProfileWithName(const char* first, |
| + const char* middle, |
| + const char* last) { |
| + AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/"); |
| + autofill::test::SetProfileInfo(&profile, first, middle, last, "", "", "", |
| + "", "", "", "", "", ""); |
| + return profile; |
| + } |
| + |
| + AutofillProfile CreateProfileWithEmail(const char* email) { |
| + AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/"); |
| + autofill::test::SetProfileInfo(&profile, "", "", "", email, "", "", "", "", |
| + "", "", "", ""); |
| + return profile; |
| + } |
| + |
| + AutofillProfile CreateProfileWithCompanyName(const char* company_name) { |
| + AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/"); |
| + autofill::test::SetProfileInfo(&profile, "", "", "", "", company_name, "", |
| + "", "", "", "", "", ""); |
| + return profile; |
| + } |
| + |
| + AutofillProfile CreateProfileWithPhoneNumber(const char* phone_number) { |
| + AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/"); |
| + autofill::test::SetProfileInfo(&profile, "", "", "", "", "", "", "", "", "", |
| + "", "", phone_number); |
| + return profile; |
| + } |
| + |
| + AutofillProfile CreateProfileWithAddress(const char* line1, |
| + const char* line2, |
| + const char* city, |
| + const char* state, |
| + const char* zip, |
| + const char* country) { |
| + AutofillProfile profile(base::GenerateGUID(), "http://www.example.com/"); |
| + autofill::test::SetProfileInfo(&profile, "", "", "", "", "", line1, line2, |
| + city, state, zip, country, ""); |
| + return profile; |
| + } |
| + |
| + AutofillProfile CopyAndModify( |
| + const AutofillProfile& profile, |
| + const std::vector<std::pair<ServerFieldType, const char*>>& updates) { |
| + AutofillProfile new_profile = profile; |
| + for (const auto& update : updates) { |
| + new_profile.SetRawInfo(update.first, UTF8ToUTF16(update.second)); |
| + } |
| + return new_profile; |
| + } |
| + |
| + AutofillProfileComparator comparator_; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(AutofillProfileComparatorTest); |
| +}; |
| + |
| +} // namespace |
| + |
| +TEST_F(AutofillProfileComparatorTest, UniqueTokens) { |
| + base::string16 kInput = UTF8ToUTF16("a b a a b"); |
| + std::vector<base::string16> tokens = {UTF8ToUTF16("a"), UTF8ToUTF16("b")}; |
| + EXPECT_EQ(std::set<base::StringPiece16>(tokens.begin(), tokens.end()), |
| + comparator_.UniqueTokens(kInput)); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, HaveSameTokens) { |
| + base::string16 kEmptyStr = UTF8ToUTF16(""); |
| + base::string16 kHello = UTF8ToUTF16("hello"); |
| + base::string16 kHelloThere = UTF8ToUTF16("hello there"); |
| + base::string16 kHelloThereAlice = UTF8ToUTF16("hello there alice"); |
| + base::string16 kHelloThereBob = UTF8ToUTF16("hello there bob"); |
| + |
| + EXPECT_TRUE(comparator_.HaveSameTokens(kEmptyStr, kHello)); |
| + EXPECT_TRUE(comparator_.HaveSameTokens(kHello, kEmptyStr)); |
| + EXPECT_TRUE(comparator_.HaveSameTokens(kHelloThere, kHello)); |
| + EXPECT_TRUE(comparator_.HaveSameTokens(kHello, kHelloThere)); |
| + EXPECT_FALSE(comparator_.HaveSameTokens(kHelloThereAlice, kHelloThereBob)); |
| + EXPECT_FALSE(comparator_.HaveSameTokens(kHelloThereBob, kHelloThereAlice)); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, NormalizeForComparison) { |
| + EXPECT_EQ(UTF8ToUTF16("timothe"), |
| + comparator_.NormalizeForComparison(UTF8ToUTF16("Timothé"))); |
| + EXPECT_EQ(UTF8ToUTF16("sven ake"), |
| + comparator_.NormalizeForComparison(UTF8ToUTF16(" sven-åke "))); |
| + EXPECT_EQ(UTF8ToUTF16("c 㸐"), |
| + comparator_.NormalizeForComparison(UTF8ToUTF16("Ç 㸐"))); |
| + EXPECT_EQ(UTF8ToUTF16("902101234"), |
| + comparator_.NormalizeForComparison( |
| + base::UTF8ToUTF16("90210-1234"), |
| + AutofillProfileComparator::DISCARD_WHITESPACE)); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, GetNameVariants) { |
|
Mathieu
2016/06/10 14:10:58
can we have an example with a middle name please?
Roger McFarlane (Chromium)
2016/06/10 16:19:44
That's not what this function is for. This comes u
|
| + std::set<base::string16> expected_variants = { |
| + UTF8ToUTF16("timothe noel"), |
| + UTF8ToUTF16("timothe n"), |
| + UTF8ToUTF16("timothe"), |
| + UTF8ToUTF16("t noel"), |
| + UTF8ToUTF16("t n"), |
| + UTF8ToUTF16("t"), |
| + UTF8ToUTF16("noel"), |
| + UTF8ToUTF16("n"), |
| + UTF8ToUTF16(""), |
| + }; |
| + |
| + EXPECT_EQ(expected_variants, |
| + comparator_.GetNameVariants(UTF8ToUTF16("timothe noel"))); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, IsNameVariantOf) { |
| + const base::string16 kFullName = UTF8ToUTF16("Timothé-Noël Étienne Périer"); |
| + const base::string16 kNormalizedFullName = |
| + UTF8ToUTF16("timothe noel etienne perier"); |
| + |
| + EXPECT_EQ(kNormalizedFullName, comparator_.NormalizeForComparison(kFullName)); |
| + |
|
Mathieu
2016/06/10 14:10:58
nit: can we also check that EXPECT_TRUE(comparator
Roger McFarlane (Chromium)
2016/06/10 16:19:44
Nope, the function expects both of the input names
|
| + EXPECT_TRUE( |
| + comparator_.IsNameVariantOf(kNormalizedFullName, kNormalizedFullName)); |
| + EXPECT_TRUE(comparator_.IsNameVariantOf( |
| + kNormalizedFullName, UTF8ToUTF16("t noel etienne perier"))); |
| + EXPECT_TRUE(comparator_.IsNameVariantOf(kNormalizedFullName, |
| + UTF8ToUTF16("timothe perier"))); |
| + EXPECT_TRUE(comparator_.IsNameVariantOf(kNormalizedFullName, |
| + UTF8ToUTF16("t perier"))); |
| + EXPECT_TRUE(comparator_.IsNameVariantOf(kNormalizedFullName, |
| + UTF8ToUTF16("noel perier"))); |
| + EXPECT_TRUE(comparator_.IsNameVariantOf(kNormalizedFullName, |
| + UTF8ToUTF16("t n etienne perier"))); |
| + |
| + EXPECT_FALSE(comparator_.IsNameVariantOf(kNormalizedFullName, |
| + UTF8ToUTF16("etienne noel perier"))); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, HaveMergeableNames) { |
| + AutofillProfile empty = CreateProfileWithName("", "", ""); |
| + AutofillProfile p1 = CreateProfileWithName("sven-åke", "", "larsson"); |
| + AutofillProfile p2 = CreateProfileWithName("Åke", "", "Larsson"); |
|
Mathieu
2016/06/10 14:10:58
can we add one with a middle name?
Roger McFarlane (Chromium)
2016/06/10 16:19:44
Done.
|
| + AutofillProfile p3 = CreateProfileWithName("A", "", "Larsson"); |
| + AutofillProfile different = CreateProfileWithName("Joe", "", "Larsson"); |
| + |
| + // |p1|, |p2|, |p3| and |empty| should all be the mergeable with one another. |
| + EXPECT_TRUE(comparator_.HaveMergeableNames(p1, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeableNames(p1, p3)); |
| + EXPECT_TRUE(comparator_.HaveMergeableNames(p2, p3)); |
| + EXPECT_TRUE(comparator_.HaveMergeableNames(empty, p1)); |
| + |
| + // |p1| should not match |different| |
| + EXPECT_FALSE(comparator_.HaveMergeableNames(different, p1)); |
| + |
| + // The order of comparison should not matter; repeat the preceding tests in |
| + // reverse. |
| + EXPECT_TRUE(comparator_.HaveMergeableNames(p2, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeableNames(p3, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeableNames(p3, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeableNames(p1, empty)); |
| + EXPECT_FALSE(comparator_.HaveMergeableNames(p1, different)); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, HaveMergeableEmailAddresses) { |
| + AutofillProfile empty = CreateProfileWithEmail(""); |
| + AutofillProfile p1 = CreateProfileWithEmail("FOO@BAR.COM"); |
| + AutofillProfile p2 = CreateProfileWithEmail("foo@bar.com"); |
| + AutofillProfile different = CreateProfileWithEmail("not@the-same.com"); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeableEmailAddresses(p1, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeableEmailAddresses(p2, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeableEmailAddresses(p1, empty)); |
| + EXPECT_TRUE(comparator_.HaveMergeableEmailAddresses(empty, p2)); |
| + |
| + EXPECT_FALSE(comparator_.HaveMergeableEmailAddresses(p1, different)); |
| + EXPECT_FALSE(comparator_.HaveMergeableEmailAddresses(different, p1)); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, HaveMergeableCompanyNames) { |
| + AutofillProfile empty = CreateProfileWithCompanyName(""); |
| + AutofillProfile p1 = CreateProfileWithCompanyName("Nestlé"); |
| + AutofillProfile p2 = CreateProfileWithCompanyName("Nestle"); |
|
sebsg
2016/06/10 15:12:13
Can you add punctuation to one of the two company
Roger McFarlane (Chromium)
2016/06/10 16:19:44
Done.
|
| + AutofillProfile different = CreateProfileWithCompanyName("Other Corp"); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeableCompanyNames(p1, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeableCompanyNames(p2, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeableCompanyNames(p1, empty)); |
| + EXPECT_TRUE(comparator_.HaveMergeableCompanyNames(empty, p2)); |
| + |
| + EXPECT_FALSE(comparator_.HaveMergeableCompanyNames(p1, different)); |
| + EXPECT_FALSE(comparator_.HaveMergeableCompanyNames(different, p1)); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, HaveMergeablePhoneNumbers) { |
| + AutofillProfile empty = CreateProfileWithPhoneNumber(""); |
| + AutofillProfile p1 = CreateProfileWithPhoneNumber("+1 (514) 670-8700"); |
| + AutofillProfile p2 = CreateProfileWithPhoneNumber("514.670.8700x123"); |
| + AutofillProfile p3 = CreateProfileWithPhoneNumber("670-8700 ext123"); |
| + AutofillProfile p4 = CreateProfileWithPhoneNumber("6708700"); |
| + AutofillProfile different = CreateProfileWithPhoneNumber("1-800-123-4567"); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, p3)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, p4)); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p2, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p2, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p2, p3)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p2, p4)); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p3, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p3, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p3, p3)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p3, p4)); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p4, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p4, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p4, p3)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p4, p4)); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(p1, empty)); |
| + EXPECT_TRUE(comparator_.HaveMergeablePhoneNumbers(empty, p2)); |
| + |
| + EXPECT_FALSE(comparator_.HaveMergeablePhoneNumbers(p1, different)); |
| + EXPECT_FALSE(comparator_.HaveMergeablePhoneNumbers(different, p1)); |
| +} |
| + |
|
Mathieu
2016/06/10 14:10:58
can we have a test explicitely for states? I would
Roger McFarlane (Chromium)
2016/06/10 16:19:44
That functionality isn't in this CL. It will arriv
|
| +TEST_F(AutofillProfileComparatorTest, HaveMergeableAddresses) { |
| + // TODO(rogerm): Replace some of the tokens to also test the address |
| + // normalization string replacement rules. |
| + AutofillProfile empty = CreateProfileWithAddress("", "", "", "", "", ""); |
| + AutofillProfile p1 = CreateProfileWithAddress( |
| + "1 Some Street", "Unit 3", "City", "CA - California", "90210", "US"); |
| + AutofillProfile p2 = CreateProfileWithAddress( |
| + "Unit 3", "1 Some Street", "Suburb", "california", "90 210-1234", ""); |
| + AutofillProfile p3 = |
| + CreateProfileWithAddress("1 Some Street #3", "", "City", "ca", "", "us"); |
| + AutofillProfile differentCountry = |
| + CopyAndModify(p1, {{ADDRESS_HOME_COUNTRY, "CA"}}); |
| + AutofillProfile differentZip = |
| + CopyAndModify(p1, {{ADDRESS_HOME_ZIP, "12345"}}); |
| + AutofillProfile differentState = CopyAndModify( |
| + p1, {{ADDRESS_HOME_ZIP, ""}, {ADDRESS_HOME_STATE, "Florida"}}); |
| + AutofillProfile differentCity = CopyAndModify( |
| + p1, {{ADDRESS_HOME_ZIP, ""}, {ADDRESS_HOME_CITY, "Metropolis"}}); |
| + AutofillProfile differentAddress = |
| + CopyAndModify(p1, {{ADDRESS_HOME_LINE1, "17 Park Lane"}, |
| + {ADDRESS_HOME_LINE2, "Suite 150"}}); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeableAddresses(p1, empty)); |
| + EXPECT_TRUE(comparator_.HaveMergeableAddresses(empty, p2)); |
| + |
| + EXPECT_TRUE(comparator_.HaveMergeableAddresses(p1, p2)); |
| + EXPECT_TRUE(comparator_.HaveMergeableAddresses(p2, p1)); |
| + EXPECT_TRUE(comparator_.HaveMergeableAddresses(p1, p3)); |
| + EXPECT_TRUE(comparator_.HaveMergeableAddresses(p3, p1)); |
| + |
| + EXPECT_FALSE(comparator_.HaveMergeableAddresses(p2, p3)); |
|
Mathieu
2016/06/10 14:10:58
nit: let's mention explicitely why p2, p3 and p3,
Roger McFarlane (Chromium)
2016/06/10 16:19:44
Done.
|
| + EXPECT_FALSE(comparator_.HaveMergeableAddresses(p3, p2)); |
| + |
| + EXPECT_FALSE(comparator_.HaveMergeableAddresses(p1, differentCountry)); |
| + EXPECT_FALSE(comparator_.HaveMergeableAddresses(p1, differentZip)); |
| + EXPECT_FALSE(comparator_.HaveMergeableAddresses(p1, differentState)); |
| + EXPECT_FALSE(comparator_.HaveMergeableAddresses(p1, differentCity)); |
| + EXPECT_FALSE(comparator_.HaveMergeableAddresses(p1, differentAddress)); |
| +} |
| + |
| +TEST_F(AutofillProfileComparatorTest, IsMergeable) { |
| + AutofillProfile p1 = autofill::test::GetFullProfile(); |
| + AutofillProfile p1_mergeable = CopyAndModify( |
| + p1, {{NAME_MIDDLE, "Herbert"}, // Originally "H." |
| + {ADDRESS_HOME_LINE1, "666 Erebus St W"}}); // Originally without W. |
| + AutofillProfile p1_not_mergeable = |
| + CopyAndModify(p1, {{NAME_FIRST, "Steven"}}); // Originally "John". |
| + AutofillProfile p2 = autofill::test::GetFullProfile2(); |
| + |
| + EXPECT_TRUE(comparator_.AreMergeable(p1, p1)); |
| + EXPECT_TRUE(comparator_.AreMergeable(p1, p1_mergeable)); |
| + EXPECT_FALSE(comparator_.AreMergeable(p1, p1_not_mergeable)); |
| + EXPECT_FALSE(comparator_.AreMergeable(p1, p2)); |
| +} |