summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-05 22:02:12 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-05 22:02:12 +0000
commit5ca123393de3a3ee4d28629e855d592374db9bd1 (patch)
treeb507ae4c1c622affe0067f2d538728f9ca3597ce
parent78c7977d2fc51cb7b24f1eb69e1bce64b71cb51a (diff)
downloadchromium_src-5ca123393de3a3ee4d28629e855d592374db9bd1.zip
chromium_src-5ca123393de3a3ee4d28629e855d592374db9bd1.tar.gz
chromium_src-5ca123393de3a3ee4d28629e855d592374db9bd1.tar.bz2
Add more tests for BillingAddress and fix the issues found by the tests.
BUG=none TEST=BillingAddressTest Review URL: http://codereview.chromium.org/669141 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40787 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/autofill/address.cc23
-rw-r--r--chrome/browser/autofill/billing_address_unittest.cc604
-rw-r--r--chrome/browser/autofill/form_group.h3
3 files changed, 556 insertions, 74 deletions
diff --git a/chrome/browser/autofill/address.cc b/chrome/browser/autofill/address.cc
index 9f2d335..e84e3e2 100644
--- a/chrome/browser/autofill/address.cc
+++ b/chrome/browser/autofill/address.cc
@@ -9,20 +9,23 @@
#include "chrome/browser/autofill/autofill_type.h"
#include "chrome/browser/autofill/field_types.h"
-#define U(x) (UTF16ToUTF8(x).c_str())
+namespace {
-static const string16 kAddressSplitChars = ASCIIToUTF16("-,#. ");
+const char16 kAddressSplitChars[] = {'-', ',', '#', '.', ' ', 0};
-static const AutoFillType::FieldTypeSubGroup kAutoFillAddressTypes[] = {
+const AutoFillType::FieldTypeSubGroup kAutoFillAddressTypes[] = {
AutoFillType::ADDRESS_LINE1,
AutoFillType::ADDRESS_LINE2,
+ AutoFillType::ADDRESS_APT_NUM,
AutoFillType::ADDRESS_CITY,
AutoFillType::ADDRESS_STATE,
AutoFillType::ADDRESS_ZIP,
AutoFillType::ADDRESS_COUNTRY,
};
-static const int kAutoFillAddressLength = arraysize(kAutoFillAddressTypes);
+const int kAutoFillAddressLength = arraysize(kAutoFillAddressTypes);
+
+} // namespace
void Address::GetPossibleFieldTypes(const string16& text,
FieldTypeSet* possible_types) const {
@@ -60,10 +63,9 @@ void Address::GetPossibleFieldTypes(const string16& text,
void Address::FindInfoMatches(const AutoFillType& type,
const string16& info,
std::vector<string16>* matched_text) const {
- if (matched_text == NULL) {
- DLOG(ERROR) << "NULL matched vector passed in";
+ DCHECK(matched_text);
+ if (!matched_text)
return;
- }
string16 match;
if (type.field_type() == UNKNOWN_TYPE) {
@@ -207,10 +209,7 @@ bool Address::IsZipCode(const string16& text) const {
bool Address::FindInfoMatchesHelper(const FieldTypeSubGroup& subgroup,
const string16& info,
string16* match) const {
- if (match == NULL) {
- DLOG(ERROR) << "NULL match string passed in";
- return false;
- }
+ DCHECK(match);
match->clear();
if (subgroup == AutoFillType::ADDRESS_LINE1 &&
@@ -220,7 +219,7 @@ bool Address::FindInfoMatchesHelper(const FieldTypeSubGroup& subgroup,
StartsWith(line2(), info, false)) {
*match = line2();
} else if (subgroup == AutoFillType::ADDRESS_APT_NUM &&
- StartsWith(apt_num(), info, true)) {
+ StartsWith(apt_num(), info, false)) {
*match = apt_num();
} else if (subgroup == AutoFillType::ADDRESS_CITY &&
StartsWith(city(), info, false)) {
diff --git a/chrome/browser/autofill/billing_address_unittest.cc b/chrome/browser/autofill/billing_address_unittest.cc
index a8dfb7d..da20211 100644
--- a/chrome/browser/autofill/billing_address_unittest.cc
+++ b/chrome/browser/autofill/billing_address_unittest.cc
@@ -2,53 +2,75 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/scoped_ptr.h"
#include "base/utf_string_conversions.h"
+#include "chrome/browser/autofill/address.h"
#include "chrome/browser/autofill/billing_address.h"
#include "testing/gtest/include/gtest/gtest.h"
-TEST(BillingAddressTest, GetPossibleFieldTypes) {
- BillingAddress address;
- address.SetInfo(AutoFillType(ADDRESS_BILLING_LINE1),
- UTF8ToUTF16("123 Appian Way"));
- address.SetInfo(AutoFillType(ADDRESS_BILLING_LINE2), UTF8ToUTF16("Unit 6"));
- address.SetInfo(AutoFillType(ADDRESS_BILLING_APT_NUM), UTF8ToUTF16("#6"));
- address.SetInfo(AutoFillType(ADDRESS_BILLING_CITY), UTF8ToUTF16("Paris"));
- address.SetInfo(AutoFillType(ADDRESS_BILLING_STATE), UTF8ToUTF16("Texas"));
- address.SetInfo(AutoFillType(ADDRESS_BILLING_ZIP), UTF8ToUTF16("12345"));
- address.SetInfo(AutoFillType(ADDRESS_BILLING_COUNTRY), UTF8ToUTF16("USA"));
-
+namespace {
+
+class BillingAddressTest : public testing::Test {
+ public:
+ BillingAddressTest() {
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_LINE1),
+ ASCIIToUTF16("123 Appian Way"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_LINE2),
+ ASCIIToUTF16("Unit 6"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_APT_NUM), ASCIIToUTF16("#6"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_CITY), ASCIIToUTF16("Paris"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_STATE),
+ ASCIIToUTF16("Texas"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_ZIP), ASCIIToUTF16("12345"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_COUNTRY),
+ ASCIIToUTF16("USA"));
+ }
+
+ protected:
+ BillingAddress address_;
+
+ DISALLOW_COPY_AND_ASSIGN(BillingAddressTest);
+};
+
+TEST_F(BillingAddressTest, GetPossibleFieldTypes) {
// DCHECK on NULL |possible_types|.
- ASSERT_DEBUG_DEATH(address.GetPossibleFieldTypes(string16(), NULL), "");
+ ASSERT_DEBUG_DEATH(address_.GetPossibleFieldTypes(string16(), NULL), "");
// Empty string.
FieldTypeSet possible_types;
- address.GetPossibleFieldTypes(string16(), &possible_types);
+ address_.GetPossibleFieldTypes(string16(), &possible_types);
ASSERT_EQ(0U, possible_types.size());
- // Only use split-chars for the address.
+ // Only use split-chars for the address_.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("-,#. "), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("-,#. "), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// ADDRESS_BILLING_LINE1 =====================================================
// Exact match.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("123 Appian Way"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("123 Appian Way"),
+ &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE1) !=
possible_types.end());
// Fields are mixed up.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Way 123 Appian"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Way 123 Appian"),
+ &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE1) !=
possible_types.end());
// The match is case-insensitive.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("123 aPPiaN wAy"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("123 aPPiaN wAy"),
+ &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE1) !=
possible_types.end());
@@ -57,33 +79,41 @@ TEST(BillingAddressTest, GetPossibleFieldTypes) {
// do a good job of testing for case-insensitivity because the underlying
// algorithm stops search when it matches '123'.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("wAy aPpIAn"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("wAy aPpIAn"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE1) !=
possible_types.end());
// The text is not complete.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("123 Appian"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("123 Appian"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE1) !=
possible_types.end());
// Extra text on the line.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("123 Appian Way #6"),
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("123 Appian Way #6"),
&possible_types);
ASSERT_EQ(0U, possible_types.size());
// Extra text in the middle
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("123 Middle Appian Way"),
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("123 Middle Appian Way"),
&possible_types);
ASSERT_EQ(0U, possible_types.size());
// Whitespace doesn't matter.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16(" 123 Appian Way "),
+ address_.GetPossibleFieldTypes(ASCIIToUTF16(" 123 Appian Way "),
+ &possible_types);
+ ASSERT_EQ(1U, possible_types.size());
+ EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE1) !=
+ possible_types.end());
+
+ // Address split characters don't matter.
+ possible_types.clear();
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("-123, #Appian.Way"),
&possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE1) !=
@@ -93,45 +123,54 @@ TEST(BillingAddressTest, GetPossibleFieldTypes) {
// Exact match.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Unit 6"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Unit 6"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE2) !=
possible_types.end());
// Fields are mixed up.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("6 Unit"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("6 Unit"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE2) !=
possible_types.end());
// The match is case-insensitive.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("uNiT 6"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("uNiT 6"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE2) !=
possible_types.end());
// The text is not complete.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Unit"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Unit"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE2) !=
possible_types.end());
// Extra text on the line.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Unit 6 Extra"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Unit 6 Extra"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Extra text in the middle
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Unit Middle 6"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Unit Middle 6"),
+ &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Whitespace doesn't matter.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16(" Unit 6 "), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16(" Unit 6 "), &possible_types);
+ ASSERT_EQ(1U, possible_types.size());
+ EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE2) !=
+ possible_types.end());
+
+ // Address split characters don't matter.
+ possible_types.clear();
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("-#Unit, .6"),
+ &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE2) !=
possible_types.end());
@@ -142,7 +181,7 @@ TEST(BillingAddressTest, GetPossibleFieldTypes) {
// 'Unit 6' because of the 6 and the fact that '#' is an address separator,
// which is ignored in the search for an address line.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("#6"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("#6"), &possible_types);
ASSERT_EQ(2U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_APT_NUM) !=
possible_types.end());
@@ -151,157 +190,159 @@ TEST(BillingAddressTest, GetPossibleFieldTypes) {
// The match is case-insensitive.
possible_types.clear();
- address.SetInfo(AutoFillType(ADDRESS_BILLING_APT_NUM), UTF8ToUTF16("Num 10"));
- address.GetPossibleFieldTypes(UTF8ToUTF16("nuM 10"), &possible_types);
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_APT_NUM),
+ ASCIIToUTF16("Num 10"));
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("nuM 10"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_APT_NUM) !=
possible_types.end());
// The text is not complete.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Num"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Num"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Extra text on the line.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Num 10 More"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Num 10 More"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Extra text in the middle
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Num Middle 10"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Num Middle 10"),
+ &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Whitespace does matter for apartment number.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16(" Num 10 "), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16(" Num 10 "), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// ADDRESS_BILLING_CITY ======================================================
// Exact match.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Paris"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Paris"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_CITY) !=
possible_types.end());
// The match is case-insensitive.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("pARiS"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("pARiS"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_CITY) !=
possible_types.end());
// The text is not complete.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Par"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Par"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Extra text on the line.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Paris City"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Paris City"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Whitespace does matter for apartment number.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16(" Paris "), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16(" Paris "), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// ADDRESS_BILLING_STATE =====================================================
// Exact match.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Texas"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Texas"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_STATE) !=
possible_types.end());
// The match is case-insensitive.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("tExAs"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("tExAs"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_STATE) !=
possible_types.end());
// The text is not complete.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Tex"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Tex"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Extra text on the line.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Texas State"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Texas State"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Whitespace does matter for apartment number.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16(" Texas "), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16(" Texas "), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// ADDRESS_BILLING_COUNTRY ===================================================
// Exact match.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("USA"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("USA"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_COUNTRY) !=
possible_types.end());
// The match is case-insensitive.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("uSa"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("uSa"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_COUNTRY) !=
possible_types.end());
// The text is not complete.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("US"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("US"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Extra text on the line.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("US Country"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("US Country"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Whitespace does matter for apartment number.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16(" US "), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16(" US "), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// ADDRESS_BILLING_ZIP =======================================================
// Exact match.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("12345"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("12345"), &possible_types);
ASSERT_EQ(1U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_ZIP) !=
possible_types.end());
// The text is not complete.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("1234"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("1234"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Extra text on the line.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("12345 678"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("12345 678"), &possible_types);
ASSERT_EQ(0U, possible_types.size());
// Whitespace does matter for apartment number.
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16(" 12345 "), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16(" 12345 "), &possible_types);
ASSERT_EQ(0U, possible_types.size());
- // Misc =======================================================
+ // Misc ======================================================================
// More than one type can match.
- address.SetInfo(AutoFillType(ADDRESS_BILLING_LINE1), UTF8ToUTF16("Same"));
- address.SetInfo(AutoFillType(ADDRESS_BILLING_LINE2), UTF8ToUTF16("Same"));
- address.SetInfo(AutoFillType(ADDRESS_BILLING_APT_NUM), UTF8ToUTF16("Same"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_LINE1), ASCIIToUTF16("Same"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_LINE2), ASCIIToUTF16("Same"));
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_APT_NUM), ASCIIToUTF16("Same"));
possible_types.clear();
- address.GetPossibleFieldTypes(UTF8ToUTF16("Same"), &possible_types);
+ address_.GetPossibleFieldTypes(ASCIIToUTF16("Same"), &possible_types);
ASSERT_EQ(3U, possible_types.size());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_LINE1) !=
possible_types.end());
@@ -309,4 +350,445 @@ TEST(BillingAddressTest, GetPossibleFieldTypes) {
possible_types.end());
EXPECT_TRUE(possible_types.find(ADDRESS_BILLING_APT_NUM) !=
possible_types.end());
+
+ // LINE1 is empty.
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_LINE1), string16());
+ possible_types.clear();
+ address_.GetPossibleFieldTypes(string16(), &possible_types);
+ ASSERT_EQ(0U, possible_types.size());
}
+
+TEST_F(BillingAddressTest, FindInfoMatches) {
+ // DCHECK on NULL |matched_text|.
+ ASSERT_DEBUG_DEATH(address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE1), string16(), NULL), "");
+
+ // ADDRESS_BILLING_LINE1 =====================================================
+
+ // Match the beginning of the string.
+ std::vector<string16> matches;
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE1), ASCIIToUTF16("123"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), matches[0]);
+
+ // Search has too many characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE1), ASCIIToUTF16("123 B"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Whitespace at the beginning of the search.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE1), ASCIIToUTF16(" 123"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Search includes the entire match, but adds extra characters.
+ matches.clear();
+ address_.FindInfoMatches(AutoFillType(ADDRESS_BILLING_LINE1),
+ ASCIIToUTF16("123 Appian Way B"),
+ &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Matching is case-insensitive.
+ matches.clear();
+ address_.FindInfoMatches(AutoFillType(ADDRESS_BILLING_LINE1),
+ ASCIIToUTF16("123 aPpiAN wAy"),
+ &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), matches[0]);
+
+ // Search is empty.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE1), string16(), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), matches[0]);
+
+ // ADDRESS_BILLING_LINE2 =====================================================
+
+ // Match the beginning of the string.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE2), ASCIIToUTF16("Unit"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Unit 6"), matches[0]);
+
+ // Search has too many characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE2), ASCIIToUTF16("Unita"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Whitespace at the beginning of the search.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE2), ASCIIToUTF16(" Unit"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Search includes the entire match, but adds extra characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE2), ASCIIToUTF16("Unit 6B"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Matching is case-insensitive.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE2), ASCIIToUTF16("uNiT 6"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Unit 6"), matches[0]);
+
+ // Search is empty.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_LINE2), string16(), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Unit 6"), matches[0]);
+
+ // ADDRESS_BILLING_APT_NUM ===================================================
+
+ // Match the beginning of the string.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_APT_NUM), ASCIIToUTF16("#"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("#6"), matches[0]);
+
+ // Search has too many characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_APT_NUM), ASCIIToUTF16("#a"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Whitespace at the beginning of the search.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_APT_NUM), ASCIIToUTF16(" #"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Search includes the entire match, but adds extra characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_APT_NUM), ASCIIToUTF16("#6B"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Matching is case-insensitive.
+ matches.clear();
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_APT_NUM), ASCIIToUTF16("6B"));
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_APT_NUM), ASCIIToUTF16("6b"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("6B"), matches[0]);
+
+ // Search is empty.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_APT_NUM), string16(), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("6B"), matches[0]);
+
+ // ADDRESS_BILLING_CITY ======================================================
+
+ // Match the beginning of the string.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_CITY), ASCIIToUTF16("Par"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Paris"), matches[0]);
+
+ // Search has too many characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_CITY), ASCIIToUTF16("ParA"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Whitespace at the beginning of the search.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_CITY), ASCIIToUTF16(" Paris"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Search includes the entire match, but adds extra characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_CITY), ASCIIToUTF16("ParisB"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Matching is case-insensitive.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_CITY), ASCIIToUTF16("PArIs"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Paris"), matches[0]);
+
+ // Search is empty.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_CITY), string16(), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Paris"), matches[0]);
+
+ // ADDRESS_BILLING_STATE =====================================================
+
+ // Match the beginning of the string.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_STATE), ASCIIToUTF16("Tex"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Texas"), matches[0]);
+
+ // Search has too many characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_STATE), ASCIIToUTF16("TexC"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Whitespace at the beginning of the search.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_STATE), ASCIIToUTF16(" Texas"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Search includes the entire match, but adds extra characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_STATE), ASCIIToUTF16("TexasB"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Matching is case-insensitive.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_STATE), ASCIIToUTF16("TeXaS"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Texas"), matches[0]);
+
+ // Search is empty.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_STATE), string16(), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("Texas"), matches[0]);
+
+ // ADDRESS_BILLING_ZIP =======================================================
+
+ // Match the beginning of the string.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_ZIP), ASCIIToUTF16("123"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("12345"), matches[0]);
+
+ // Search has too many characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_ZIP), ASCIIToUTF16("123a"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Whitespace at the beginning of the search.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_ZIP), ASCIIToUTF16(" 123"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Search includes the entire match, but adds extra characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_ZIP), ASCIIToUTF16("123456"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Matching is case-sensitive because we should only have numbers in the zip.
+ matches.clear();
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_ZIP), ASCIIToUTF16("12345A"));
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_ZIP), ASCIIToUTF16("12345a"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Reset the zip code.
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_ZIP), ASCIIToUTF16("12345"));
+
+ // Search is empty.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_ZIP), string16(), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("12345"), matches[0]);
+
+ // ADDRESS_BILLING_COUNTRY ===================================================
+
+ // Match the beginning of the string.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_COUNTRY), ASCIIToUTF16("US"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("USA"), matches[0]);
+
+ // Search has too many characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_COUNTRY), ASCIIToUTF16("USb"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Whitespace at the beginning of the search.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_COUNTRY), ASCIIToUTF16(" US"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Search includes the entire match, but adds extra characters.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_COUNTRY), ASCIIToUTF16("USAB"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // Matching is case-insensitive.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_COUNTRY), ASCIIToUTF16("uSa"), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("USA"), matches[0]);
+
+ // Search is empty.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(ADDRESS_BILLING_COUNTRY), string16(), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("USA"), matches[0]);
+
+ // Misc ======================================================================
+
+ // |type| is not handled by address_.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(NAME_FIRST), ASCIIToUTF16("USA"), &matches);
+ ASSERT_EQ(0U, matches.size());
+
+ // |type| is UNKNOWN_TYPE.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(UNKNOWN_TYPE), ASCIIToUTF16("123"), &matches);
+ ASSERT_EQ(2U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), matches[0]);
+ EXPECT_EQ(ASCIIToUTF16("12345"), matches[1]);
+
+ // |type| is UNKNOWN_TYPE. Exclude zip because of extra space.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(UNKNOWN_TYPE), ASCIIToUTF16("123 "), &matches);
+ ASSERT_EQ(1U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), matches[0]);
+
+ // |type| is UNKNOWN_TYPE. Search is empty.
+ matches.clear();
+ address_.FindInfoMatches(
+ AutoFillType(UNKNOWN_TYPE), string16(), &matches);
+ ASSERT_EQ(7U, matches.size());
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), matches[0]);
+ EXPECT_EQ(ASCIIToUTF16("Unit 6"), matches[1]);
+ EXPECT_EQ(ASCIIToUTF16("6B"), matches[2]);
+ EXPECT_EQ(ASCIIToUTF16("Paris"), matches[3]);
+ EXPECT_EQ(ASCIIToUTF16("Texas"), matches[4]);
+ EXPECT_EQ(ASCIIToUTF16("12345"), matches[5]);
+ EXPECT_EQ(ASCIIToUTF16("USA"), matches[6]);
+}
+
+TEST_F(BillingAddressTest, GetFieldText) {
+ // Get the field text.
+ string16 text;
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_LINE1));
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_LINE2));
+ EXPECT_EQ(ASCIIToUTF16("Unit 6"), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_APT_NUM));
+ EXPECT_EQ(ASCIIToUTF16("#6"), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_CITY));
+ EXPECT_EQ(ASCIIToUTF16("Paris"), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_STATE));
+ EXPECT_EQ(ASCIIToUTF16("Texas"), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_ZIP));
+ EXPECT_EQ(ASCIIToUTF16("12345"), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_COUNTRY));
+ EXPECT_EQ(ASCIIToUTF16("USA"), text);
+
+ // |type| is not supported by Billingaddress_.
+ text = address_.GetFieldText(AutoFillType(NAME_FIRST));
+ EXPECT_EQ(string16(), text);
+}
+
+TEST_F(BillingAddressTest, Clear) {
+ // Clear the info.
+ string16 text;
+ address_.Clear();
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_LINE1));
+ EXPECT_EQ(string16(), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_LINE2));
+ EXPECT_EQ(string16(), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_APT_NUM));
+ EXPECT_EQ(string16(), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_CITY));
+ EXPECT_EQ(string16(), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_STATE));
+ EXPECT_EQ(string16(), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_ZIP));
+ EXPECT_EQ(string16(), text);
+ text = address_.GetFieldText(AutoFillType(ADDRESS_BILLING_COUNTRY));
+ EXPECT_EQ(string16(), text);
+}
+
+TEST_F(BillingAddressTest, AddressClone) {
+ // Clone the info.
+ string16 text;
+ BillingAddress clone;
+ Address* clone_ptr = &clone;
+ clone_ptr->Clone(address_);
+ text = clone.GetFieldText(AutoFillType(ADDRESS_BILLING_LINE1));
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), text);
+ text = clone.GetFieldText(AutoFillType(ADDRESS_BILLING_LINE2));
+ EXPECT_EQ(ASCIIToUTF16("Unit 6"), text);
+ text = clone.GetFieldText(AutoFillType(ADDRESS_BILLING_APT_NUM));
+ EXPECT_EQ(ASCIIToUTF16("#6"), text);
+ text = clone.GetFieldText(AutoFillType(ADDRESS_BILLING_CITY));
+ EXPECT_EQ(ASCIIToUTF16("Paris"), text);
+ text = clone.GetFieldText(AutoFillType(ADDRESS_BILLING_STATE));
+ EXPECT_EQ(ASCIIToUTF16("Texas"), text);
+ text = clone.GetFieldText(AutoFillType(ADDRESS_BILLING_ZIP));
+ EXPECT_EQ(ASCIIToUTF16("12345"), text);
+ text = clone.GetFieldText(AutoFillType(ADDRESS_BILLING_COUNTRY));
+ EXPECT_EQ(ASCIIToUTF16("USA"), text);
+
+ // Verify that the clone is a copy and not a reference.
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_LINE1),
+ ASCIIToUTF16("654 Bowling Terrace"));
+ text = clone.GetFieldText(AutoFillType(ADDRESS_BILLING_LINE1));
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), text);
+}
+
+TEST_F(BillingAddressTest, BillingAddressClone) {
+ // Clone the info.
+ string16 text;
+ scoped_ptr<FormGroup> clone(address_.Clone());
+ ASSERT_NE(static_cast<FormGroup*>(NULL), clone.get());
+ text = clone->GetFieldText(AutoFillType(ADDRESS_BILLING_LINE1));
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), text);
+ text = clone->GetFieldText(AutoFillType(ADDRESS_BILLING_LINE2));
+ EXPECT_EQ(ASCIIToUTF16("Unit 6"), text);
+ text = clone->GetFieldText(AutoFillType(ADDRESS_BILLING_APT_NUM));
+ EXPECT_EQ(ASCIIToUTF16("#6"), text);
+ text = clone->GetFieldText(AutoFillType(ADDRESS_BILLING_CITY));
+ EXPECT_EQ(ASCIIToUTF16("Paris"), text);
+ text = clone->GetFieldText(AutoFillType(ADDRESS_BILLING_STATE));
+ EXPECT_EQ(ASCIIToUTF16("Texas"), text);
+ text = clone->GetFieldText(AutoFillType(ADDRESS_BILLING_ZIP));
+ EXPECT_EQ(ASCIIToUTF16("12345"), text);
+ text = clone->GetFieldText(AutoFillType(ADDRESS_BILLING_COUNTRY));
+ EXPECT_EQ(ASCIIToUTF16("USA"), text);
+
+ // Verify that the clone is a copy and not a reference.
+ address_.SetInfo(AutoFillType(ADDRESS_BILLING_LINE1),
+ ASCIIToUTF16("654 Bowling Terrace"));
+ text = clone->GetFieldText(AutoFillType(ADDRESS_BILLING_LINE1));
+ EXPECT_EQ(ASCIIToUTF16("123 Appian Way"), text);
+}
+
+} // namespace
diff --git a/chrome/browser/autofill/form_group.h b/chrome/browser/autofill/form_group.h
index e14a040..63315ea 100644
--- a/chrome/browser/autofill/form_group.h
+++ b/chrome/browser/autofill/form_group.h
@@ -24,6 +24,7 @@ class FormGroup {
// Used to determine the type of a field based on the text that a user enters
// into the field. The field types can then be reported back to the server.
+ // This method is additive on |possible_types|.
virtual void GetPossibleFieldTypes(const string16& text,
FieldTypeSet* possible_types) const = 0;
@@ -39,7 +40,7 @@ class FormGroup {
// Used to determine if the text being typed into a field matches the
// information in this FormGroup object. This is used by the preview
// functionality. |matched_text| will be populated with all of the possible
- // matches given the type.
+ // matches given the type. This method is additive on |matched_text|.
virtual void FindInfoMatches(const AutoFillType& type,
const string16& info,
std::vector<string16>* matched_text) const = 0;