blob: 68912c55deff44f7189e16086aba3705210275a3 [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// 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/form_parsing/address_field.h"
#include <memory>
#include "base/memory/ptr_util.h"
#include "base/test/scoped_feature_list.h"
#include "components/autofill/core/browser/form_parsing/parsing_test_utils.h"
#include "components/autofill/core/common/autofill_features.h"
#include "components/autofill/core/common/form_field_data.h"
namespace autofill {
class AddressFieldTest
: public FormFieldTestBase,
public ::testing::TestWithParam<PatternProviderFeatureState> {
public:
AddressFieldTest() : FormFieldTestBase(GetParam()) {}
AddressFieldTest(const AddressFieldTest&) = delete;
AddressFieldTest& operator=(const AddressFieldTest&) = delete;
protected:
std::unique_ptr<FormField> Parse(AutofillScanner* scanner,
const LanguageCode& page_language) override {
return AddressField::Parse(scanner, page_language, GetActivePatternSource(),
/*log_manager=*/nullptr);
}
};
INSTANTIATE_TEST_SUITE_P(
AddressFieldTest,
AddressFieldTest,
::testing::ValuesIn(PatternProviderFeatureState::All()));
TEST_P(AddressFieldTest, Empty) {
ClassifyAndVerify(ParseResult::NOT_PARSED);
}
TEST_P(AddressFieldTest, NonParse) {
AddTextFormFieldData("", "", UNKNOWN_TYPE);
ClassifyAndVerify(ParseResult::NOT_PARSED);
}
TEST_P(AddressFieldTest, ParseOneLineAddress) {
AddTextFormFieldData("address", "Address", ADDRESS_HOME_LINE1);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseTwoLineAddress) {
AddTextFormFieldData("address", "Address", ADDRESS_HOME_LINE1);
AddTextFormFieldData("address2", "Address", ADDRESS_HOME_LINE2);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseThreeLineAddress) {
AddTextFormFieldData("Address1", "Address Line 1", ADDRESS_HOME_LINE1);
AddTextFormFieldData("Address1", "Address Line 2", ADDRESS_HOME_LINE2);
AddTextFormFieldData("Address1", "Address Line 3", ADDRESS_HOME_LINE3);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseStreetAddressFromTextArea) {
AddFormFieldData("textarea", "address", "Address",
ADDRESS_HOME_STREET_ADDRESS);
ClassifyAndVerify();
}
// Tests that fields are classified as |ADDRESS_HOME_STREET_NAME| and
// |ADDRESS_HOME_HOUSE_NUMBER| when they are labeled accordingly and
// both are present.
TEST_P(AddressFieldTest, ParseStreetNameAndHouseNumber) {
AddTextFormFieldData("street", "Street", ADDRESS_HOME_STREET_NAME);
AddTextFormFieldData("house-number", "House number",
ADDRESS_HOME_HOUSE_NUMBER);
ClassifyAndVerify();
}
// Tests that fields are classified as |ADDRESS_HOME_STREET_NAME|, and
// |ADDRESS_HOME_HOUSE_NUMBER| |ADDRESS_HOME_APT_NUM| when they are labeled
// accordingly and all are present.
TEST_P(AddressFieldTest, ParseStreetNameAndHouseNumberAndApartmentNumber) {
// TODO(crbug.com/1125978): Remove once launched.
base::test::ScopedFeatureList enabled;
enabled.InitAndEnableFeature(
features::kAutofillEnableSupportForApartmentNumbers);
AddTextFormFieldData("street", "Street", ADDRESS_HOME_STREET_NAME);
AddTextFormFieldData("house-number", "House number",
ADDRESS_HOME_HOUSE_NUMBER);
AddTextFormFieldData("apartment", "apartment", ADDRESS_HOME_APT_NUM);
ClassifyAndVerify();
}
// Tests that an address field after a |ADDRESS_HOME_STREET_NAME|,
// |ADDRESS_HOME_HOUSE_NUMBER| combination is classified as
// |ADDRESS_HOME_LINE2| instead of |ADDRESS_HOME_LINE1|.
TEST_P(AddressFieldTest, ParseAsAddressLine2AfterStreetName) {
AddTextFormFieldData("street", "Street", ADDRESS_HOME_STREET_NAME);
AddTextFormFieldData("house-number", "House no.", ADDRESS_HOME_HOUSE_NUMBER);
AddTextFormFieldData("address", "Address", ADDRESS_HOME_LINE2);
ClassifyAndVerify();
}
// Tests that the field is not classified as |ADDRESS_HOME_STREET_NAME| when
// it is labeled accordingly but an adjacent field classified as
// |ADDRESS_HOME_HOUSE_NUMBER| is absent.
TEST_P(AddressFieldTest, NotParseStreetNameWithoutHouseNumber) {
AddTextFormFieldData("street", "Street", ADDRESS_HOME_LINE1);
ClassifyAndVerify();
}
// Tests that the field is not classified as |ADDRESS_HOME_HOUSE_NUMBER| when
// it is labeled accordingly but adjacent field classified as
// |ADDRESS_HOME_STREET_NAME| is absent.
TEST_P(AddressFieldTest, NotParseHouseNumberWithoutStreetName) {
AddTextFormFieldData("house-number", "House number", UNKNOWN_TYPE);
ClassifyAndVerify(ParseResult::NOT_PARSED);
}
// Tests that the dependent locality is correctly classified with
// an unambiguous field name and label.
TEST_P(AddressFieldTest, ParseDependentLocality) {
// TODO(crbug.com/1157405): Remove once launched.
base::test::ScopedFeatureList enabled;
enabled.InitAndEnableFeature(
features::kAutofillEnableDependentLocalityParsing);
AddTextFormFieldData("neighborhood", "Neighborhood",
ADDRESS_HOME_DEPENDENT_LOCALITY);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseCity) {
AddTextFormFieldData("city", "City", ADDRESS_HOME_CITY);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseState) {
AddTextFormFieldData("state", "State", ADDRESS_HOME_STATE);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseZip) {
AddTextFormFieldData("zip", "Zip", ADDRESS_HOME_ZIP);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseZipFileExtension) {
AddTextFormFieldData("filename", "Supported formats: .zip, .rar",
UNKNOWN_TYPE);
ClassifyAndVerify(ParseResult::NOT_PARSED);
}
TEST_P(AddressFieldTest, ParseStateAndZipOneLabel) {
AddTextFormFieldData("state", "State/Province, Zip/Postal Code",
ADDRESS_HOME_STATE);
AddTextFormFieldData("zip", "State/Province, Zip/Postal Code",
ADDRESS_HOME_ZIP);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseCountry) {
AddTextFormFieldData("country", "Country", ADDRESS_HOME_COUNTRY);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseCompany) {
AddTextFormFieldData("company", "Company", COMPANY_NAME);
ClassifyAndVerify();
}
// Tests that the dependent locality, city, state, country and zip-code
// fields are correctly classfied with unambiguous field names and labels.
TEST_P(AddressFieldTest,
ParseDependentLocalityCityStateCountryZipcodeTogether) {
// TODO(crbug.com/1157405): Remove once launched.
base::test::ScopedFeatureList enabled;
enabled.InitAndEnableFeature(
features::kAutofillEnableDependentLocalityParsing);
AddTextFormFieldData("neighborhood", "Neighborhood",
ADDRESS_HOME_DEPENDENT_LOCALITY);
AddTextFormFieldData("city", "City", ADDRESS_HOME_CITY);
AddTextFormFieldData("state", "State", ADDRESS_HOME_STATE);
AddTextFormFieldData("country", "Country", ADDRESS_HOME_COUNTRY);
AddTextFormFieldData("zip", "Zip", ADDRESS_HOME_ZIP);
ClassifyAndVerify();
}
// Tests that the field is classified as |ADDRESS_HOME_COUNTRY| when the field
// contains 'region'.
TEST_P(AddressFieldTest, ParseAmbiguousCountryState) {
// The strings are ambiguous between country and state. Country should be
// preferred.
AddTextFormFieldData("country/region", "asdf", ADDRESS_HOME_COUNTRY);
ClassifyAndVerify();
}
TEST_P(AddressFieldTest, ParseAmbiguousCountryState2) {
// The strings are ambiguous between country and state. Country should be
// preferred.
AddTextFormFieldData("asdf", "country/region", ADDRESS_HOME_COUNTRY);
ClassifyAndVerify();
}
// Tests that city and state fields are classified correctly when their names
// contain keywords for different types. This is achieved by giving the priority
// to the label over the name for pages in Turkish.
TEST_P(AddressFieldTest, ParseTurkishCityStateWithLabelPrecedence) {
// TODO(crbug.com/1156315): Remove once launched.
base::test::ScopedFeatureList enabled;
enabled.InitAndEnableFeature(
features::kAutofillEnableLabelPrecedenceForTurkishAddresses);
AddTextFormFieldData("city", "Il", ADDRESS_HOME_STATE);
AddTextFormFieldData("county", "Ilce", ADDRESS_HOME_CITY);
ClassifyAndVerify(ParseResult::PARSED, LanguageCode("tr"));
}
// Tests that address name is not misclassified as address.
TEST_P(AddressFieldTest, NotParseAddressName) {
AddTextFormFieldData("address", "Adres Başlığı", UNKNOWN_TYPE);
ClassifyAndVerify(ParseResult::NOT_PARSED, LanguageCode("tr"));
}
// Tests that the address components sequence in a label is classified
// as |ADDRESS_HOME_LINE1|.
TEST_P(AddressFieldTest, ParseAddressComponentsSequenceAsAddressLine1) {
AddTextFormFieldData("detail", "Улица, дом, квартира", ADDRESS_HOME_LINE1);
ClassifyAndVerify(ParseResult::PARSED, LanguageCode("ru"));
}
// Tests that the address components sequence in a label is classified
// as |ADDRESS_HOME_STREET_ADDRESS|.
TEST_P(AddressFieldTest, ParseAddressComponentsSequenceAsStreetAddress) {
AddFormFieldData("textarea", "detail",
"Mahalle, sokak, cadde ve diğer bilgilerinizi girin",
ADDRESS_HOME_STREET_ADDRESS);
ClassifyAndVerify(ParseResult::PARSED, LanguageCode("tr"));
}
} // namespace autofill