// 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_field.h"
+
#include "base/format_macros.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
-#include "components/autofill/core/browser/autofill_field.h"
#include "components/autofill/core/browser/autofill_type.h"
#include "components/autofill/core/browser/field_types.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::ASCIIToUTF16;
+using base::UTF8ToUTF16;
namespace autofill {
namespace {
field.SetHtmlType(HTML_TYPE_TEL_LOCAL_PREFIX, HtmlFieldMode());
// Fill with a non-phone number; should fill normally.
- AutofillField::FillFormField(field, ASCIIToUTF16("Oh hai"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("Oh hai"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Oh hai"), field.value);
// Fill with a phone number; should fill just the prefix.
- AutofillField::FillFormField(field, ASCIIToUTF16("5551234"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("5551234"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("555"), field.value);
// Now reset the type, and set a max-length instead.
field.max_length = 4;
// Fill with a phone-number; should fill just the suffix.
- AutofillField::FillFormField(field, ASCIIToUTF16("5551234"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("5551234"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("1234"), field.value);
}
field.option_contents[i] = ASCIIToUTF16(base::StringPrintf("%" PRIuS, i));
}
- AutofillField::FillFormField(field, ASCIIToUTF16("Meenie"), "en-US",
- &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("Meenie"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Meenie"), field.value);
}
field.option_values[i] = ASCIIToUTF16(base::StringPrintf("%" PRIuS, i));
}
- AutofillField::FillFormField(field, ASCIIToUTF16("Miney"), "en-US",
- &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("Miney"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("2"), field.value); // Corresponds to "Miney".
}
base::string16());
field.set_heuristic_type(ADDRESS_HOME_COUNTRY);
- AutofillField::FillFormField(field, ASCIIToUTF16("CA"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("CA"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Canada"), field.value);
}
base::string16());
field.set_heuristic_type(ADDRESS_HOME_COUNTRY);
- AutofillField::FillFormField(field, ASCIIToUTF16("Canada"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("Canada"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("CA"), field.value);
}
base::string16());
field.set_heuristic_type(ADDRESS_HOME_STATE);
- AutofillField::FillFormField(field, ASCIIToUTF16("CA"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("CA"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("California"), field.value);
}
-TEST(AutofillFieldTest, FillSelectControlWithWithAbbreviateStateNames) {
+TEST(AutofillFieldTest, FillSelectControlWithAbbreviateStateNames) {
const char* const kStates[] = {
"AL", "CA"
};
base::string16());
field.set_heuristic_type(ADDRESS_HOME_STATE);
- AutofillField::FillFormField(field, ASCIIToUTF16("California"), "en-US",
- &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("California"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("CA"), field.value);
}
+TEST(AutofillFieldTest, FillSelectControlWithInexactFullStateNames) {
+ {
+ const char* const kStates[] = {
+ "SC - South Carolina", "CA - California", "NC - North Carolina",
+ };
+ AutofillField field(
+ GenerateSelectFieldWithOptions(kStates, arraysize(kStates)),
+ base::string16());
+ field.set_heuristic_type(ADDRESS_HOME_STATE);
+
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("California"), "en-US", "en-US", &field);
+ EXPECT_EQ(ASCIIToUTF16("CA - California"), field.value);
+ }
+
+ // Don't accidentally match "Virginia" to "West Virginia".
+ {
+ const char* const kStates[] = {
+ "WV - West Virginia", "VA - Virginia", "NV - North Virginia",
+ };
+ AutofillField field(
+ GenerateSelectFieldWithOptions(kStates, arraysize(kStates)),
+ base::string16());
+ field.set_heuristic_type(ADDRESS_HOME_STATE);
+
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("Virginia"), "en-US", "en-US", &field);
+ EXPECT_EQ(ASCIIToUTF16("VA - Virginia"), field.value);
+ }
+
+ // Do accidentally match "Virginia" to "West Virginia". NB: Ideally, Chrome
+ // would fail this test. It's here to document behavior rather than enforce
+ // it.
+ {
+ const char* const kStates[] = {
+ "WV - West Virginia", "TX - Texas",
+ };
+ AutofillField field(
+ GenerateSelectFieldWithOptions(kStates, arraysize(kStates)),
+ base::string16());
+ field.set_heuristic_type(ADDRESS_HOME_STATE);
+
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("Virginia"), "en-US", "en-US", &field);
+ EXPECT_EQ(ASCIIToUTF16("WV - West Virginia"), field.value);
+ }
+
+ // Tests that substring matches work for full state names (a full token
+ // match isn't required). Also tests that matches work for states with
+ // whitespace in the middle.
+ {
+ const char* const kStates[] = {
+ "California.", "North Carolina.",
+ };
+ AutofillField field(
+ GenerateSelectFieldWithOptions(kStates, arraysize(kStates)),
+ base::string16());
+ field.set_heuristic_type(ADDRESS_HOME_STATE);
+
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("North Carolina"), "en-US", "en-US", &field);
+ EXPECT_EQ(ASCIIToUTF16("North Carolina."), field.value);
+ }
+}
+
+TEST(AutofillFieldTest, FillSelectControlWithInexactAbbreviations) {
+ {
+ const char* const kStates[] = {
+ "NC - North Carolina", "CA - California",
+ };
+ AutofillField field(
+ GenerateSelectFieldWithOptions(kStates, arraysize(kStates)),
+ base::string16());
+ field.set_heuristic_type(ADDRESS_HOME_STATE);
+
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("CA"), "en-US", "en-US", &field);
+ EXPECT_EQ(ASCIIToUTF16("CA - California"), field.value);
+ }
+
+ {
+ const char* const kNotStates[] = {
+ "NCNCA", "SCNCA",
+ };
+ AutofillField field(
+ GenerateSelectFieldWithOptions(kNotStates, arraysize(kNotStates)),
+ base::string16());
+ field.set_heuristic_type(ADDRESS_HOME_STATE);
+
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("NC"), "en-US", "en-US", &field);
+ EXPECT_EQ(base::string16(), field.value);
+ }
+}
+
TEST(AutofillFieldTest, FillSelectControlWithNumericMonth) {
const char* const kMonthsNumeric[] = {
"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12",
field.set_heuristic_type(CREDIT_CARD_EXP_MONTH);
// Try with a leading zero.
- AutofillField::FillFormField(field, ASCIIToUTF16("03"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("03"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("03"), field.value);
// Try without a leading zero.
- AutofillField::FillFormField(field, ASCIIToUTF16("4"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("4"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("04"), field.value);
// Try a two-digit month.
- AutofillField::FillFormField(field, ASCIIToUTF16("11"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("11"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("11"), field.value);
}
base::string16());
field.set_heuristic_type(CREDIT_CARD_EXP_MONTH);
- AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("04"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Apr"), field.value);
}
TEST(AutofillFieldTest, FillSelectControlWithFullMonthName) {
const char* const kMonthsFull[] = {
- "January", "February", "March", "April", "May", "June",
+ "January","February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December",
};
AutofillField field(
base::string16());
field.set_heuristic_type(CREDIT_CARD_EXP_MONTH);
- AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("04"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("April"), field.value);
}
base::string16());
field.set_heuristic_type(CREDIT_CARD_EXP_MONTH);
- AutofillField::FillFormField(field, ASCIIToUTF16("04"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("04"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("4"), field.value);
}
base::string16());
field.set_heuristic_type(CREDIT_CARD_EXP_2_DIGIT_YEAR);
- AutofillField::FillFormField(field, ASCIIToUTF16("2017"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("2017"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("17"), field.value);
}
field.set_heuristic_type(CREDIT_CARD_TYPE);
// Normal case:
- AutofillField::FillFormField(field, ASCIIToUTF16("Visa"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("Visa"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Visa"), field.value);
// Filling should be able to handle intervening whitespace:
- AutofillField::FillFormField(field, ASCIIToUTF16("MasterCard"), "en-US",
- &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("MasterCard"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("Master Card"), field.value);
// American Express is sometimes abbreviated as AmEx:
- AutofillField::FillFormField(field, ASCIIToUTF16("American Express"), "en-US",
- &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("American Express"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("AmEx"), field.value);
// Case insensitivity:
- AutofillField::FillFormField(field, ASCIIToUTF16("Discover"), "en-US",
- &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("Discover"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("discover"), field.value);
}
field.form_control_type = "month";
// Try a month with two digits.
- AutofillField::FillFormField(field, ASCIIToUTF16("12/2017"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("12/2017"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("2017-12"), field.value);
// Try a month with a leading zero.
- AutofillField::FillFormField(field, ASCIIToUTF16("03/2019"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("03/2019"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("2019-03"), field.value);
// Try a month without a leading zero.
- AutofillField::FillFormField(field, ASCIIToUTF16("4/2018"), "en-US", &field);
+ AutofillField::FillFormField(
+ field, ASCIIToUTF16("4/2018"), "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("2018-04"), field.value);
}
base::string16 value = ASCIIToUTF16("123 Fake St.\n"
"Apt. 42");
- AutofillField::FillFormField(field, value, "en-US", &field);
+ AutofillField::FillFormField(field, value, "en-US", "en-US", &field);
EXPECT_EQ(value, field.value);
+
+ base::string16 ja_value = UTF8ToUTF16("桜丘町26-1\n"
+ "セルリアンタワー6階");
+ AutofillField::FillFormField(field, ja_value, "ja-JP", "en-US", &field);
+ EXPECT_EQ(ja_value, field.value);
}
TEST(AutofillFieldTest, FillStreetAddressTextField) {
base::string16 value = ASCIIToUTF16("123 Fake St.\n"
"Apt. 42");
- AutofillField::FillFormField(field, value, "en-US", &field);
+ AutofillField::FillFormField(field, value, "en-US", "en-US", &field);
EXPECT_EQ(ASCIIToUTF16("123 Fake St., Apt. 42"), field.value);
+
+ AutofillField::FillFormField(field,
+ UTF8ToUTF16("桜丘町26-1\n"
+ "セルリアンタワー6階"),
+ "ja-JP",
+ "en-US",
+ &field);
+ EXPECT_EQ(UTF8ToUTF16("桜丘町26-1セルリアンタワー6階"), field.value);
}
} // namespace